• 【JAVA】MyBatisPlus


    目录

    【MyBatisPlus】

    【SpringBoot整合MyBatisPlus】

    【使用】

    【标准数据层开发】

    【标准数据层CRUD功能】

    【MP分页查询功能】

    【DQL编程控制】

    【条件查询】

    【查询投影】

    【查询条件】

    【字段映射与表名映射】

    【DML编程控制】

    【id生成策略控制】

    【多记录操作】

    【逻辑删除】

    【乐观锁】

    【使用】

    【快速开发】

    【代码生成器】

    【模板】


    【MyBatisPlus】

    【概述】

    MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率

    【官网】

    MyBatis-Plus (baomidou.com)

    【特性】

    • 无侵入:只做增强不做改变,不会对现有工程产生影响
    • 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
    • 支持 Lambda:编写查询条件无需担心字段写错
    • 支持主键自动生成
    • 内置分页插件

    SpringBoot整合MyBatisPlus

    【使用】

    1、创建新模块,选择Spring初始化,并配置模块相关基础信息

    2、选择当前模块需要使用的技术(仅保留JDBC)

    3、手动添加MyBatisPlus坐标

    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>mybatis-plus-boot-starterartifactId>
    4. <version>3.4.1version>
    5. dependency>

     4、设置Jdbc参数(application.yml)

    1. spring:
    2. datasource:
    3. type: com.alibaba.druid.pool.DruidDataSource
    4. driver-class-name: com.mysql.cj.jdbc.Driver
    5. url: jdbc:mysql://localhost:3306/db1?serverTimzone=UTC
    6. username: root
    7. password: root

    5、制作实体类与数据源

    1. public class User {
    2. private Long id;
    3. private String name;
    4. private String password;
    5. private Integer age;
    6. private String tel;
    7. }

    6、定义数据接口,继承BaseMapper

    1. @Mapper
    2. public interface UserDao extends BaseMapper {
    3. }

    7、测试类注入dao接口,测试功能

    1. @SpringBootTest
    2. class Mybatisplus01DemoApplicationTests {
    3. @Autowired
    4. private UserDao userDao;
    5. @Test
    6. void contextLoads() {
    7. List userList = userDao.selectList(null);
    8. System.out.println(userList);
    9. }
    10. }

    【标准数据层开发】

    【标准数据层CRUD功能】

    功能自定义接口MP接口
    新增boolean add(T  t)int insert(T t)
    删除boolean delete(int  id)int deleteById(Serializable id)
    修改boolean update(T  t)int updateById(T t)
    根据id查询T getById(int  id)T selectById(Serializable id)
    查询全部List getAll( )List selectList
    分页查询PageInfo getAll(int  page, int  size)IPage selectPage(IPage page)
    按条件查询List getAll(Codition  condition)IPage selectPage(Wrapper queryWrapper)

    【Lombok】

    Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发(坐标)

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. dependency>

    1. <dependency>
    2.     <groupId>org.projectlombokgroupId>
    3.     <artifactId>lombokartifactId>
    4.     <version>1.18.12version>
    5.     <scope>providedscope>
    6. dependency>

    【常用注解】:@Data

    1. @Data
    2. public class User {
    3.     private Long id;
    4.     private String name;
    5.     private String password;
    6.     private Integer age;
    7.     private String tel;
    8. }

    【注意】

    • 当前实体类在编译期设置对应的get/set方法,无参/无参构造方法,toString方法,hashCode方法,equals方法等
    • @Data不包含构造方法

    【MP分页查询功能】

    1、设置分页拦截器作为Spring管理的bean

    1. @Configuration
    2. public class MpConfig {
    3. @Bean
    4. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    5. //定义Mp拦截器
    6. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    7. //添加具体的拦截器
    8. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    9. return mybatisPlusInterceptor;
    10. }
    11. }

    2、执行分页查询

    1. @Test
    2. void testGetByPage(){
    3. IPage page=new Page(1,5);
    4. userDao.selectPage(page,null);
    5. System.out.println("当前页码值"+page.getCurrent());
    6. System.out.println("每页显示数"+page.getSize());
    7. System.out.println("一共多少页"+page.getPages());
    8. System.out.println("一共多少条数据"+page.getTotal());
    9. System.out.println("数据"+page.getRecords());
    10. }

    【开启日志】

    1. #开启mp的日志(输出到控制台)
    2. mybatis-plus:
    3. configuration:
    4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    DQL编程控制】

    【条件查询】

    MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

    【启用条件查询】

    1. QueryWrapper qw = new QueryWrapper();
    2. List userList = userDao.selectList(null);
    3. System.out.println(userList);

    【设置条件查询——常规链式格式】

    1. QueryWrapper qw = new QueryWrapper();//查询年龄大于等于18岁,小于65岁的用户
    2. qw.lt("age",65).ge("age",18);
    3. List userList = userDao.selectList(qw);
    4. System.out.println(userList);

    【设置条件查询——lambda表达式链式格式——组合查询条件】

    1. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    2. //10到13之间(and)
    3. lqw.lt(User::getAge, 13).gt(User::getAge, 10);
    4. //小于10,大于13(或者)
    5. lqw.lt(User::getAge, 10).or().gt(User::getAge, 13);
    6. List userList = userDao.selectList(lqw);
    7. System.out.println(userList);

    【null值处理——条件参数控制】

    1. UserQuery uq=new UserQuery();
    2. //null值判定
    3. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    4. lqw.lt(null!=uq.getAge2(), User::getAge, uq.getAge2());
    5. lqw.gt(null!=uq.getAge(), User::getAge, uq.getAge());
    6. List userList = userDao.selectList(lqw);
    7. System.out.println(userList);

    【查询投影】

    • 查询结果包含模型类中部分属性
    1. //查询结果包含模型类中部分属性
    2. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    3. lqw.select(User::getId, User::getName, User::getAge);
    4. List userList = userDao.selectList(lqw);
    5. System.out.println(userList);
    • 查询结果包含模型中未定义的属性
    1. //查询结果包含模型类中未定义的属性
    2. QueryWrapper qw = new QueryWrapper();
    3. qw.select("count(*) as count,tel");
    4. qw.groupBy("tel");
    5. List> userList = userDao.selectMaps(qw);
    6. System.out.println(userList);

    【查询条件】

    • 范围匹配(> 、 = 、between)
    • 模糊匹配(like)
    • 空判定(null)
    • 包含性匹配(in)
    • 分组(group)
    • 排序(order)

    【eq匹配】

    1. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    2. //等同于
    3. lqw.eq(User::getName, "lisi").eq(User::getPassword, "123");
    4. User LoginUser = userDao.selectOne(lqw);
    5. System.out.println(LoginUser);

    【le ge匹配 或 between匹配】

    1. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    2. //范围查询 lt le gt ge eq between
    3. lqw.between(User::getAge,10,20);
    4. List LoginUser = userDao.selectList(lqw);
    5. System.out.println(LoginUser);

    【非全文检索:like】

    1. LambdaQueryWrapper lqw = new LambdaQueryWrapper();
    2. //模糊查询
    3. lqw.like(User::getName,"z");
    4. List LoginUser = userDao.selectList(lqw);
    5. System.out.println(LoginUser);

    【字段映射与表名映射】

    1、表字段与编码属性设计不同步

    【@TableField】

    • 名称:@TableField
    • 类型:属性注解
    • 作用:设置当前属性对应的数据库表中的字段关系
    • 属性:
      • value:设置数据库表字段名称

    例:

    1. public class User {
    2. @TableField(value="pwd")
    3. private String password;
    4. }

    2、编码中添加了数据库中未定义的属性

    【@TableField】

    • 名称:@TableField
    • 类型:属性注解
    • 作用:设置当前属性对应的数据库表中的字段关系
    • 属性:
      • exist:设置属性在数据库表字段中是否存在,默认为true,此属性无法与value合并使用

    例:

    1. public class User {
    2. @TableField(exist = false)
    3. private Integer online;
    4. }

    3、采用默认查询开放了更多的字段查看权限

    【@TableField】

    • 名称:@TableField
    • 类型:属性注解
    • 作用:设置当前属性对应的数据库表中的字段关系
    • 属性:
      • select:设置属性是否参与查询,此属性与select()映射配置不冲突

    例:

    1. public class User {
    2. @TableField(value="pwd",select = false)
    3. private String password;
    4. }

    4、表名与编码开发设计不同步

    【@TableName】

    • 名称:@TableName
    • 类型:类注解
    • 作用:设置当前类对应与数据库表关系
    • 属性:
      • value:设置数据库名称

    例:

    1. @TableName("tbl_user")
    2. public class User {
    3.     private Long id;
    4. }

    【DML编程控制】

    【id生成策略控制】

    • 名称:@TableId
    • 类型:属性注解
    • 位置:模型类中用于表示主键的属性定义上方
    • 作用:设置当前类中主键属性的生成策略
    • 属性:
      • value:设置数据库主键名称
      • type:设置主键属性的生成策略,值参照IdType枚举值

    例:

    1. public class User {
    2. @TableId(type = IdType.AUTO)
    3. private Long id;
    4. }

    【生成策略类型】

    • AUTO(0):使用数据库id自增策略控制id生成
    • NONE(1):不设置id生成策略
    • INPUT(2):用户手工输入id
    • ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)
    • ASSIGN_UUID(4):以UUID生成算法作为id生成策略

    【id生成策略全局配置】

    1. mybatis-plus:
    2. global-config:
    3. db-config:
    4. id-type: assign_id #自增策略
    5. table-prefix: tb_ #表名的前缀

    【多记录操作】

    • 按照主键删除多条记录
    1. List ids= Arrays.asList(new Long[]{2,3});
    2. userDao.deleteBatchIds(ids);
    • 按照主键查询多条记录
    1. List ids= Arrays.asList(new Long[]{2,3});
    2. List userList = userDao.selectBatchIds(ids);

    【逻辑删除】

    【概述】

    为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中

    【使用】

    1、数据库表中添加逻辑删除标记字段(默认值设置为0 )

    2、实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

    1. public class User {
    2. private Long id;
    3. //逻辑删除字段
    4. @TableLogic
    5. private Integer deleted;
    6. }

    【注意】

    属性不能为delete

    3、配置逻辑删除字面值

    1. mybatis-plus:
    2. global-config:
    3. db-config:
    4. logic-delete-field: deleted
    5. logic-not-delete-value: 0
    6. logic-delete-value: 1

    【乐观锁】

    【使用】

    1、数据库表中添加所标记字段

    2、实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

    1. public class User {
    2. private Long id;
    3. //乐观锁
    4. @Version
    5. private Integer version;
    6. }

    3、配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装

    1. @Configuration
    2. public class MpConfig {
    3. @Bean
    4. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    5. //定义Mp拦截器
    6. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    7. //添加乐观锁拦截器
    8. mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    9. return mybatisPlusInterceptor;
    10. }
    11. }

    4、使用乐观锁机制在修改前必须啊先获取到对应数据的version即可正常进行

    1. @Test
    2. void testUpdate() {
    3. //多用户修改
    4. User user = userDao.selectById(3L);
    5. User user2 = userDao.selectById(3L);
    6. user2.setName("zhangsan666");
    7. userDao.updateById(user2);
    8. user.setName("zhangsan888");
    9. userDao.updateById(user);
    10. }

    执行修改前先执行查询语句

    SELECT id,name,age,tel,deleted,version FROM tbl_user WHERE id=? 

    执行修改时使用version字段作为乐观锁检查依据

    UPDATE tbl_user SET name=?, age=?, tel=?, version=? WHERE id=? AND version=? 

    【快速开发】

    【代码生成器】

    【模板】

    MyBatisPlus提供

    数据库相关配置:读取数据库获取信息

    开发者自定义配置:手工配置

    例:

    1. public class CodeGenerator {
    2. public static void main(String[] args) {
    3. //1.获取代码生成器的对象
    4. AutoGenerator autoGenerator = new AutoGenerator();
    5. //设置数据库相关配置
    6. DataSourceConfig dataSource = new DataSourceConfig();
    7. dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
    8. dataSource.setUrl("jdbc:mysql://localhost:3306/db1?serverTimezone=UTC");
    9. dataSource.setUsername("root");
    10. dataSource.setPassword("root");
    11. autoGenerator.setDataSource(dataSource);
    12. //设置全局配置
    13. GlobalConfig globalConfig = new GlobalConfig();
    14. globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java"); //设置代码生成位置
    15. globalConfig.setOpen(false); //设置生成完毕后是否打开生成代码所在的目录
    16. globalConfig.setAuthor("黑马程序员"); //设置作者
    17. globalConfig.setFileOverride(true); //设置是否覆盖原始生成的文件
    18. globalConfig.setMapperName("%sDao"); //设置数据层接口名,%s为占位符,指代模块名称
    19. globalConfig.setIdType(IdType.ASSIGN_ID); //设置Id生成策略
    20. autoGenerator.setGlobalConfig(globalConfig);
    21. //设置包名相关配置
    22. PackageConfig packageInfo = new PackageConfig();
    23. packageInfo.setParent("com.example"); //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
    24. packageInfo.setEntity("domain"); //设置实体类包名
    25. packageInfo.setMapper("dao"); //设置数据层包名
    26. autoGenerator.setPackageInfo(packageInfo);
    27. //策略设置
    28. StrategyConfig strategyConfig = new StrategyConfig();
    29. strategyConfig.setInclude("mybatisplus_user"); //设置当前参与生成的表名,参数为可变参数
    30. strategyConfig.setTablePrefix("mybatisplus_"); //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 例如: User = tbl_user - tbl_
    31. strategyConfig.setRestControllerStyle(true); //设置是否启用Rest风格
    32. strategyConfig.setVersionFieldName("version"); //设置乐观锁字段名
    33. strategyConfig.setLogicDeleteFieldName("deleted"); //设置逻辑删除字段名
    34. strategyConfig.setEntityLombokModel(true); //设置是否启用lombok
    35. autoGenerator.setStrategy(strategyConfig);
    36. //2.执行生成操作
    37. autoGenerator.execute();
    38. }
    39. }
  • 相关阅读:
    【STM32学习】——SPI通信协议&SPI时序&W25Q64存储芯片&软件SPI读写
    C#,有向无环图(DAG,Directed Acyclic Graph)的最短路径(Shortest Path)算法与源代码
    67-Java面向对象三大特征之三:多态
    10月28日
    [DeepLearning] 线性回归的实现Pytorch
    HashMap源码解读(中篇)
    vtkjs中Sample Distance功能
    机器学习day3
    大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作
    专升本三本计科仔学习java到实习之路4
  • 原文地址:https://blog.csdn.net/huihu__/article/details/126875164