MybatisPlus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。
建议单表使用MybatisPlus,多表使用Mybatis
快速构建MybatisPlus
<!--mybatisplus启动器,传递依赖了JDBC启动器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency><!--mysql驱动,覆盖父工程的版本号--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
# datasourcespring:datasource:url: jdbc:mysql://localhost:3306/mp# localhost:3306改成自己的数据库地址username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivermybatis-plus:global-config:db-config:# 表名前缀,设置后,如果数据库表名是tb_user, 那么实体类上可以不添加@TableName注解,不建议这里统一设置table-prefix: tb_# 全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置, 不建议这里统一设置id-type: autotype-aliases-package: com.halulu.pojoconfiguration:# 日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
@TableName()指的表名
@TableName("tb_user")@DatapublicclassUser{// 设置id生成策略:AUTO,数据库主键自增@TableId(type=IdType.AUTO)privateLong id;// @TableField("user-name")privateString userName;privateString password;privateString name;privateInteger age;privateString email;// 不希望该值存入数据库@TableField(exist=false)privateString info;}
需要实现BaseMapper接口
/**
* 使用mp定义Mapper,需要让Mapper接口继承 BaseMapper接口。
*/publicinterfaceUserMapperextendsBaseMapper<User>{}
BaseMapper接口内置许多单表操作的方法
1、增加
@RunWith(SpringRunner.class)@SpringBootTestpublicclassUserMapperTest{@AutowiredprivateUserMapper userMapper;@Testpublicvoidinsert(){User user=newUser();
user.setUserName("张三");
user.setPassword("123124");
user.setName("zhansan");
user.setAge(12);
user.setEmail("123424@123.com");
user.setInfo("张三的信息");int count= userMapper.insert(user);System.out.println(count);}}
2、删除
根据id删除
@TestpublicvoiddeleteById(){int count= userMapper.deleteById(6L);System.out.println(count);}
根据id批量删除
@TestpublicvoiddeleteBatchIds(){ArrayList<Long> list=newArrayList<>();
list.add(7L);
list.add(5L);
userMapper.deleteBatchIds(list);}
根据map条件删除
@TestpublicvoiddeleteMap(){Map<String,Object> map=newHashMap<>();//key是数据库的字段名,不是实体类的变量名
map.put("user_name","zhangsan");
map.put("age",18);
userMapper.deleteByMap(map);}
根据条件构造器删除
@Testpublicvoiddelete(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.eq("user_name","lisi");
userMapper.delete(wrapper);}
3、修改
根据id修改
@TestpublicvoidupdateById(){User user=newUser();
user.setId(3L);
user.setUserName("王五2号");
user.setAge(23);
user.setEmail("1234@qq.com");
user.setInfo("王五2号");
userMapper.updateById(user);}
根据条件构造器修改
@Testpublicvoidupdate(){QueryWrapper<User> wrapper=newQueryWrapper<>();User user=newUser();
user.setName("halulu");
user.setAge(18);
wrapper.eq("user_name","zhangsan");
userMapper.update(user,wrapper);}
4、查询
warpper语法
根据id查询
@RunWith(SpringRunner.class)@SpringBootTestpublicclassUserMapperTest{@AutowiredprivateUserMapper userMapper;@TestpublicvoidfindById(){User user= userMapper.selectById(1L);System.out.println(user);}}
and查询
@Testpublicvoidselect1(){QueryWrapper<User> wrapper=newQueryWrapper<>();// 设置查询条件,多个条件之间默认以and连接
wrapper.eq("user_name","zhangsan").lt("age",20);List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
or查询
@Testpublicvoidselect1(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.eq("user_name","zhangsan").or()//不加or默认是以and连接多个条件.lt("age",20);List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
and和or查询
查询 age > 23 and (name=王五 or name = 李四)
@Testpublicvoidselect2(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.gt("age",23);
wrapper.and(wrap->{
wrap.eq("name","王五").or().eq("name","李四");});List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
模糊查询
@Testpublicvoidselect3(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.likeRight("user_name","zhan");List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
排序查询
@Testpublicvoidselect4(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.orderByDesc("age");List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
select查询字段数据
@Testpublicvoidselect5(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.select("user_name");//指定要返回的字段List<User> userList= userMapper.selectList(wrapper);System.out.println(userList);}
分页查询
1、编写配置类,添加拦截器
@ConfigurationpublicclassPageConfig{/**
* 3.4.0之前的版本用这个
* @return
*//*
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
*//**
* 3.4.0之后提供的拦截器的配置方式
* @return
*/@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor=newMybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(newPaginationInnerInterceptor());return mybatisPlusInterceptor;}}
2、测试类
/**
* 分页查询
*/@TestpublicvoidtestPage(){QueryWrapper<User> wrapper=newQueryWrapper<>();
wrapper.lt("age",50).orderBy(true,true,"age").select("user_name","age");// 指定要返回的字段// 参数1-当前页,参数2-每页显示数Page<User> page=newPage<User>(1,2);// 查询第一页,每页显示2条Page<User> result= userMapper.selectPage(page, wrapper);List<User> records= result.getRecords();// 用户数据System.out.println("总条数 = "+ result.getTotal());System.out.println("总页数 = "+ result.getPages());for(User user: records){System.out.println(user);}}
原生mybatis(分页查询)
configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case:true#驼峰#基包扫描type-aliases-package: com.halulu.pojo#映射文件位置mapper-locations:- classpath:mapper/*.xml
注意:classpath:后面不用加空格
1、编写配置类,添加拦截器(代码在上面)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.halulu.mapper.UserMapper"><selectid="findByPage"resultType="user">
select name, age from tb_user</select></mapper>
publicinterfaceUserMapperextendsBaseMapper<User>{Page<User>findByPage(Page page);}
@Testpublicvoidtest(){Page<User> page=newPage<>(1,2);Page<User> result= userMapper.findByPage(page);List<User> userList= result.getRecords();System.out.println(userList);}
通用枚举
通用枚举的作用:
假设数据库的Sex字段的数值是1(男),2(女)
通用枚举就是在输出的时候将1转化为男,2转化为女
定义枚举类(实现IEnum)
publicenumSexEnum{MAN(1,"男"),WOMAN(2,"女");privateint val;privateString desc;SexEnum(int val,String desc){this.val= val;this.desc= desc;}@OverridepublicIntegergetValue(){returnthis.val;}@OverridepublicStringtoString(){returnthis.desc;}}
实体修改Sex的数据类型
privateSexEnum sex;
修改yaml文件,扫描枚举所在的包
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case:true#驼峰#基包扫描type-aliases-package: com.halulu.pojo#映射文件位置mapper-locations:- classpath:/mapper/*.xmltype-enums-package: com.halulu.enums
service 封装
Mybatis-Plus 为了开发更加快捷,对业务层也进行了封装,直接提供了相关的接口和实现类。
1. 定义接口继承IService
publicinterfaceUserServiceextendsIService<User>{}
2、定义实现类继承ServiceImpl<Mapper,Entity> 实现定义的接口
@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,User>implementsUserService{/**
* test
*/publicvoidtest(){// this.baseMapper可以获取到userMapper对象,相当于已经注入进来了并且放到了this.baseMapper中;// 说明:Iservice中也包含了一些封装的CRUD方法UserMapper baseMapper=this.getBaseMapper();}}
自动填充
Mybatis Plus提供了自动填充字段的设置。即给某些指定字段设置默认值。
@DatapublicclassUser{...// 创建时间,插入一条user数据时候,会自动设置创建时间到updated中@TableField(fill=FieldFill.INSERT)privateDate created;// 修改时间,执行修改数据时候,会自动设置修改时间到updated中@TableField(fill=FieldFill.INSERT_UPDATE)privateDate updated;}
@Componentpublic