java吧 关注:1,252,586贴子:12,738,744

回复:学习记录贴,从零造一个简单db库。

只看楼主收藏回复

厉害


IP属地:广东来自Android客户端18楼2020-11-25 21:58
回复
    看过 Spring data jpg 根据方法名 就搞过类似的 不过楼主这个更好用


    IP属地:安徽来自iPhone客户端19楼2020-11-25 21:58
    收起回复
      666


      IP属地:江苏来自iPhone客户端20楼2020-11-26 11:04
      回复
        顶顶


        IP属地:上海21楼2020-11-26 16:03
        回复


          IP属地:四川22楼2020-11-26 16:10
          回复
            🐮🐮🐮


            IP属地:广东来自Android客户端23楼2020-11-26 18:05
            回复
              楼主咱不更了呢?继续啊。


              IP属地:浙江来自Android客户端24楼2020-11-27 10:35
              收起回复
                继续开始更。
                回顾之前的能力,我们做到的什么呢?
                单表,多表的join动态sql拼接,
                单表,多表的join聚合。
                在这里,我们抽象个概念,sql实体。
                定义,类加了JoinTable或者JoinTableList 注解的,都是sql字段
                sql字段,加了JoinField 字段的,简称sql字段。


                IP属地:马来西亚25楼2020-11-27 20:21
                回复
                  我们观察下,mybatis 之类的框架,他们有个实体概念
                  叫做,一对一,一对多概念
                  在传统的写法里,我们是怎么写的呢?
                  我们会写2个方法,在其中一个方法里,调用另外一个方法,完成一对多之类的数据注入
                  也就是说,复杂度,比之前复杂了。


                  IP属地:马来西亚26楼2020-11-27 20:24
                  回复
                    我们举个例子,部门,用户,一个部门下面有多个用户
                    假设有sys_user 用户表,sys_dept部门表。
                    我们定义sql实体
                    用户实体

                    部门实体

                    我们看到了一个新的注解
                    JoinQuery,我们定义,提示一个自动查询,根据当前实体,自动做数据注入用的。
                    他在查询sys_user 的sql ,应该是,from sys_user where sys_dept_id = #{id}
                    #{id} 当前实体的id值
                    他是实现自动一对一,一对多概念用的。


                    IP属地:马来西亚27楼2020-11-27 20:34
                    回复
                      这个玩意,实现起来有点复杂的。改天再实现
                      我们看点简单的,jpa 哪里,有个方法名即sql。
                      这个概念,在某些查询非常有用。
                      我们实现他试试看
                      我们定义前缀,findBy 无意义前缀
                      条件判别式
                      ${Key} ${Where}
                      ${key} sql实体字段名 ${where} 查询条件别名
                      多个条件判别式,用And Or 链接
                      拿用户表做演示
                      根据账号查询用户信息
                      SysUser findByUsernameEq(String username);
                      根据账号密码查询用户
                      SysUser findByUsernameEqAndPasswordEq(String username,String password);
                      //查询部门下面的用户
                      List<SysUser> findBySysUserDeptIdEq(String sysDeptId);


                      IP属地:马来西亚28楼2020-11-27 20:42
                      回复
                        方法名怎么解析呢?
                        我们先设计一个Wrapper,他是根据方法名称做解析的
                        fingByUsernameEqAndPasswordEq
                        这个我们要做字符串分解,根据And关键字分割
                        也就是用正则实现


                        IP属地:马来西亚29楼2020-11-27 22:02
                        回复
                          编写单元测试

                          运行效果如下

                          看起来,和实体类差不多的,但多了灵活性


                          IP属地:马来西亚30楼2020-11-27 22:26
                          回复
                            前面,基本把查询相关的,都实现了。
                            现在把更新相关的实现一下。
                            更新分为
                            插入
                            修改
                            删除
                            3种类型
                            插入,删除都是简单类型的,实现起来也比较简单。
                            修改复杂点,分情况讨论
                            1:字段被JoinPrimary 修饰的
                            2:字段被JoinWhere 修饰的
                            当修改操作发生时,所有JoinPrimary 的字段都有值,则它们已经唯一定位了数据。
                            此时,被JoinWhere 的字段哪怕有值,也不会作为条件
                            如果JoinPrimary 字段,存在至少一个没有值,则所有JoinWhere字段都作为条件的一部分


                            IP属地:马来西亚31楼2020-11-28 20:37
                            回复
                              我们拿sys_user做例子演示,并且实现一个简单的乐观锁
                              id 主键
                              version 版本号,每次更新,都会+1

                              编写测试

                              运行的效果,生成的sql和预想一致


                              IP属地:马来西亚32楼2020-11-28 21:04
                              回复