ORM Bee多表关联查询, 用List和不用List的区别
Tables表:
Columns表:
在Columns表添加一条记录:
public class Tables implements Serializable {
private static final long serialVersionUID = 1592797891739L;
private Integer tableId;
private String tableName;
@JoinTable(mainField="table_id", subField="table_id",subClass="Columns", joinType=JoinType.JOIN)
private Columns columns;
// private List<Columns> list;
//...set, get
public String toString(){
StringBuffer str=new StringBuffer();
str.append("Tables[");
str.append("tableId=").append(tableId);
str.append(",tableName=").append(tableName);
if(columns==null) {
// str.append(",list").append("=null");
}else {
str.append(",").append(columns.toString());
}
str.append("]");
return str.toString();
}
}
public class Columns implements Serializable {
private static final long serialVersionUID = 1596238224595L;
private Integer tableId;
private Integer columnId;
private String columnName;
//... get, set
public String toString(){
StringBuffer str=new StringBuffer();
str.append("Columns[");
str.append("tableId=").append(tableId);
str.append(",columnId=").append(columnId);
str.append(",columnName=").append(columnName);
str.append("]");
return str.toString();
}
}
运行,得到以下日志:
[Bee] LoggerFactory Use the Logger is : org.teasoft.honey.logging.SystemLogger
[INFO] [Bee] ========= get the dbName from the Connection is :MySQL
[INFO] [Bee] select SQL: select table_id,table_name from tables where table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select table_id,table_name from tables where table_id=1
[INFO] [Bee] | <-- select rows: 1
[Tables[tableId=1,tableName=t1]]
[INFO] [Bee] select SQL: select table_id,column_id,column_name from columns where table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select table_id,column_id,column_name from columns where table_id=1
[INFO] [Bee] | <-- select rows: 2
[Columns[tableId=1,columnId=1,columnName=c1], Columns[tableId=1,columnId=2,columnName=C2]]
[INFO] [Bee] select SQL: select tables.table_id,tables.table_name,columns.table_id,columns.column_id,columns.column_name from tables,columns where tables.table_id=columns.table_id and tables.table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select tables.table_id,tables.table_name,columns.table_id,columns.column_id,columns.column_name from tables,columns where tables.table_id=columns.table_id and tables.table_id=1
[INFO] [Bee] | <-- select rows: 2
[Tables[tableId=1,tableName=t1,Columns[tableId=1,columnId=1,columnName=c1]], Tables[tableId=1,tableName=t1,Columns[tableId=1,columnId=2,columnName=C2]]]
用数据库客户端查询:
得到两条记录, 和用Bee查询回来的是一样的.
一行记录,对应一个实体对象.
[Tables[tableId=1,tableName=t1,Columns[tableId=1,columnId=1,columnName=c1]], Tables[tableId=1,tableName=t1,Columns[tableId=1,columnId=2,columnName=C2]]]
下面再来看下,用List的情况, 看下用List和不用List的区别;
在Tables类,主要修改以下代码:
@JoinTable(mainField="table_id", subField="table_id",subClass="Columns", joinType=JoinType.JOIN)
// private Columns columns;
private List<Columns> list;
public class Tables implements Serializable {
private static final long serialVersionUID = 1592797891739L;
private Integer tableId;
private String tableName;
@JoinTable(mainField="table_id", subField="table_id",subClass="Columns", joinType=JoinType.JOIN)
private List<Columns> list;
//注解里subClass属性,当两个实体在同一个包,包名,是可以省略的.
//...get ,set
public String toString(){
StringBuffer str=new StringBuffer();
str.append("Tables[");
str.append("tableId=").append(tableId);
str.append(",tableName=").append(tableName);
if(list==null) {
// str.append(",list").append("=null");
}else {
str.append(",").append(list.toString());
}
str.append("]");
return str.toString();
}
}
,然后运行:
[Bee] LoggerFactory Use the Logger is : org.teasoft.honey.logging.SystemLogger
[INFO] [Bee] ========= get the dbName from the Connection is :MySQL
[INFO] [Bee] select SQL: select table_id,table_name from tables where table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select table_id,table_name from tables where table_id=1
[INFO] [Bee] | <-- select rows: 1
[Tables[tableId=1,tableName=t1]]
[INFO] [Bee] select SQL: select table_id,column_id,column_name from columns where table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select table_id,column_id,column_name from columns where table_id=1
[INFO] [Bee] | <-- select rows: 2
[Columns[tableId=1,columnId=1,columnName=c1], Columns[tableId=1,columnId=2,columnName=C2]]
[INFO] [Bee] select SQL: select tables.table_id,tables.table_name,columns.table_id,columns.column_id,columns.column_name from tables,columns where tables.table_id=columns.table_id and tables.table_id=? [values]: 1
[INFO] [Bee] select SQL: ( ExecutableSql )
select tables.table_id,tables.table_name,columns.table_id,columns.column_id,columns.column_name from tables,columns where tables.table_id=columns.table_id and tables.table_id=1
[INFO] [Bee] | <-- ( select raw record rows: 2 )
[INFO] [Bee] | <-- select rows: 1
[Tables[tableId=1,tableName=t1,[Columns[tableId=1,columnId=1,columnName=c1], Columns[tableId=1,columnId=2,columnName=C2]]]]
一条主数据里,关联了一个List, 而List里有两条数据.
Bee自动, 帮我们将同一条主表数据关联的从表数据放到List里了.
另个, 当我们只想查Tables实体的数据, 不想用多表关系, 就可以用Suid接口, Suid默认会忽略关联注解@JoinTable, 这样,可以提高查询效率, 也不用重新另外定义实体.
注: 从表用List类型, 从V1.9.8开始.
另外, 导入bee.jar, honey.jar(或maven方式),
bee.properties里配置数据库连接连接信息.