Mybatis Plus 基础使用手册(1)

前言

  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 

1.常用注解

@TableName("t_user") // 用于表示实体类对应的数据库表名
public class UserEntity 

@TableId // 主键标识
private int id;
    
@TableField("username") // 当属性名和数据库字段名不匹配时用于表示对应关系
private String name;

2.条件构造器Warpper

  MP种支持单字段,List集合,Map集合,条件构造器作为条件的CRUD操作,其中前三者较为常见,而条件构造器接触较少,故单独做一介绍;
条件构造器包含QueryWarpper和UpdateWarpper,两者功能基本一致,提供eq(等于)、ne(不等于)、gt(大于)、lt(小于)、like、notlike、in、ordreBy等大量的条件判断方法;

-addEq:多个字段对应相等;
allEq(Map params)
allEq((k,v) -> k.indexOf("a") > 0,{id:1,name:"老王",age:null})--->name = '老王' and age is null
-eq:相等;
eq(R column, Object val)
eq("name", "老王")--->name = '老王'
-ne:不相等;
ne(R column, Object val)
ne("name", "老王")--->name <> '老王'
-gt:大于;
gt(R column, Object val)
gt("age", 18)--->age > 18
-ge:大于等于;
ge(R column, Object val)
ge("age", 18)--->age >= 18
-lt:小于;
lt(R column, Object val)
lt("age", 18)--->age < 18
-le:小于等于;
le(R column, Object val)
le("age", 18)--->age <= 18
-between:BETWEEN 值1 AND 值2;
between(R column, Object val1, Object val2)
between("age", 18, 30)--->age between 18 and 30
-notBetween:NOT BETWEEN 值1 AND 值2
notBetween(R column, Object val1, Object val2)
notBetween("age", 18, 30)--->age not between 18 and 30
-like:LIKE ‘%值%’
like(R column, Object val)
like("name", "王")--->name like '%王%'
-notlike:NOT LIKE ‘%值%’
notLike(R column, Object val)
notLike("name", "王")--->name not like '%王%'
-likeLeft :LIKE ‘%值’
likeLeft(R column, Object val)
likeLeft("name", "王")--->name like '%王'
-likeRight:LIKE ‘值%’
likeRight(R column, Object val)
likeRight("name", "王")--->name like '王%'
-isNull:字段 IS NULL
isNull(R column)
isNull(boolean condition, R column)
-isNotNull:字段 IS NOT NULL
isNotNull(R column)
isNotNull("name")--->name is not null
-in:字段 IN (value.get(0), value.get(1), …)
in(R column, Collection value)
in("age",{1,2,3})--->age in (1,2,3)
-notIn:字段 notIn (value.get(0), value.get(1), …)
notIn(R column, Collection value)
notIn("age",{1,2,3})--->age not in (1,2,3)
-inSql:字段 IN ( sql语句 )
inSql(R column, String inValue)
inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
-notInSql:NOT IN ( sql语句 )
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:GROUP BY 字段, …
groupBy(R... columns)
groupBy("id", "name")--->group by id,name
-orderByAsc:ORDER BY 字段, … ASC
orderByAsc(R... columns)
orderByAsc("id", "name")--->order by id ASC,name ASC
-orderByDesc:ORDER BY 字段, … DESC
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);

3.添加

- int insert(T entity)

  传入对象即可完成添加,返回操作条数

4.删除

- int deleteById(Serializable id)

  通过id进行删除,返回操作条数

- int deleteByMap(Map columnMap)

  通过Map集合进行删除,返回操作条数,map集合为键为表的字段,值为字段所对应的值,后面所有Map用法相同,不做赘述;


Map  map = new HashMap<>();
map.put("username","musi");
map.put("age",26);
int result = userDao.deleteByMap(map);
-int delete( Wrapper wrapper)

  通过条件构造器进行删除

QueryWrapper wrapper = new QueryWrapper<>();
wrapper.inSql("age","35,25");
int result =  userDao.delete(wrapper);
-int deleteBatchIds( Collection idList)

  通过id集合批量删除;

List ids = Arrays.asList(13,12);
int result = userDao.deleteBatchIds(ids);

5.修改

-int updateById(T t)

  传入修改对象实例

-int update( T t,Wrapper updateWrapper);

  根据条件构造器修改

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);

6.查询

- T selectById(Serializable id)

  根据id查询单个对象

-List selectBatchIds(Collection idList);

  通过id集合查询对象集合

-List selectByMap(Map columnMap);

  根据map集合查询对象集合,用法与前文map集合用法相同

-UserEntity selectOne( Wrapper queryWrapper)

  条件构造器查询,查询单个对象,用法与前文条件构造器用法相同

- Integer selectCount(Wrapper queryWrapper);

  条件构造器查询,查询符合条件对象数量,条件构造器用法与前文相同

-List selectList( Wrapper queryWrapper)

  条件构造器查询,查询对象集合,,条件构造器用法与前文相同

-List> selectMaps(Wrapper queryWrapper);

  该查询返回的是以map集合为对象的集合,不是对象的集合,用法一致

QueryWrapper  wrapper = new QueryWrapper<>();
wrapper.likeRight("username","张");
List> maps = userDao.selectMaps(wrapper);
-List selectObjs( Wrapper queryWrapper)

  查询对象集合

-IPage selectPage(IPage page, Wrapper queryWrapper)

  分页查询,返回一个分页对象,包含该对象包含总条数、当前页数、每页显示条数、查询记录集合等参数

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);

-IPage> selectMapsPage(IPage page, Wrapper queryWrapper)

  与上面方法用法一致,仅返回对象类型不同

7.自定义方法

  MP支持书写sql语句,即可以根据需求自定义方法,但是如果在自定义方法时希望用到条件构造器,MP也为我们提供了方法;

 @Select("select * from t_user ${ew.customSqlSegment}")
    public List getAll(@Param(Constants.WRAPPER) Wrapper wrapper);

  使用上面的注解和标识即可在我们自定义方法中引入条件构造器了

你可能感兴趣的:(框架)