一、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"));
默认的比较条件是 “=”, 如果是其他条件,可以通过@TableField
的condition
属性指定,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<>#{%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"}));
三、如何学习高级技术
学习一门新的技术,要把它的核心思想吃透,最终做到灵活运用。