【Mybatis】Mybatis-Plus框架

【Mybatis】Mybatis-Plus框架

一、概述

特性

  • 无侵入
  • 损耗小
  • 强大的 CRUD 操作
  • 支持 Lambda 形式调用
  • 更多特性参照Mybatis-Plus官网

架构

图片来源官网

【Mybatis】Mybatis-Plus框架_第1张图片

二、Mybatis-Plus使用

入门应用

首先在使用之前,我们先使用Mybatis完成CRUD操作,之后对Mybatis与Mybatis-Plus进行整合操作。

一、创建项目之后,首先创建数据库中的数据对象

-- 创建测试表
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(20) NOT NULL COMMENT '用户名',
`password` varchar(20) NOT NULL COMMENT '密码',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- 插入测试数据
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
('1', 'zhangsan', '123456', '张三', '18', '[email protected]');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
('2', 'lisi', '123456', '李四', '20', '[email protected]');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
('3', 'wangwu', '123456', '王五', '28', '[email protected]');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
('4', 'zhaoliu', '123456', '赵六', '21', '[email protected]');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
('5', 'sunqi', '123456', '孙七', '24', '[email protected]');

二、创建com.company.pojo.User类,作为查询结果的POJO映射类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}

上面的两个注解:@NoArgsConstructor@AllArgsConstructor分别对应直接生成无参构造和全参构造。

三、创建com.company.mapper.UserMapper接口,对应查询操作的接口

public interface UserMapper {
    List<User> findAll();
}

四、创建资源文件log4j.properties文件,使用log4j生成日志

log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n

五、创建Mybatis核心配置文件mybatis-config.xml



<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mp?
useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQuerie
s=true&useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    mappers>
configuration>

六、创建UserMapper.xml配置文件,对应sql操作的语句



<mapper namespace="com.company.submodule.mapper.UserMapper">
    <select id="findAll" resultType="com.company.submodule.pojo.User">
        select * from tb_user
    select>
mapper>

七、使用测试类对上述的结果进行测试

public class MybatisTest {

    @Test
    public void testFindAll() throws IOException {
        // 1. 创建 sqlSessionFactory
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        // 2. 创建mapper对象
        SqlSession sqlSession = sessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 3. 运行测试
        List<User> users = mapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

最终打印出查询结果。

Mybatis-Plus和Mybatis的整合

上述的使用是针对Mybatis框架的使用,针对Mybatis-Plus框架的使用,我们首先要在Maven中添加依赖:

<dependency>
    <groupId>com.baomidougroupId>
    <artifactId>mybatis-plusartifactId>
    <version>3.1.1version>
dependency>

现在针对Mybatis和Mybatis-Plus框架的整合操作,整个整合过程中仅需要修改两处地方:

①将之前创建的UserMapper接口继承BaseMapper

public interface UserMapper extends BaseMapper<User> {    List<User> findAll();}

该接口提供了一系列的方法,Mybatis-Plus提供的一系列方法就在这个里面提供。该接口的归属包为 package com.baomidou.mybatisplus.core.mapper;

②测试代码中:

image-20210625152821147

创建sqlSession的时候,使用Mybatis-Plus提供的类,而不是使用Mybatis提供的类。

public class MybatisPlusTest {

    @Test
    public void testFindAll() throws IOException {
        // 1. 创建 sqlSessionFactory
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sessionFactory = new MybatisSqlSessionFactoryBuilder().build(resourceAsStream);

        // 2. 创建mapper对象
        SqlSession sqlSession = sessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 3. 运行测试
        List<User> users = mapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

查询结果和之前的结果保持一致。

测试中使用Mybatis-Plus中的方法,selectList()调用方法:

List<User> users = mapper.selectList(null);
for (User user : users) {
    System.out.println(user);
}

这样直接使用的时候会报错,提示 Table 'mp.user' doesn't exist

提示该错误的原因是因为使用的POJO类,命名为User,Mybatis-Plus在运行的时候会指定类名为查询的数据库中的表格名(查询方法运行的时候参数为null)。其中的mp为之前创建的实例的数据库名,查看运行日志可以得知,当时生成的Sql语句为 SELECT id,user_name,password,name,age,email FROM user,表名不一致,所以要在User类上指定@TableName的值。

解决办法:在之前创建的POJO包下的User类的上方添加注释

@TableName("tb_user")

这样的作用是指定表名,将数据库中的表格名和Mybatis-Plus中指定的表名匹配一致。

疑问:

创建Mybatis-Plus的工厂类对象之后,创建Mapper对象的时候已经指定了UserMapper类,那么为什么运行时候结果没有指定到UserMapper.xml文件中的