MybatisPlus 快速构建MybatisPlus 原生mybatis(分页查询) 通用枚举 service 封装 自动填充
Posted halulu.me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MybatisPlus 快速构建MybatisPlus 原生mybatis(分页查询) 通用枚举 service 封装 自动填充相关的知识,希望对你有一定的参考价值。
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>
# datasource
spring:
datasource:
url: jdbc:mysql://localhost:3306/mp # localhost:3306改成自己的数据库地址
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
global-config:
db-config:
# 表名前缀,设置后,如果数据库表名是tb_user, 那么实体类上可以不添加@TableName注解,不建议这里统一设置
table-prefix: tb_
# 全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置, 不建议这里统一设置
id-type: auto
type-aliases-package: com.halulu.pojo
configuration:
# 日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
@TableName()指的表名
@TableName("tb_user")
@Data
public class User {
// 设置id生成策略:AUTO,数据库主键自增
@TableId(type = IdType.AUTO)
private Long id;
// @TableField("user-name")
private String userName;
private String password;
private String name;
private Integer age;
private String email;
// 不希望该值存入数据库
@TableField(exist = false)
private String info;
}
需要实现BaseMapper接口
/**
* 使用mp定义Mapper,需要让Mapper接口继承 BaseMapper接口。
*/
public interface UserMapper extends BaseMapper<User> {
}
BaseMapper接口内置许多单表操作的方法
1、增加
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void insert(){
User user = new User();
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删除
@Test
public void deleteById(){
int count = userMapper.deleteById(6L);
System.out.println(count);
}
根据id批量删除
@Test
public void deleteBatchIds(){
ArrayList<Long> list = new ArrayList<>();
list.add(7L);
list.add(5L);
userMapper.deleteBatchIds(list);
}
根据map条件删除
@Test
public void deleteMap(){
Map<String, Object> map = new HashMap<>();
//key是数据库的字段名,不是实体类的变量名
map.put("user_name","zhangsan");
map.put("age",18);
userMapper.deleteByMap(map);
}
根据条件构造器删除
@Test
public void delete(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("user_name","lisi");
userMapper.delete(wrapper);
}
3、修改
根据id修改
@Test
public void updateById(){
User user = new User();
user.setId(3L);
user.setUserName("王五2号");
user.setAge(23);
user.setEmail("1234@qq.com");
user.setInfo("王五2号");
userMapper.updateById(user);
}
根据条件构造器修改
@Test
public void update(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
User user = new User();
user.setName("halulu");
user.setAge(18);
wrapper.eq("user_name","zhangsan");
userMapper.update(user,wrapper);
}
4、查询
warpper语法
根据id查询
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void findById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
}
and查询
@Test
public void select1(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 设置查询条件,多个条件之间默认以and连接
wrapper.eq("user_name","zhangsan").
lt("age",20);
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
}
or查询
@Test
public void select1(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
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 = 李四)
@Test
public void select2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age",23);
wrapper.and(wrap->{
wrap.eq("name","王五").or().eq("name","李四");
});
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
}
模糊查询
@Test
public void select3(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.likeRight("user_name","zhan");
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
}
排序查询
@Test
public void select4(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age");
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
}
select查询字段数据
@Test
public void select5(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("user_name");//指定要返回的字段
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
}
分页查询
1、编写配置类,添加拦截器
@Configuration
public class PageConfig {
/**
* 3.4.0之前的版本用这个
* @return
*/
/*
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
*/
/**
* 3.4.0之后提供的拦截器的配置方式
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2、测试类
/**
* 分页查询
*/
@Test
public void testPage(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("age", 50)
.orderBy(true, true, "age")
.select("user_name", "age"); // 指定要返回的字段
// 参数1-当前页,参数2-每页显示数
Page<User> page = new Page<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.StdOutImpl
map-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" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.halulu.mapper.UserMapper">
<select id="findByPage" resultType="user">
select name, age from tb_user
</select>
</mapper>
public interface UserMapper extends BaseMapper<User> {
Page<User> findByPage(Page page);
}
@Test
public void test(){
Page<User> page = new Page<>(1, 2);
Page<User> result = userMapper.findByPage(page);
List<User> userList = result.getRecords();
System.out.println(userList);
}
通用枚举
通用枚举的作用:
假设数据库的Sex字段的数值是1(男),2(女)
通用枚举就是在输出的时候将1转化为男,2转化为女
定义枚举类(实现IEnum)
MAN(1,"男"),WOMAN(2,"女");
private int val;
private String desc;
SexEnum(int val, String desc) {
this.val = val;
this.desc = desc;
}
@Override
public Integer getValue() {
return this.val;
}
@Override
public String toString() {
return this.desc;
}
}
实体修改Sex的数据类型
private SexEnum sex;
修改yaml文件,扫描枚举所在的包
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #驼峰
#基包扫描
type-aliases-package: com.halulu.pojo
#映射文件位置
mapper-locations:
- classpath:/mapper/*.xml
type-enums-package: com.halulu.enums
service 封装
Mybatis-Plus 为了开发更加快捷,对业务层也进行了封装,直接提供了相关的接口和实现类。
1. 定义接口继承IService
public interface UserService extends IService<User> {
}
2、定义实现类继承ServiceImpl<Mapper,Entity> 实现定义的接口
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
/**
* test
*/
public void test(){
// this.baseMapper可以获取到userMapper对象,相当于已经注入进来了并且放到了this.baseMapper中;
// 说明:Iservice中也包含了一些封装的CRUD方法
UserMapper baseMapper = this.getBaseMapper();
}
}
自动填充
Mybatis Plus提供了自动填充字段的设置。即给某些指定字段设置默认值。
@Data
public class User {
...
// 创建时间,插入一条user数据时候,会自动设置创建时间到updated中
@TableField(fill = FieldFill.INSERT)
private Date created;以上是关于MybatisPlus 快速构建MybatisPlus 原生mybatis(分页查询) 通用枚举 service 封装 自动填充的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot系列之集成MybatisPlus操作指南
阿里一手爆出:Springboot整合MybatisPlus(超详细)完整教程