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(超详细)完整教程

进销存系统_用户管理(10)

了解MyBatisPlus的代码生成器

MybatisPlus快速入门常用设置(表映射主键策略日志)基本使用

掌握MyBatisPlus中的分页及条件查询构建 | 黑马程序员