MybatisPlus 、快速构建MybatisPlus、 原生mybatis(分页查询)、 通用枚举 、service 封装、 自动填充

2022-08-15 11:55:39

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
  • 作者:halulu.me
  • 原文链接:https://blog.csdn.net/weixin_44504809/article/details/117617665
    更新时间:2022-08-15 11:55:39