> 文档中心 > MyBatis-Plus(基于SpringBoot)—— CRUD 的快速使用

MyBatis-Plus(基于SpringBoot)—— CRUD 的快速使用


MyBatis-Plus(基于SpringBoot)—— CRUD 的快速使用

开发环境:

  • IDEA:2021.3.3
  • JDK: JDK8+
  • 构建工具:maven 3.8.1
  • MySQL:8.0.27
  • SpringBoot:2.6.6
  • MyBatis-Plus:3.5.1

环境搭建

  1. 新建数据
    在这里插入图片描述

    SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user`  (  `id` int(20) NOT NULL AUTO_INCREMENT,  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `age` int(11) NULL DEFAULT NULL,  `gender` int DEFAULT '0',  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, '张三疯', '123654', '133@qq.com', 133, '0');INSERT INTO `user` VALUES (2, '李四', 'abcdef', '1453@qq.com', 12, '0');INSERT INTO `user` VALUES (3, '王五', '987654', '798@qq.com', 23, '0');INSERT INTO `user` VALUES (4, '赵六', '56+897', '789456@qq.com', 35, '0');SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

  1. 搭建工程
    在这里插入图片描述

在这里插入图片描述

不用勾选任何依赖,后续在 pom.xml 文件中添加依赖

  1. 在 SpringBoot 项目中导入依赖

    <dependencies>    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId>    </dependency>    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope>    </dependency>    <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope>    </dependency>    <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope>    </dependency>    <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version>    </dependency></dependencies>

    注意:使用mybatis-plus可以节省大量代码,不要同时导入mybatis和mybatis-plus,可能存在版本冲突

  2. 配置 application.yml 核心配置文件

    server:  port: 8080spring:  # 配置数据源信息  datasource:    username: root    password: root    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai    driver-class-name: com.mysql.cj.jdbc.Driver    # 数据源类型    type: com.zaxxer.hikari.HikariDataSource

    注意:

    1. 驱动类driver-class-name

      • spring boot 2.0(内置jdbc5驱动),驱动类使用:driver-class-name: com.mysql.jdbc.Driver
      • spring boot 2.1及以上(内置]dbc8驱动),驱动类使用:driver-class-name: com.mysql.cj.jdbc.Driver

      否则运行测试用例的时候会有WARN信息

    2. 连接地址url

      • MySQL5.7版本的url:

        jdbc:mysql//localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

      • MySQL8.0版本的url:

        jdbc:mysql:/localhost:3306/mybatis_plus?serverTimezone=GMT9%62B8&characterEncoding=utf-8&useSSL=false

      否则运行测试用例报告如下错误:

      java.sql.SQLException: The server time zone value ‘OE1u4ex%E+Ya’ is unrecognized or represents more

  3. 在 pojo 包下新建 User 实体类

    package cn.edu.hziee.mybatisplus.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class User {    private Integer id;    private String name;    private String pwd;    private String email;    private Integer age;    private Integer gender;}
  4. 在启动类 MainApplication 中增加 @MapperScan 注解

    package cn.edu.hziee.boot;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("cn.edu.hziee.mapper")public class MainApplication {    public static void main(String[] args) { SpringApplication.run(MainApplication.class,args);    }}

    @MapperScan 注解: 用于扫描指定包下的 Mapper 接口

    如果不添加 @MapperScan 注解 则需要在每一个 Mapper 接口中添加 @Mapper 注解

  5. 在 mapper 包下新建 UserMapper 接口

    package cn.edu.hziee.mybatisplus.mapper;import cn.edu.hziee.mybatisplus.entity.User;import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {}

    让 UserMapper 接口继承 MyBatisPlus 提供的 BaseMapper 接口

    在 BaseMapper 接口中 MyBatisPlus 已经给我们提供好了基本的 CRUD 代码

  6. 新建测试类

    package cn.edu.hziee;import cn.edu.hziee.mapper.UserMapper;import cn.edu.hziee.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublic class ApplicationTests {    @Autowired    UserMapper userMapper;}

1、MyBatis-Plus 配置日志

MyBatis-Plus 集成了 logback 日志

所以只需在 application.yml 中增加配置

mybatis-plus:  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、查询数据

2.1、查询所有数据

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void getUserList(){ List<User> userList = userMapper.selectList(null); userList.forEach(user -> System.out.println("user = " + user));    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5b8572df] was not registered for synchronization because synchronization is not active2022-04-10 14:38:23.569  INFO 15208 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 14:38:23.871  INFO 15208 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1772471998 wrapping com.mysql.cj.jdbc.ConnectionImpl@451e2fa9] will not be managed by Spring==>  Preparing: SELECT id,name,pwd,email,age,gender FROM user==> Parameters: <==    Columns: id, name, pwd, email, age, gender<== Row: 1, 张三疯, 123654, 133@qq.com, 133, 0<== Row: 2, 李四, abcdef, 1453@qq.com, 12, 0<== Row: 3, 王五, 987654, 798@qq.com, 23, 0<== Row: 4, 赵六, 56+897, 789456@qq.com, 35, 0<==      Total: 4Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5b8572df]user = User(id=1, name=张三疯, pwd=123654, email=133@qq.com, age=133, gender=0)user = User(id=2, name=李四, pwd=abcdef, email=1453@qq.com, age=12, gender=0)user = User(id=3, name=王五, pwd=987654, email=798@qq.com, age=23, gender=0)user = User(id=4, name=赵六, pwd=56+897, email=789456@qq.com, age=35, gender=0)
    1. JDBC Connection [HikariProxyConnection@1772471998 wrapping com.mysql.cj.jdbc.ConnectionImpl@451e2fa9] :为使用的数据源

    2. ==> Preparing: SELECT id,name,pwd,email,age,gender FROM user :为执行的 SQL 语句

    <==    Columns: id, name, pwd, email, age, gender<== Row: 1, 张三疯, 123654, 133@qq.com, 133, 0<== Row: 2, 李四, abcdef, 1453@qq.com, 12, 0<== Row: 3, 王五, 987654, 798@qq.com, 23, 0<== Row: 4, 赵六, 56+897, 789456@qq.com, 35, 0<==      Total: 4

    为查询结果

2.2、根据主键查询

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void getUserById(){ User user = userMapper.selectById(1); System.out.println("user = " + user);    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35eee641] was not registered for synchronization because synchronization is not active2022-04-10 14:54:20.711  INFO 17196 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 14:54:21.099  INFO 17196 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1340769295 wrapping com.mysql.cj.jdbc.ConnectionImpl@32ae8f27] will not be managed by Spring==>  Preparing: SELECT id,name,pwd,email,age,gender FROM user WHERE id=?==> Parameters: 1(Integer)<==    Columns: id, name, pwd, email, age, gender<== Row: 1, 张三疯, 123654, 133@qq.com, 133, 0<==      Total: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35eee641]user = User(id=1, name=张三疯, pwd=123654, email=133@qq.com, age=133, gender=0)

2.3、根据 ID 批量查询

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void getUserList(){ List<Integer> idList = Arrays.asList(1, 2, 3); List<User> userList = userMapper.selectBatchIds(idList); userList.forEach(list -> System.out.println("list = " + list));    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@738a5848] was not registered for synchronization because synchronization is not active2022-04-10 16:13:59.803  INFO 14452 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 16:14:00.108  INFO 14452 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@2034385122 wrapping com.mysql.cj.jdbc.ConnectionImpl@74a820bf] will not be managed by Spring==>  Preparing: SELECT id,name,pwd,email,age,gender FROM user WHERE id IN ( ? , ? , ? )==> Parameters: 1(Integer), 2(Integer), 3(Integer)<==    Columns: id, name, pwd, email, age, gender<== Row: 1, 张三, 123789, 123@qq.com, 13, 1<== Row: 2, 李四, abcdef, 1453@qq.com, 12, 1<== Row: 3, 王五, 987654, 798@qq.com, 23, 1<==      Total: 3Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@738a5848]list = User(id=1, name=张三, pwd=123789, email=123@qq.com, age=13, gender=1)list = User(id=2, name=李四, pwd=abcdef, email=1453@qq.com, age=12, gender=1)list = User(id=3, name=王五, pwd=987654, email=798@qq.com, age=23, gender=1)

2.4、根据 Map 中的条件查询

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void getUserList(){ Map<String, Object> columnMap = new HashMap<String, Object>(); columnMap.put("name", "李四"); columnMap.put("age", 12); List<User> user = userMapper.selectByMap(columnMap); System.out.println("user = " + user);    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1ac730cd] was not registered for synchronization because synchronization is not active2022-04-10 16:19:41.768  INFO 18976 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 16:19:42.064  INFO 18976 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@2004952636 wrapping com.mysql.cj.jdbc.ConnectionImpl@5fdd97c1] will not be managed by Spring==>  Preparing: SELECT id,name,pwd,email,age,gender FROM user WHERE name = ? AND age = ?==> Parameters: 李四(String), 12(Integer)<==    Columns: id, name, pwd, email, age, gender<== Row: 2, 李四, abcdef, 1453@qq.com, 12, 1<==      Total: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1ac730cd]user = [User(id=2, name=李四, pwd=abcdef, email=1453@qq.com, age=12, gender=1)]

3、插入数据

  1. 在实体类中声明主键生成策略 @TableId(value = “id”,type = IdType.AUTO)(在下面详细讲解)

    package cn.edu.hziee.mybatisplus.entity;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class User {    @TableId(value = "id",type = IdType.AUTO)    private Integer id;    private String name;    private String pwd;    private String email;    private Integer age;    private Integer gender;}
  2. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper; @Test    void insertUser(){ User user = new User(null,"小明","123qwe","qaz@139.com",(short)20,"1"); int result = userMapper.insert(user); System.out.println("插入了" + result + "条数据"); System.out.println("user = " + user);    }}
  3. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@59636c47] was not registered for synchronization because synchronization is not active2022-04-10 15:17:19.235  INFO 17224 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 15:17:19.540  INFO 17224 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@700791887 wrapping com.mysql.cj.jdbc.ConnectionImpl@3009eed7] will not be managed by Spring==>  Preparing: INSERT INTO user ( name, pwd, email, age, gender ) VALUES ( ?, ?, ?, ?, ? )==> Parameters: 小明(String), 123qwe(String), qaz@139.com(String), 20(Short), 1(String)<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@59636c47]插入了1条数据user = User(id=5, name=小明, pwd=123qwe, email=qaz@139.com, age=20, gender=1)

    MyBatis-Plus 自动帮我提交事务,帮我配置了主键回填(除此之外还帮我们开启了驼峰命名等配置)

4、更新数据

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void updateUser(){ int result = userMapper.updateById(new User(1,"张三","123789","123@qq.com",13, 1)); System.out.println("更新了" + result + "条数据");    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5aa62ee7] was not registered for synchronization because synchronization is not active2022-04-10 16:07:46.190  INFO 17164 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 16:07:46.641  INFO 17164 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@2032479363 wrapping com.mysql.cj.jdbc.ConnectionImpl@6fbf5db2] will not be managed by Spring==>  Preparing: UPDATE user SET name=?, pwd=?, email=?, age=?, gender=? WHERE id=?==> Parameters: 张三(String), 123789(String), 123@qq.com(String), 13(Integer), 1(Integer), 1(Integer)<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5aa62ee7]更新了1条数据

5、删除数据

5.1、根据 ID 删除

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void deleteUserById(){ int result = userMapper.deleteById(5); System.out.println("删除了" + result + "条数据");    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6371cf2f] was not registered for synchronization because synchronization is not active2022-04-10 15:21:46.390  INFO 20276 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 15:21:46.644  INFO 20276 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@565517913 wrapping com.mysql.cj.jdbc.ConnectionImpl@1785d194] will not be managed by Spring==>  Preparing: DELETE FROM user WHERE id=?==> Parameters: 5(Integer)<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6371cf2f]删除了1条数据

5.2、根据 Map 中的条件删除

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void deleteUserByMap(){ Map<String, Object> columnMap = new HashMap<>(); columnMap.put("name", "小明"); columnMap.put("age", 20); int result = userMapper.deleteByMap(columnMap); System.out.println("删除了" + result + "条数据");    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5aa62ee7] was not registered for synchronization because synchronization is not active2022-04-10 15:28:52.998  INFO 17156 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 15:28:53.397  INFO 17156 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@293669143 wrapping com.mysql.cj.jdbc.ConnectionImpl@13278a41] will not be managed by Spring==>  Preparing: DELETE FROM user WHERE name = ? AND age = ?==> Parameters: 小明(String), 20(Integer)<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5aa62ee7]删除了1条数据

5.3、根据 ID 批量删除

  1. 测试类

    @SpringBootTestclass MyBatisPlusApplicationTests {    @Autowired    private UserMapper userMapper;    @Test    void deleteUserList(){ List<Integer> usersId = Arrays.asList(1, 2, 3, 4); int result = userMapper.deleteBatchIds(usersId); System.out.println("删除了" + result + "条数据");    }}
  2. 运行结果

    Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab802f4] was not registered for synchronization because synchronization is not active2022-04-10 15:33:35.295  INFO 15072 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting...2022-04-10 15:33:35.573  INFO 15072 --- [    main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Start completed.JDBC Connection [HikariProxyConnection@1352294549 wrapping com.mysql.cj.jdbc.ConnectionImpl@57cabdc3] will not be managed by Spring==>  Preparing: DELETE FROM user WHERE id IN ( ? , ? , ? , ? )==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer)<==    Updates: 4Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7ab802f4]删除了4条数据

上一篇:MyBatis-Plus(基于SpringBoot)—— 简介