Spring boot 整合mybatis、mybatis-plus入门

1 mybatis 简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(普通的 Java对象)映射成数据库中的记录。

mybatis 官网地址

2 mybatis 功能架构

我们把Mybatis的功能架构分为三层:

(1) API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
在这里插入图片描述

3 spring boot整合mybatis

项目整体结构图如下:
在这里插入图片描述

3.1 项目搭建

(1) User表结构

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `user_name` varchar(64) DEFAULT NULL COMMENT '用户名',
  `age` tinyint(32) DEFAULT NULL COMMENT '年龄',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

(2) pom文件添加mybatis依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--mybatis的自动化配置-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <!--mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>mybatis-demo</finalName>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>com/**/dao/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.example.mybatisdemo.MybatisDemoApplication</mainClass>
                </configuration>
                <!--解决SpringBoot打包成jar后运行提示没有主清单属性-->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 在 mybatis-spring-boot-starter 里面已经自动包含了 spring-boot-starter-jdbc
  • build节点的配置很重要,定义了项目编译jar包时要包含的各类文件

(3) Application项目启动类增加@MapperScan注解,用于扫描mybatis mapper接口

@SpringBootApplication
@MapperScan(basePackages = "com.example.mybatisdemo.dao")
public class MybatisDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisDemoApplication.class, args);
    }

}

(4) application.properties配置文件

spring.application.name=mybatis-demo
server.port=1020

# 连接数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 连接池名称
spring.datasource.hikari.pool-name=mybatis_demo_hikari_pool
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=5
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
# 连接池中的最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 客户端获取连接池连接的超时时长,默认30秒
spring.datasource.hikari.connection-timeout=30000
# 设置要执行的SQL查询,测试连接的有效性
spring.datasource.hikari.connection-test-query=SELECT 1

# 加载mybatis的xml文件
mybatis.mapper-locations=classpath*:com/example/mybatisdemo/dao/*.xml
# 下划线的数据库字段映射成驼峰风格的实体对象字段
mybatis.configuration.map-underscore-to-camel-case=true

# 打印数据库日志
logging.level.com.example.mybatisdemo.dao=debug
  • 主要包含数据库连接、hikari连接池、mybatis加载和映射规则、打印数据库等相关的配置
  • spring-boot-jdbc默认的数据库连接池就是HikariCP,号称性能最好的数据库连接池

(5) controller控制器

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @PostMapping("/saveUser")
    public Boolean saveUser(@RequestBody User user) {
        logger.info("新增用户信息:{}", user);
        int ret = userService.insertUser(user);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @PostMapping("/deleteUser")
    public Boolean deleteUser(int id) {
        logger.info("根据用户id删除用户信息:{}", id);
        int ret = userService.deleteUserById(id);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @PostMapping("/updateUser")
    public Boolean updateUser(@RequestBody User user) {
        logger.info("更新用户信息:{}" + user);
        int ret = userService.updateUser(user);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @GetMapping("/getUser")
    public User getUser(int id) {
        logger.info("根据用户id查询用户信息:{}", id);
        User user = userService.getUserById(id);
        return user;
    }
}

(6) UserService接口

public interface UserService {
    /**
     * 新增用户
     *
     * @param user 用户信息
     * @return int
     */
    int insertUser(User user);

    /**
     * 根据用户编号删除用户
     *
     * @param id 用户编号
     * @return int
     */
    int deleteUserById(int id);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return int
     */
    int updateUser(User user);

    /**
     * 根据用户编号查询用户信息
     *
     * @param id 用户编号
     * @return User
     */
    User getUserById(int id);
}

(7) UserServiceImpl接口实现类

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertUser(User user) {
        int result = userMapper.insertUser(user);
        return result;
    }

    @Override
    public int deleteUserById(int id) {
        return userMapper.deleteUserById(id);
    }

    @Override
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }

    @Override
    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }
}

(8) User实体类

public class User {
    private int id;

    private String userName;

    private Integer age;

    private LocalDateTime createTime;
    
    // 省略geter、seter、toString方法   
}

(9) UserMapper接口,必须添加注解@Mapper

@Mapper
public interface UserMapper {

    /**
     * 新增用户
     *
     * @param user 用户信息
     * @return int
     */
    int insertUser(User user);

    /**
     * 根据用户编号删除用户
     *
     * @param id 用户编号
     * @return int
     */
    int deleteUserById(int id);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return int
     */
    int updateUser(User user);

    /**
     * 根据用户编号查询用户信息
     *
     * @param id 用户编号
     * @return User
     */
    User getUserById(Integer id);

}

(10) UserMapper.xml文件,定义具体的sql语句操作

<?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.example.mybatisdemo.dao.UserMapper">
    <insert id="insertUser" parameterType="com.example.mybatisdemo.entity.User">
        INSERT INTO user(user_name,age,create_time)
          VALUES(#{userName},#{age},NOW())
    </insert>

    <delete id="deleteUserById" parameterType="Integer">
        DELETE FROM user WHERE id=#{id}
    </delete>

    <update id="updateUser" parameterType="com.example.mybatisdemo.entity.User">
        UPDATE user
         SET user_name=#{userName},
             age=#{age}
        WHERE id=#{id}
    </update>

    <select id="getUserById" parameterType="Integer" resultType="com.example.mybatisdemo.entity.User">
        SELECT u.id,u.user_name,u.age,u.create_time
         FROM user u
        WHERE u.id=#{id}
    </select>
</mapper>
3.2 项目启动

启动mbatis-demo项目,然后通过postman新增一条数据
在这里插入图片描述
控制台打印出接口日志、mybatis执行的sql语句和具体的参数

2021-01-16 15:26:04.385  INFO 6996 --- [nio-1020-exec-1] c.e.m.controller.UserController          : 新增用户信息:User{id=0, userName='张三', age=10, createTime=null}
2021-01-16 15:26:04.402  INFO 6996 --- [nio-1020-exec-1] com.zaxxer.hikari.HikariDataSource       : mybatis_demo_hikari_pool - Starting...
2021-01-16 15:26:04.669  INFO 6996 --- [nio-1020-exec-1] com.zaxxer.hikari.HikariDataSource       : mybatis_demo_hikari_pool - Start completed.
2021-01-16 15:26:12.460 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser          : ==>  Preparing: INSERT INTO user(user_name,age,create_time) VALUES(?,?,NOW())
2021-01-16 15:26:12.483 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser          : ==> Parameters: 张三(String), 10(Integer)
2021-01-16 15:26:12.488 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser          : <==    Updates: 1
3.3 验证事务

在service的方法上添加注解@Transactional即可开启数据库事务,在insertUser方法里面添加整数除以0的代码,如下图所示:
在这里插入图片描述
重新启动mybatis-demo项目,通过postman发送请求,IDEA控制台会打印出异常日志,查询数据库发现数据没有保存成功,说明事务正常开启。
在这里插入图片描述

2021-01-16 15:36:53.056  INFO 15928 --- [nio-1020-exec-2] c.e.m.controller.UserController          : 新增用户信息:User{id=0, userName='张三', age=10, createTime=null}
2021-01-16 15:36:53.063  INFO 15928 --- [nio-1020-exec-2] com.zaxxer.hikari.HikariDataSource       : mybatis_demo_hikari_pool - Starting...
2021-01-16 15:36:53.241  INFO 15928 --- [nio-1020-exec-2] com.zaxxer.hikari.HikariDataSource       : mybatis_demo_hikari_pool - Start completed.
2021-01-16 15:36:53.269 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser          : ==>  Preparing: INSERT INTO user(user_name,age,create_time) VALUES(?,?,NOW())
2021-01-16 15:36:53.289 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser          : ==> Parameters: 张三(String), 10(Integer)
2021-01-16 15:36:53.290 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser          : <==    Updates: 1
2021-01-16 15:36:53.321 ERROR 15928 --- [nio-1020-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ArithmeticException: / by zero] with root cause
4 spring boot整合mybatis-plus

项目整体结构图如下:
在这里插入图片描述

4.1 mybatis-plus简介

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

mybatis-plus 官方地址
在这里插入图片描述

4.2 项目搭建

1、pom文件添加 mybatis-plus 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mybatis-plus-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis-plus-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--mybatis的自动化配置-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <!--mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--mybatis-plus自动配置-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>mybatis-plus-demo</finalName>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>com/**/dao/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.example.mybatisplusdemo.MybatisPlusDemoApplication</mainClass>
                </configuration>
                <!--解决SpringBoot打包成jar后运行提示没有主清单属性-->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、Application启动类

@SpringBootApplication
public class MybatisPlusDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusDemoApplication.class, args);
    }
}

3、application.properties配置文件,设置mybatis-plus相关属性值

spring.application.name=mybatis-plus-demo
server.port=1020

# 连接数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 连接池名称
spring.datasource.hikari.pool-name=mybatis_demo_hikari_pool
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=5
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
# 连接池中的最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 客户端获取连接池连接的超时时长,默认30秒
spring.datasource.hikari.connection-timeout=30000
# 设置要执行的SQL查询,测试连接的有效性
spring.datasource.hikari.connection-test-query=SELECT 1

# 加载mybatis的xml文件
mybatis-plus.mapper-locations=classpath*:com/example/mybatisdemo/dao/*.xml
# id主键自增
mybatis-plus.global-config.db-config.id-type=auto
# 逻辑删除字段名称
mybatis-plus.global-config.db-config.logic-delete-field=flag
# 逻辑删除全局值(默认 1、表示已删除)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除全局值(默认 0、表示未删除)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
# 下划线的数据库字段映射成驼峰风格的实体对象字段
mybatis-plus.configuration.map-underscore-to-camel-case=true

# 打印数据库日志
logging.level.com.example.mybatisplusdemo.dao=debug

4、新增配置类 MybatisPlusConfig

@Configuration
@MapperScan(basePackages = "com.example.mybatisplusdemo.dao")
public class MybatisPlusConfig {
    /**
     * 加载插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
  • @MapperScan注解用于扫描Mapper接口
  • 注入MybatisPlusInterceptor用于加载mybatis-plus的分页、乐观锁插件

5、User实体类,添加mybatis-plus的注解用于数据库表映射,方便使用mybatis-plus自带的CURD功能

@TableName(value = "user")
public class User {
    @TableId
    private Integer id;

    @TableField(value = "user_name")
    private String userName;

    @TableField(value = "age")
    private Integer age;

    @TableField(value = "create_time")
    private LocalDateTime createTime;

    @TableLogic
    private Integer flag;

    @Version
    private Integer version;
    
    //省略getter、setter、toString方法
}

注解的作用描述:
mybatis-plus 注解官方文档

注解描述
@TableName表名注解
@TableId主键注解,在配置文件里面已经设置了主键的生成策略:id主键自增
@TableField字段注解(非主键),value值是数据库表字段名
@TableLogic表字段逻辑删除注解
@Version乐观锁注解,需要配合OptimisticLockerInnerInterceptor乐观锁插件

6、UserParams查询参数类

public class UserParams {
    /**
     * 用户名
     */
    private String userName;

    /**
     * 当前页
     */
    private Integer currentPage;

    /**
     * 每页数据条数
     */
    private Integer pageSize;
	//省略getter、setter、toString方法
}

7、UserController控制器类,主要包含增删改查的接口,其中分页使用了两种方式

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @PostMapping("/saveUser")
    public Boolean saveUser(@RequestBody User user) {
        logger.info("新增用户信息:{}", user);
        int ret = userService.insertUser(user);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @PostMapping("/deleteUser")
    public Boolean deleteUser(int id) {
        logger.info("根据用户id删除用户信息:{}", id);
        int ret = userService.deleteUserById(id);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @PostMapping("/updateUser")
    public Boolean updateUser(@RequestBody User user) {
        logger.info("更新用户信息:{}", user);
        int ret = userService.updateUser(user);
        return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @GetMapping("/getUser")
    public User getUser(int id) {
        logger.info("根据用户id查询用户信息:{}", id);
        User user = userService.getUserById(id);
        return user;
    }

    @GetMapping("/getUserPageList")
    public IPage<User> getUserPageList(UserParams userParams) {
        logger.info("用户信息分页查询,mybatis-plus自带查询函数:{}", userParams);
        IPage<User> userPageList = userService.getUserPageList(userParams);
        return userPageList;
    }

    @GetMapping("/getUserListPageSelf")
    public IPage<User> getUserListPageSelf(UserParams userParams) {
        logger.info("自定义用户信息分页查询:{}", userParams);
        IPage<User> userPageListSelf = userService.getUserListPageSelf(userParams);
        return userPageListSelf;
    }
}

8、UserService接口

public interface UserService {
    /**
     * 新增用户
     *
     * @param user 用户信息
     * @return int
     */
    int insertUser(User user);

    /**
     * 根据用户编号删除用户
     *
     * @param id 用户编号
     * @return int
     */
    int deleteUserById(int id);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return int
     */
    int updateUser(User user);

    /**
     * 根据用户编号查询用户信息
     *
     * @param id 用户编号
     * @return User
     */
    User getUserById(int id);

    /**
     * 分页查询用户信息
     *
     * @param userParams 参数
     * @return IPage
     */
    IPage<User> getUserPageList(UserParams userParams);

    /**
     * 自定义分页查询用户信息
     *
     * @param userParams 参数
     * @return IPage
     */
    IPage<User> getUserListPageSelf(UserParams userParams);
}

9、UserServiceImpl接口实现类

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertUser(User user) {
        user.setCreateTime(LocalDateTime.now());
        int result = userMapper.insert(user);
        return result;
    }

    @Override
    public int deleteUserById(int id) {
        return userMapper.deleteById(id);
    }

    @Override
    public int updateUser(User user) {
        // 先获取当前的version值
        User oldUser = userMapper.selectById(user.getId());
        user.setVersion(oldUser.getVersion());
        return userMapper.updateById(user);
    }

    @Override
    public User getUserById(int id) {
        return userMapper.selectById(id);
    }

    @Override
    public IPage<User> getUserPageList(UserParams userParams) {
        Page<User> pageUser = new Page<>(userParams.getCurrentPage(), userParams.getPageSize());
        // 条件构造器
        QueryWrapper<User> userWrapper = new QueryWrapper<>();
        if (userParams.getUserName() != null) {
            userWrapper.like("user_name", userParams.getUserName());
        }
        // 设置排序字段
        userWrapper.orderByAsc("age");
        IPage<User> userPageList = userMapper.selectPage(pageUser, userWrapper);
        return userPageList;
    }

    @Override
    public IPage<User> getUserListPageSelf(UserParams userParams) {
        Page<User> pageUser = new Page<>(userParams.getCurrentPage(), userParams.getPageSize());
        IPage<User> userPageList = userMapper.findUserListPage(pageUser, userParams);
        return userPageList;
    }
}
  • updateUser 使用了乐观锁的功能,得先获取当前的version,然后更新的时候会自动赋值:version=version+1
  • getUserPageList 使用了查询条件构造器QueryWrapper:条件构造器官方文档
  • getUserListPageSelf 使用了自定义的分页查询,需要在 mapper xml 文件里面写相关的sql语句

10、UserMapper 接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
    /**
     * 自定义分页列表查询
     */
    IPage<User> findUserListPage(Page<User> page, @Param("userParams") UserParams userParams);
}

继承了BaseMapper父类,自动包含了增删改查的方法,如下图所示:
Mapper CRUD 官方文档
在这里插入图片描述
11、UserMapper xml文件

<?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.example.mybatisplusdemo.dao.UserMapper">
    <select id="findUserListPage" parameterType="com.example.mybatisplusdemo.entity.UserParams"
            resultType="com.example.mybatisplusdemo.entity.User">
        SELECT id,user_name,age,create_time,flag,version
         FROM user
        WHERE flag=0
        <if test="userParams.userName!=null and userParams.userName!=''">
          AND user_name like concat('%',#{userParams.userName},'%')
        </if>
        ORDER BY age ASC
    </select>
</mapper>

12、新增User表,新增加了flag、version字段

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `user_name` varchar(64) DEFAULT NULL COMMENT '用户名',
  `age` tinyint(32) DEFAULT NULL COMMENT '年龄',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `flag` tinyint(4) DEFAULT '0' COMMENT '逻辑删除 0:未删除,1:已删除',
  `version` tinyint(4) DEFAULT '1' COMMENT '版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

启动mybatis-plus-demo项目,启动成功如下图所示:
在这里插入图片描述

4.3 验证乐观锁字段是否自动维护

使用postman请求updateUser方法
在这里插入图片描述
通过IDEA控制台打印的日志可以看出mybatis-plus框架可以正确维护version字段
在这里插入图片描述

4.4 验证逻辑删除

通过postman请求deleteUser方法
在这里插入图片描述
通过IDEA控制台打印的日志和数据库查询的结果可以看出逻辑删除成功
图一,控制台打印日志
在这里插入图片描述
图二,数据库查询结果
在这里插入图片描述

4.5 验证分页功能

通过postman请求getUserListPageSelf方法
在这里插入图片描述
查看IDEA控制台日志可以发现已实现分页、模糊查询的功能

2021-01-17 12:13:52.759 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount       : ==>  Preparing: SELECT COUNT(*) FROM user WHERE flag = 0 AND user_name LIKE concat('%', ?, '%')
2021-01-17 12:13:52.760 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount       : ==> Parameters: 张(String)
2021-01-17 12:13:52.763 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount       : <==      Total: 1
2021-01-17 12:13:52.782 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage    : ==>  Preparing: SELECT id,user_name,age,create_time,flag,version FROM user WHERE flag=0 AND user_name like concat('%',?,'%') ORDER BY age ASC LIMIT ?
2021-01-17 12:13:52.782 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage    : ==> Parameters: 张(String), 5(Long)
2021-01-17 12:13:52.785 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage    : <==      Total: 2
5 示例代码下载

项目完整代码地址

至此,Spring boot 整合mybatis、mybatis-plus入门分享完毕

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值