序言
最近工作较忙,没有及时更新,但是在这段时间又成长进步了很多,现在回过头继续完善一下之前未完成的笔记。现在总结就是工作要做专精,投入,要分享,从中得到快乐。
目录
1.关系映射(一对多,多对一)
2.关联查询
3.树型结构遍历
地区表实体
@Entity //地区表实体类
public class AreaEntity {
@Id
@Property(nameInDb = "id")
private Long id; //地区ID
@Property(nameInDb = "pid")
private Long pid; //上一级地区ID
@Property(nameInDb = "fullname")
private String fullname; //区域名称
@ToOne(joinProperty = "pid") //这里的@ToOne 是指定本对象的pid 去查找下面声明实体对象的 ID 只能找回一个
private AreaEntity parentAreaEntity; //上一级区域 ,需要判断null
@ToMany(referencedJoinProperty = "pid")//这里的@ToMany 是指定本对象的id 去查找下面声明实体对象的pid 能找回多个
private List childrenAreaEntitys; //下一级区域 ,需要判断null 和 size>0
}
//然后就会生成很多代码. 其中就包括以下 两个方法
@Generated(hash = 1361814359)
public AreaEntity getParentAreaEntity() {...} //获取区域的上级区域,
@Generated(hash = 1859021849)
public List getChildrenAreaEntitys() {..}//获取区域的下级区域,
百度搜的数据
区域数据已经插入好了,此处省略添加数据的代码了。 数据 在百度上能搜到 地区表数据。
QueryBuilder.LOG_SQL=true; //设置打印SQL 语句
QueryBuilder.LOG_VALUES=true; //设置打印传入值
/**
如果应用初始化 设置了
QueryBuilder.LOG_SQL=true; //设置打印SQL 语句
QueryBuilder.LOG_VALUES=true; //设置打印传入值
就能看到 查询的时候,具体使用的 SQL 语句了
*/
//通过 上一个笔记 封装的 CRUD 工具类 查出 石家庄地区
AreaEntity areaEntity = new MainDatabase().getAreaEntityCRUD().getAreaEntity(130100);
//---------------------------------------------------------
//获取 上级 地区 , 这个实体 需要 判断null
AreaEntity parentAreaEntity = areaEntity.getParentAreaEntity();
//打印 上级地区
System.out.println("上级地区==" + parentAreaEntity.toString());
//打印结果 >>>>>> 上级地区==AreaEntity{id=130000, pid=0, fullname='河北省}
//GreenDao 其实生成了 这一句SQL: SELECT T."id",T."pid",T."fullname" FROM "AreaEntity" T WHERE T."id"=?
//id=? 就是 石家庄的 pid
//-------------------------------------------------------------------------
//获取 下级 地区
List childrenAreaEntitys = areaEntity.getChildrenAreaEntitys();
//打印 下级地区
for (AreaEntity childrenAreaEntity : childrenAreaEntitys) {
System.out.println("下级地区==" + childrenAreaEntity.toString());
}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130102, pid=130100, fullname="长安区"}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130104, pid=130100, fullname="桥西区"}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130105, pid=130100, fullname="新华区"}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130107, pid=130100, fullname="井陉矿区"}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130108, pid=130100, fullname="裕华区"}
//打印结果 >>>>>> 下级地区==AreaEntity{id=130109, pid=130100, fullname="藁城区"}...等
//GreenDao 其实生成了 这一句SQL: SELECT T."id",T."pid",T."fullname" FROM "AreaEntity" T WHERE T."pid"=?
//pid=? 就是 石家庄的 id
@ToMany 其他用法
/*
@ToMany(referencedJoinProperty = "pid")
和
@ToMany(joinProperties = {@JoinProperty(name = "id", referencedName = "pid")})
是一个效果
name="id" 是代表 本对象的id,
referencedName = "pid" 是代表 要查找对象的 pid
将id 和 pid 关联;
SQL语句如下: SELECT T."id",T."pid",T."fullname" FROM "AreaEntity" T WHERE T."pid"=?
多主键 关联 可以这么写
@ToMany(
joinProperties = {
@JoinProperty(name = "id_a", referencedName = "pid_a"),
@JoinProperty(name = "id_b", referencedName = "pid_b")
})
SQL语句如下: SELECT * FROM "表名" WHERE "pid_a"=? AND "pid_b"=?
*/
@ToMany + @JoinEntity 用法
上图数据可以看出
教师 可以有多个 学生;
学生 可以有多个 教师;
关系表 统计 学生和老师的关系 , 也就是中间表
// 实体代码
@Entity //教师 实体表
public class TeacherEntity {
@Id
@Property(nameInDb = "tId") //设置表里的 id 字段名
private Long tId; //教师ID
private String tName; //教师姓名
@ToMany //中间表 发挥作用的地方
@JoinEntity(entity = RelationEntity.class, sourceProperty = "tId", targetProperty = "sId")
private List studentEntityList;
}
@Entity //学生 实体表
public class StudentEntity {
@Id
@Property(nameInDb = "sId") //设置表里的 id 字段名
private Long sId; //学生ID
private String sName; //学生姓名
@ToMany //中间表 发挥作用的地方
@JoinEntity(entity = RelationEntity.class, sourceProperty = "sId", targetProperty = "tId")
private List teacherEntityList;
}
@Entity //关系 实体表
public class RelationEntity {
@Id
private Long rId; //关系ID
@Property(nameInDb = "tId") //设置表里的 id 字段名
private long tId; //教师ID
@Property(nameInDb = "sId") //设置表里的 id 字段名
private long sId; //学生ID
}
//-------------举例展示 --------------------------------------------
//通过 上一个笔记 封装的 CRUD 工具类 查出 教师实体
TeacherEntity teacherEntity= new MainDatabase().getTeacherEntityCRUD().getTeacherEntity(101L);
//获取 这个教师所有的 学生
List studentEntityList = teacherEntity.getStudentEntityList();
//拿到了这个 教师的 所有学生
//GreenDao 其实生成了 这一句SQL:
//SELECT T."sId",T."S_NAME" FROM "STUDENT_ENTITY" T JOIN RELATION_ENTITY J1 ON T."sId"=J1."sId" WHERE J1."tId"=?
//-----同理可得查学生的老师--------------------------------------------------------------------
//通过 上一个笔记 封装的 CRUD 工具类 查出 学生实体
StudentEntity studentEntity= new MainDatabase().getStudentEntityCRUD().getStudentEntity(1001L);
//获取 这个教师所有的 学生
List teacherEntity List = studentEntity.getTeacherEntityList();
//拿到了这个 学生的 所有教师
//GreenDao 其实生成了 这一句SQL:
//SELECT T."tId",T."T_NAME" FROM "TEACHER_ENTITY" T JOIN RELATION_ENTITY J1 ON T."tId"=J1."tId" WHERE J1."sId"=?
注意 , 调用 @ToOne ,@ToMany 生成出来的代码 , 有个 前提, 这个对象是查询出来的,不是new 出来的。
树型结构遍历
我能用到的 两种方法
一 、 multimap递归查询
是将 数据 查询到 multimap中, 然后 写个递归 方法 开始遍历 ;
二 、 sql语句递归查询
使用 sqlite3的递归语法 with recursive ;
但是 这个 语法 只支持 sqlite3 — 3.8.x之后版本 ,之前版本 会 报错 syntax error
详细记录 如何 操作 ,我写到下一篇笔记中
谢谢