作者:vivo互联网服务器团队-Li Lei
一、背景
@Select(" SELECT p.id ,p.name ,p.picture ,p.type ,p.price, p.type, p.time
FROM product p where id = #{id} ")
List<Product> getProductsBYId(@Param("id") Integer id);
@Select(" SELECT o.id ,o.pay_no ,o.user_id ,o.product_id ,o.pay_price, o.num, o.pay_time, o.order_type, o.notif_type
FROM order o where id = #{id} ")
List<Order> getOrderBYId(@Param("id") Integer id);
@Select(" SELECT o.id ,o.pay_no ,o.user_id ,o.product_id ,o.pay_price, o.num, o.pay_time, o.order_type, o.notif_type
FROM order o where order_type= #{orderType} ")
List<Order> getOrderBYId(@Param("orderType") Integer orderType);
@Select(" SELECT o.id ,o.pay_no ,o.user_id ,o.product_id ,o.pay_price, o.num, o.pay_time, o.order_type, o.notif_type
FROM order o where notify_type= #{notifyType} ")
List<Order> getOrderBYId(@Param("notifyType") Integer notifyType);
需求a:对于不同的实体类,即使查询的目的一致,仍然需要重复构造类似的sql语句,仅仅是表字段和表信息不同。
需求b:对于相似的查询条件,针对某个单一场景必须构造不同的sql,造成sql语句的大量冗余。
需求c:将dao层所有涉及到新增字段的sql都需要修改一遍,这个过程比较繁琐且容易出错。
public interface ProductMapper extends BaseMapper<Product> {
}
public interface OrderMapper extends BaseMapper<Order> {
}
productMapper.selectById(1);
orderMapper.selectById(1);
orderMapper.selectList(new QueryWrapper<Order>().eq("orderType",2));
orderMapper.selectList(new QueryWrapper<Order>().eq("notifyType",1));
二、准备工作
三、SQL语句存储在哪里?
四、SQL语句是什么时候注入的?
4.1 AbstractMethod.addMappedStatement
五、SQL语句是怎么生成的?
BaseMapper中的方法名;
方法名对应的sql语句模板(即被<scripe>标签包裹的字符串)。
六、mapper文件被添加的过程
七、总结
1)实体类和数据库表通过自定义注解来完成一一映射。 2)对象属性和字段同样使用注解来一一对应(命名注意要相同)。 3)为了提高复用性使得具体的mapper继承通用的增删改查接口。 4)利用模板方法和对象属性值动态拼接SQL。
八、参考文档
END
猜你喜欢