王黎聪-GreenDAO 3笔记-2

序言

最近工作较忙,没有及时更新,但是在这段时间又成长进步了很多,现在回过头继续完善一下之前未完成的笔记。现在总结就是工作要做专精,投入,要分享,从中得到快乐。


目录

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
}
Sync Project with Gradle Files.png
    //然后就会生成很多代码. 其中就包括以下 两个方法
    @Generated(hash = 1361814359)
    public AreaEntity getParentAreaEntity() {...} //获取区域的上级区域,

    @Generated(hash = 1859021849)
    public List getChildrenAreaEntitys() {..}//获取区域的下级区域,
      百度搜的数据
image.png

区域数据已经插入好了,此处省略添加数据的代码了。 数据 在百度上能搜到 地区表数据。


举例说明.png
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 用法

image.png
image.png
上图数据可以看出
  教师 可以有多个 学生;
  学生 可以有多个 教师;
关系表 统计 学生和老师的关系 , 也就是中间表
// 实体代码 

    @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
    }

image.png

//-------------举例展示 --------------------------------------------

//通过 上一个笔记 封装的 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


详细记录 如何 操作 ,我写到下一篇笔记中

谢谢

你可能感兴趣的:(王黎聪-GreenDAO 3笔记-2)