MyBatisPlus炫技分享

一、MyBatisPlus介绍

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MP区别于JPA,但是又达到了一部分JPA的使用姿势,只需要定义一个接口,就可以实现单表的增删改查。比MyBatis官方提供的代码生成工具效率更提升了很多倍,然后针对多表关联支持不够强大,对于动态条件的拼装,其实也只是把写SQL的工作转到了Java代码而已。
其实还有一种写法,可以做到多表关联,并且也不用根据传入条件,来一个个的构造Wrapper查询条件。

二、炫技代码分享

以下使用方式可能MP作者都没想到,MP还可以这么玩。

  • 多表关联
    MP虽然只支持单表关联,但是表名可以自定义,谁说表名就是一张表的名字了,表名可以是一张视图的名字,甚至是视图的定义。而夺标关联基本上的使用场景也在于关联查询,表与表之间的关系一般情况下是固定的(1对1,1对多,多对多),所以把这层关系抽象成一个视图或者视图的定义,那么查询完全就可以当成对一张表的操作了。
@Data
@TableName(value = "v_my_view")
public class MyView {
    
    
    private String field1OfTable1;
    private String field2OfTable2;
}
@Data
@TableName(value = "my_table1 t1 left join my_table2 t2 on t1.xx_id = t2.id ")
public class MyView {
    
    
    private String field1OfTable1;
    private String field2OfTable2;
}
  • 动态查询条件
    LambdaQueryWrapper对象的生成方法中,是可以传入一个Entity对象的,代表实体类中有设定值的字段会被当成Where条件拼到SQL里面。
public class MyDto {
    
    
    private String code;
    private String name;
}
// 执行SQL: select code, name from my_dto where code = '100';
MyDtoMapper.selectList(Wrappers.<MyDto>lambdaQuery(new MyDto().setCode("100"));

默认的比较条件是 “=”, 如果是其他条件,可以通过@TableFieldcondition 属性指定,MP提供的条件有:

package com.baomidou.mybatisplus.annotation;

/**
* SQL 比较条件常量定义类
*
* @author hubin
* @since 2018-01-05
*/
public class SqlCondition {
    
    
   /**
    * 等于
    */
   public static final String EQUAL = "%s=#{%s}";
   /**
    * 不等于
    */
   public static final String NOT_EQUAL = "%s&lt;&gt;#{%s}";
   /**
    * % 两边 %
    */
   public static final String LIKE = "%s LIKE CONCAT('%%',#{%s},'%%')";

   /**
    * % 两边 % [oracle使用]
    */
   public static final String ORACLE_LIKE = "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')";
   /**
    * % 左
    */
   public static final String LIKE_LEFT = "%s LIKE CONCAT('%%',#{%s})";
   /**
    * 右 %
    */
   public static final String LIKE_RIGHT = "%s LIKE CONCAT(#{%s},'%%')";
}

而我们可以自定义更多:

public interface SqlConditionX {
    
    
   /**
    * IN查询
    */
   String IN = "true <foreach open=\"AND %s in (\" separator=\",\" close=\")\" collection=\"%s\" item=\"item\">#{item}</foreach>";

   /**
    * 小于
    */
   String LT = "%s <![CDATA[<]]> #{%s}";

   /**
    * 小于等于
    */
   String LE = "%s <![CDATA[<=]]> #{%s}";

   /**
    * 大于
    */
   String GT = "%s <![CDATA[>]]> #{%s}";

   /**
    * 大于等于
    */
   String GE = "%s <![CDATA[>=]]> #{%s}";
}

假设需要再传入一个按照code模糊查询的条件, 可以这么定义:

public class MyDto {
    
    
    private String code;
    
    private String name;
    
    @TableField(value = "code", select = false, condition = SqlCondition.LIKE)
    private String codeLike;
    
    @TableField(value = "code", select = false, condition = SqlConditionX.IN)
    private String[] codes;
}
// 执行SQL: select code, name from my_dto where code like '100';
MyDtoMapper.selectList(Wrappers.<MyDto>lambdaQuery(new MyDto().setCodeLike("100"));

// 执行SQL: select code, name from my_dto where code in ('100', '200');
MyDtoMapper.selectList(Wrappers.<MyDto>lambdaQuery(new MyDto().setCodes({
    
    "100","200"}));

三、如何学习高级技术

学习一门新的技术,要把它的核心思想吃透,最终做到灵活运用。

猜你喜欢

转载自blog.csdn.net/qq_39609993/article/details/130933453