乐趣区

关于java:MyBatis-增强-byId-查询

加强 byId 查问

  • 关系表中应用 id 作为外键进行绑定. 有时候查问一个实体对象须要在 sql 中连贯很多层 left join. 为了少些一些. 有这样一个想法: 是否能够通过一些注解和一个专用办法间接返回.
  • 先做几个表作为测试用.
  • first_model
id name
1 第一蒜素
  • second_model
id name first_id
1 第二元素 1
  • total_model
id first_id id
1 1 1
  • 实体对象

    public class FirstModel {     private String name;
    private Integer id; }   public class SecondModel {
        private Integer id;
    private String name; private Integer firstId; }   public class TotalModel {private Integer id;
  • 上述对象是根本的实体对象. 比方查问 second_model id=1 想要获取first_model 的数据须要做一个left join 而后组装出一个新的对象. 或者应用 one to more 或者 one to one 等其余的关系标签,配置上绝对麻烦.

先来做第一个尝试 将 second_mode 的查问. 编写如下代码

public class SecondModel {private Integer id; private String name; private Integer firstId; private FirstModel firstModel;}
  • 心愿是将 FirstModel 填充到字段中.
  • 开发思维

    1. 这个表外面须要有一个能够查问外联对象的主键. (外键)
    2. 须要有一个查询方法. 通过外键能够查问.
    3. 须要有一个指定的 mapper
  • 在这些元素绑定后能够定义出一个注解.

    * 外键
       *
    * @return 外键字段名称

String foreignKey(); /**

  • 查问函数, 在 mapper 上. 如果不填则应用 selectById
    • @return 查问实体的函数
      */

String queryMethod() default “”; /**

  • mapper @return mapper class / Class<?> mapper(); /**
  • 外键类型
  • @return 外键类型
    */

Class<?> idType() default Integer.class;} `

  • 在思维确定后接下来就是解析.
  1. 找到注解

    1. 找到 mapper
    2. 执行办法
    3. 对有注解的字段赋值
  • 赋值后果如下
  • 这是一个一层对象的赋值. 如果呈现多层的对象赋值如何解决? 通过递归的形式进行解决.
  • 定义一个 total_model 的拓展对象
public class TotalEnhance extends TotalModel {@ByIdEnhance(foreignKey = "firstId", mapper = FirstModelMapper.class, queryMethod = "selectById") private FirstModel firstModel;
 @ByIdEnhance(foreignKey = "secondId", mapper = SecondModelMapper.class, queryMethod = "findById") private SecondModel secondModel;}

  • 源码地址: https://github.com/huifer/cru…
退出移动版