美文网首页
王黎聪-GreenDAO 3笔记-2

王黎聪-GreenDAO 3笔记-2

作者: 王黎聪 | 来源:发表于2018-05-14 19:00 被阅读55次

    序言

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


    目录

    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<AreaEntity> childrenAreaEntitys;  //下一级区域 ,需要判断null 和 size>0
    }
    
    Sync Project with Gradle Files.png
        //然后就会生成很多代码. 其中就包括以下 两个方法
        @Generated(hash = 1361814359)
        public AreaEntity getParentAreaEntity() {...} //获取区域的上级区域,
    
        @Generated(hash = 1859021849)
        public List<AreaEntity> 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<AreaEntity> 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<StudentEntity> 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<TeacherEntity> 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<StudentEntity> 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 > 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

          本文链接:https://www.haomeiwen.com/subject/iusufxtx.html