一篇了解: MyBatis-Plus 操纵数据库的使用

打印 上一主题 下一主题

主题 651|帖子 651|积分 1953

目录
一、MyBatis-Plus介绍
二、基础使用 
2.1 准备工作
2.2 编码
2.3 CRUD单元测试
三、MyBatis-Plus复杂操纵
3.1 打印日志
3.2 常见注解
3.2.1 @TableName
3.2.2 @TableField
3.2.3 @TableId
3.3 条件构造器
3.3.1 QueryWrapper
3.3.2 UpdateWrapper
3.3.3 LambdaQueryWrapper 和 LambdaUpdateWrapper

一、MyBatis-Plus介绍

   MyBatis-Plus(简称 MP) 是一个 MyBatis 的加强工具,在 MyBatis 的基础上只做加强不做改变, 为简化开发,提高服从而生。    它支持多款数据库,如:  PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, OceanBase, H2, DB2...  (任何能使用 MyBatis 举行增删改查,而且支持标准 SQL 的数据库应该都在 MyBatis-Plus 的支持范围  内)    官网地点:  https://baomidou.com/  二、基础使用 

Mybatis-Plus操纵数据库的步调:

  • 准备工作(数据准备, 项目准备, 引入依靠, 配置数据库毗连信息)
  • 编码(数据库表对应的实体类, 以及数据操纵的Mapper文件)
  • 测试
以下使用详细的例子体现 MyBatis-Plus 是如何操纵数据库的。
2.1 准备工作

   创建用户表, 并创建对应的实体类User:
  1. -- 创建数据库
  2. DROP DATABASE IF EXISTS mybatis_test;
  3. CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
  4. -- 使⽤数据数据
  5. USE mybatis_test;
  6. -- 创建表[⽤⼾表]
  7. DROP TABLE IF EXISTS user_info;
  8. CREATE TABLE `user_info` (
  9. `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
  10. `username` VARCHAR ( 127 ) NOT NULL,
  11. `password` VARCHAR ( 127 ) NOT NULL,
  12. `age` TINYINT ( 4 ) NOT NULL,
  13. `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
  14. `phone` VARCHAR ( 15 ) DEFAULT NULL,
  15. `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
  16. `create_time` DATETIME DEFAULT now(),
  17. `update_time` DATETIME DEFAULT now(),
  18. PRIMARY KEY ( `id` )
  19. ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
  20. -- 添加⽤⼾信息
  21. INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
  22. VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
  23. INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
  24. VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
  25. INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
  26. VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
  27. INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
  28. VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
复制代码
  创建springboot工程 ,添加MyBatis-Plus和MySQL依靠, 配置数据库毗连信息:       Spring Boot2      
  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.5.7</version>
  5. </dependency>
复制代码
  Spring Boot3
  
  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  4. <version>3.5.5</version>
  5. </dependency>
复制代码
  MySQL
  
  1. <dependency>
  2. <groupId>com.mysql</groupId>
  3. <artifactId>mysql-connector-j</artifactId>
  4. <scope>runtime</scope>
  5. </dependency>
复制代码
  配置数据库:
   application.yml文件格式:
  
  1. # 数据库连接配置
  2. spring:
  3. datasource:
  4.   url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
  5.   username: root
  6.   password: root
  7.   driver-class-name: com.mysql.cj.jdbc.Driver
复制代码
      application.properties文件格式如下:           
  1. #驱动类名称
  2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. #数据库连接的url
  4. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
  5. characterEncoding=utf8&useSSL=false
  6. #连接数据库的⽤⼾名
  7. spring.datasource.username=root
  8. #连接数据库的密码
  9. spring.datasource.password=root
复制代码
  2.2 编码

   创建实体类UserInfo
  
  1. import lombok.Data;
  2. import java.util.Date;
  3. @Data
  4. public class UserInfo {
  5. private Integer id;
  6. private String username;
  7. private String password;
  8. private Integer age;
  9. private Integer gender;
  10. private String phone;
  11. private Integer deleteFlag;
  12. private Date createTime;
  13. private Date updateTime;
  14. }
复制代码
      编写Mapper接口类                MybatisPlus提供了一个基础的     BaseMapper     接口,已经实现了单表的CRUD, 自界说的 Mapper只需要继续这个BaseMapper, 就无需自己实现单表CRUD了。            
        
  1. @Mapper
  2. public interface UserInfoMapper extends BaseMapper<UserInfo> {
  3. }
复制代码
      也可以在启动类上添加 @MapperScan , 扫描Mapper文件夹, ⼆选一即可。
       2.3 CRUD单元测试

         在创建出来的SpringBoot工程中,在src下的test目录下,已经自动创建好了测试类 ,可以直接使用这个测试类来举行测试。编写几个单元测试,测试基本的CRUD功能:           
  1. @SpringBootTest
  2. class MybatisPlusDemoApplicationTests {
  3. @Autowired
  4.   private UserInfoMapper userInfoMapper;
  5. @Test
  6. void testInsert() {
  7.    UserInfo user = new UserInfo();
  8.    user.setUsername("bite");
  9.    user.setPassword("123456");
  10.    user.setAge(11);
  11.    user.setGender(0);
  12.    user.setPhone("18610001234");
  13.    userInfoMapper.insert(user);
  14. }
  15. @Test
  16. void testSelectById() {
  17.   UserInfo user = userInfoMapper.selectById(1L);
  18.   System.out.println("user: " + user);
  19. }
  20. @Test
  21. void testSelectByIds() {
  22.    List<UserInfo> users = userInfoMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));
  23.    users.forEach(System.out::println);
  24. }
  25. @Test
  26. void testUpdateById() {
  27.    UserInfo user = new UserInfo();
  28.    user.setId(1);
  29.    user.setPassword("4444444");
  30.    userInfoMapper.updateById(user);
  31. }
  32. @Test
  33. void testDelete() {
  34.    userInfoMapper.deleteById(5L);
  35. }
  36. }
复制代码
  结果如下,执行成功:
   

    三、MyBatis-Plus复杂操纵

3.1 打印日志

  1. mybatis-plus:
  2. configuration: # 配置打印 MyBatis⽇志
  3.   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
复制代码
3.2 常见注解

      默认环境下:     

  • 表名: 实体类的驼峰表现法转换成蛇形表现法(下划线分割), 作为表名。比如UserInfo -> user_info
  • 字段: 根据实体类的属性名转换为蛇形表现法作为字段名。比如deleteFlag -> delete_flag
  •          主键: 默认为id
         那如果实体类和数据库不是按照上述规则界说的呢? MyBatis-Plus提供了一些注解,来标识表的信息。      3.2.1 @TableName

       通过     @TableName     来标识实体类对应的表:   
  1. @Data
  2. @TableName("user_info")
  3. public class Userinfo {
  4.     private Integer id;
  5.     private String username;
  6.     private String password;
  7.     private Integer age;
  8.     private Integer gender;
  9.     private String phone;
  10.     private Integer deleteFlag;
  11.     private Date createTime;
  12.     private Date updateTime;
  13. }
复制代码
     3.2.2 @TableField

       通过     @TableField 来标识对应的字段名:        
  1. @Data
  2. @TableName("user_info")
  3.    public class Userinfo {
  4.    private Integer id;
  5.    private String username;
  6.    private String password;
  7.    private Integer age;
  8.    private Integer gender;
  9.    private String phone;
  10.   @TableField("delete_flag")
  11.    private Integer deleteflag;
  12.    private Date createTime;
  13.    private Date updateTime;
  14. }
复制代码
         3.2.3 @TableId

       通过     @TableId     来指定对应的主键:      
  1. @Data
  2. @TableName("user_info")
  3.    public class Userinfo {
  4.    
  5. @TableId("id")
  6.    private Integer userId;
  7.    private String username;
  8.    private String password;
  9.    private Integer age;
  10.    private Integer gender;
  11.    private String phone;
  12.   @TableField("delete_flag")
  13.    private Integer deleteflag;
  14.    private Date createTime;
  15.    private Date updateTime;
  16. }
复制代码
3.3 条件构造器

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发服从并减少 SQL注入的风险。
      以下是紧张的 Wrapper 类及其功能:     

  • AbstractWrapper:这是⼀个抽象基类, 提供了所有 Wrapper 类共有的方法和属性。
  • QueryWrapper:用于构造查询条件, 在AbstractWrapper的基础上拓展了一个select方法, 允许指定查询字段。
  • UpdateWrapper: 用于构造更新条件, 可以在更新数据时指定条件。
  • LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而制止了硬编码字段名。
  • LambdaUpdateWrapper: 基于 Lambda 表达式的更新条件构造器, 它允许你使用 Lambda 表达 式来指定更新字段和条件,同样制止了硬编码字段名的问题。
  3.3.1 QueryWrapper

   QueryWrapper并不只用于查询语句, 无论是修改, 删除, 查询, 都可以使用QueryWrapper来构建查询条件。  查询:
  1. @Test
  2. void testQueryWrapper(){
  3. QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
  4. .select("id","username","password","age")
  5. .eq("age",18)
  6. .like("username", "min");
  7. List<UserInfo> userInfos = userInfoMapper.selectList(userInfoQueryWrapper);
  8. userInfos.forEach(System.out::println);
  9. }
复制代码
更新:
  1. @Test
  2. void testUpdateByQueryWrapper(){
  3. QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
  4. .lt("age", 20);
  5. UserInfo userInfo = new UserInfo();
  6. userInfo.setDeleteFlag(1);
  7. userInfoMapper.update(userInfo, userInfoQueryWrapper);
  8. }
复制代码
     • lt : "less than" 的缩写,表现小于;       • le : "less than or equal to"的缩写,表现小于等于;       • ge : "greater than or equal to" 的缩写,表现大于等于;       • gt : "greater than" 的缩写,表现大于;       • eq : "equals" 的缩写,表现等于;       • ne : "not equals" 的缩写,表现不等于;    删除:
  1. @Test
  2. void testDeleteByQueryWrapper(){
  3. QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
  4. .eq("age",18);
  5. userInfoMapper.delete(userInfoQueryWrapper);
复制代码
3.3.2 UpdateWrapper

   对于更新, 也可以直接使用 UpdateWrapper, 在不创建实体对象的环境下, 直接设置更新字段和条件。   

  • 基础更新:
     完成下述SQL查询:      
  1. UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
复制代码
  测试代码:
      
  1. @Test
  2. void testUpdateByUpdateWrapper(){
  3. UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>()
  4.        .set("delete_flag",0)
  5.        .set("age", 5)
  6.        .in("id", List.of(1,2,3));
  7. userInfoMapper.update(updateWrapper);
  8. }
复制代码
   

  • 基于SQL更新:
     完成下述SQL查询:      
  1. UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
复制代码
  测试代码:
  
  1. @Test
  2. void testUpdateBySQLUpdateWrapper(){
  3. UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>()
  4.           .setSql("age = age+10")
  5.           .in("id", List.of(1,2,3));
  6. userInfoMapper.update(updateWrapper);
  7. }
复制代码
  3.3.3 LambdaQueryWrapper 和 LambdaUpdateWrapper

     QueryWrapper 和 UpdateWrapper存在一个问题,就是需要写死字段名,如果字段名发生变动, 可能会由于测试不到位变成事故。MyBatis-Plus 给我们提供了一种基于Lambda表达式的条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而制止了硬编码字段名,,也提高了代码的可读性和可维护性。
LambdaQueryWrapper  和  LambdaUpdateWrapper 分别对应上述的 QueryWrapper 和 UpdateWrapper。
用法:
  1. @Test
  2. void testLambdaQueryWrapper(){
  3. QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
  4. queryWrapper.lambda()
  5. .select(UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge)
  6. .eq(UserInfo::getUserId, 1);
  7. userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
  8. }
复制代码
  1. @Test
  2. void testLambdUpdateByUpdateWrapper(){
  3. UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();
  4. updateWrapper.lambda()
  5. .set(UserInfo::getDeleteFlag, 0)
  6. .set(UserInfo::getAge, 5)
  7. .in(UserInfo::getUserId, List.of(1,2,3));
  8. userInfoMapper.update(updateWrapper);
  9. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表