mybatis plus(后简称MP),是对mybatis的一个增强工具,使用MP不影响mybatis的基本使用,使用与JPA类似,目的为简化开发,提升效率。
使用spring boot 集成,只需要在pom.xml中加入MP的依赖包,需要注意的是,引入MP时不需要再引入mybatis,以免引起版本冲突
com.baomidou
mybatis-plus-boot-starter
3.1.1
MP提供了很多的配置选项,这里我们只配置基础配置,更多配置及进阶配置,可以查看官网手册 mybatis plus官网
在springboot中,配置书写在application.properties中
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=tt123456
mybatis-plus.type-aliases-package=com.lovo.entity
mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
在MP中内置了分页插件,需要通过java类的方式进行配置,可以在工程下建一个config的包,再建一个MybatisPlusConfig配置文件,该文件直接复制即可,不做更改
@Configuration
public class MybatisPlusConfig {
/**
* mybatis-plus分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
}
MP内置了基本的CRUD,条件查询,分页等操作,可以极大简化单表操作效率;
首先,MP中提供了代码生成器功能,可以直接使用该工具生成mapper,controller,Entity,Service类,但生成的类仅有类名和一些继承关系,感觉用处不是很大,并且生成的诸如实体类,由于MP自己的映射关系,生成的字段不便于阅读,故建议不采用此功能
然后,MP中提供了两类CRUD接口,一类是Mapper接口,一类是service接口,两者功能相似,service接口实则是对mapper接口方法的调用和封装,因此,本文只介绍mapper接口使用方法,service接口方法可自行查阅官网文档;
Mapper接口方法的使用仅需要集成BaseMapper接口,就可以使用MP为我们提供的方法;
public interface UserMapper extends SqlMapper, BaseMapper
@TableName("t_user") // 用于表示实体类对应的数据库表名
public class UserEntity
@TableId // 主键标识
private int id;
@TableField("username") // 当属性名和数据库字段名不匹配时用于表示对应关系
private String name;
MP种支持单字段,List集合,Map集合,条件构造器作为条件的CRUD操作,其中前三者较为常见,而条件构造器接触较少,故单独做一介绍;
条件构造器包含QueryWarpper和UpdateWarpper,两者功能基本一致,提供eq(等于)、ne(不等于)、gt(大于)、lt(小于)、like、notlike、in、ordreBy等大量的条件判断方法;
allEq(Map params)
allEq((k,v) -> k.indexOf("a") > 0,{id:1,name:"老王",age:null})--->name = '老王' and age is null
eq(R column, Object val)
eq("name", "老王")--->name = '老王'
ne(R column, Object val)
ne("name", "老王")--->name <> '老王'
gt(R column, Object val)
gt("age", 18)--->age > 18
ge(R column, Object val)
ge("age", 18)--->age >= 18
lt(R column, Object val)
lt("age", 18)--->age < 18
le(R column, Object val)
le("age", 18)--->age <= 18
between(R column, Object val1, Object val2)
between("age", 18, 30)--->age between 18 and 30
notBetween(R column, Object val1, Object val2)
notBetween("age", 18, 30)--->age not between 18 and 30
like(R column, Object val)
like("name", "王")--->name like '%王%'
notLike(R column, Object val)
notLike("name", "王")--->name not like '%王%'
likeLeft(R column, Object val)
likeLeft("name", "王")--->name like '%王'
likeRight(R column, Object val)
likeRight("name", "王")--->name like '王%'
isNull(R column)
isNull(boolean condition, R column)
isNotNull(R column)
isNotNull("name")--->name is not null
in(R column, Collection> value)
in("age",{1,2,3})--->age in (1,2,3)
notIn(R column, Collection> value)
notIn("age",{1,2,3})--->age not in (1,2,3)
inSql(R column, String inValue)
inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
notInSql(R column, String inValue)
notInSql("id", "select id from table where id < 3")--->age not in (select id from table where id < 3)
groupBy(R... columns)
groupBy("id", "name")--->group by id,name
orderByAsc(R... columns)
orderByAsc("id", "name")--->order by id ASC,name ASC
orderByDesc(R... columns)
orderByDesc("id", "name")--->order by id DESC,name DESC
注:上述条件方法均含有一个默认值为true的参数,表示该条件会拼接到SQL语句中,如传一个false,则该条件不会拼接到SQL中,在动态条件查询时,可以传入StringUtils.isNotEmpty(参数)来动态拼接sql语句;更多条件方法可上官网了解详情
QueryWrapper wrapper = new QueryWrapper<>();
QueryWrapper wrapper = Warppers.query();
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.likeRight("username","张")
.between("age",20,40)
.isNotNull("email")
.select(UserEntity.class,query->!query.getColumn().equals("password"));
List users = userDao.selectList(wrapper);
users.forEach(System.out::println);
传入对象即可完成添加,返回操作条数
通过id进行删除,返回操作条数
通过Map集合进行删除,返回操作条数,map集合为键为表的字段,值为字段所对应的值,后面所有Map用法相同,不做赘述;
Map map = new HashMap<>();
map.put("username","musi");
map.put("age",26);
int result = userDao.deleteByMap(map);
通过条件构造器进行删除
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.inSql("age","35,25");
int result = userDao.delete(wrapper);
通过id集合批量删除;
List ids = Arrays.asList(13,12);
int result = userDao.deleteBatchIds(ids);
传入修改对象实例
根据条件构造器修改
UserEntity user = userDao.selectById(2);
user.setName("田七");
user.setAge(30);
UpdateWrapper update = new UpdateWrapper<>();
update.eq("age",20).eq("username","赵六");
int result= userDao.update(user,update);
根据id查询单个对象
通过id集合查询对象集合
根据map集合查询对象集合,用法与前文map集合用法相同
条件构造器查询,查询单个对象,用法与前文条件构造器用法相同
条件构造器查询,查询符合条件对象数量,条件构造器用法与前文相同
条件构造器查询,查询对象集合,,条件构造器用法与前文相同
该查询返回的是以map集合为对象的集合,不是对象的集合,用法一致
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.likeRight("username","张");
List
查询对象集合
分页查询,返回一个分页对象,包含该对象包含总条数、当前页数、每页显示条数、查询记录集合等参数
Page page = new Page(1,2);
QueryWrapper wrapper= new QueryWrapper<>();
String username = "田";
String email = "";
wrapper.like(StringUtils.isNotEmpty(username),"username",username)
.like(StringUtils.isNotEmpty(email),"email",email)
.select("username","age");
IPage page1 = userDao.selectPage(page, wrapper);
与上面方法用法一致,仅返回对象类型不同
MP支持书写sql语句,即可以根据需求自定义方法,但是如果在自定义方法时希望用到条件构造器,MP也为我们提供了方法;
@Select("select * from t_user ${ew.customSqlSegment}")
public List getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
使用上面的注解和标识即可在我们自定义方法中引入条件构造器了