目录
1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖:
前言
什么是MyBatis?
- MyBatis是一个开源、轻量级的数据持久型框架,是JDBC和Hibernate的替代方案。
为什么使用MyBatis?
- MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement等繁杂的过程,开发者只需要关注SQL语句本身。
Spring怎么整合MyBatis?
- 如下文所示
什么是MyBatis-Plus?
- MyBatis-Plus简称MP,是MyBatis的增强工具,在MyBatis的基础上扩展了许多实用的功能。
为什么使用MyBatis-Plus?
- 简化CRUD操作:MP提供了丰富的内置方法,可以通过简单的方法调用完成常见的CRUD(创建、读取、更新、删除)操作,无需手动编写SQL语句。
- 条件构造器:MP提供了强大的条件构造器,可以通过API的方式灵活地拼接查询条件,支持链式调用,使得复杂的查询条件更加可控和易于维护。
- 分页查询:支持快速、简单地进行分页查询,减少手动编写分页SQL的复杂性,提高了开发效率。
- 逻辑删除:MP支持逻辑删除,通过注解配置的方式可以轻松实现逻辑删除的功能,避免在业务代码中手动处理逻辑删除的逻辑。
- 乐观锁和数据权限:对乐观锁和数据权限提供了良好的支持,简化了相关的操作和配置。
Spring怎么整合MyBatis-Plus?
- 如下文第二章所示
Spring整合MyBatis
1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖:
MySQL的依赖坐标:
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
MyBatis的依赖坐标:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
Lombok的依赖坐标:导入后,自动生成实体类的get、set、无参构造方法和有参构造方法,方便快速搭建项目(多数情况下会导致编译器“报红”,影响开发者对“异常”信息的捕捉)
注:使用此Java库,IDEA、Eclipse需要安装Lombok插件,启用注解处理功能或添加配置。
相关搜索:Lombok在IDEA中的使用 Eclipse使用Lombok
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
Junit的依赖坐标:在项目开发过程中用于“单元测试”某个接口API的逻辑正确性,避免造成过大损失
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
2. 配置数据源
在MyBatis的配置文件(一般为 mybatis.xml 或 mybatis-config.xml 文件)中配置全局设置、数据源、映射器等信息
jdbc.properties文件:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/2003db?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456
mybatis-config.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启全局配置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--开发模式-->
<environments default="env">
<environment id="env">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--映射器注册-->
<mappers>
<package name="com.ape.dao"/>
</mappers>
</configuration>
解读:
- 在这里,我们使用
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>开启了驼峰命名和下划线命名的自动转换功能。
Mybatis自动驼峰映射规范:
- 数据库的 stu_id 对应实体类中的 stuId;
- 数据库的 stu_name 对应实体类中的 stuName;
- 在 environments 标签内配置了数据源和环境信息;环境名为 env ,使用JDBC作为事务管理器类型,使用 POOLED 数据源类型,配置MySQL数据库的连接信息(驱动、URL、用户名、密码);
- 在<property>标签的value属性中使用${jdbc.username}占位符,引用jdbc.properties文件中的属性值 jdbc.username;
- 通常情况下,我们会将敏感的配置信息存储在外部的配置文件中;
- 在 jdbc.properties 存储MySQL的连接信息,这样做的好处是可以在不同环境中使用不同的配置,而不修改MyBatis的配置文件;
- 在 mappers 标签内注册映射器(Mapper)。使用<package>标签指定Mappper接口所在包路径 com.ape.dao,表示MyBatis会扫描该包下的Mapper接口并注册到MyBatis中;
3. 编写实体类
使用Lombok快速构建
案例:
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
private int stuId;
private String stuName;
private String stuHobby;
public Student(String stuName, String stuHobby) {
this.stuName = stuName;
this.stuHobby = stuHobby;
}
}
解读:
@NoArgsConstructor注解:Lombok注解在编译时自动生成“无参的构造方法”。 @AllArgsConstructor注解:自动生成“全参的构造方法”。 @Data注解:自动生成“Getter、Setter、toString、equals、hashCode”方法。
4. 编写API接口
案例:
public interface StudentMapper extends BaseMapper<Student> {
@Select("select * from student")
public List<Student> findAll();
@Insert("insert into student (stu_name,stu_hobby) value(#{stuName},#{stuHobby})")
public void save(Student student);
}
5. 编写单元测试方法(业务)
在 test文件夹下 => java文件夹下 => 创建包 =>在包下创建测试类
案例:
public class Test01 {
SqlSession sqlSession = null;
StudentMapper studentMapper = null;
InputStream inputStream = null;
@Before
public void beforeMethod(){
try {
inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(inputStream);
sqlSession = factory.openSession(true);//开启事务自动提交
studentMapper = sqlSession.getMapper(StudentMapper.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@After
public void afterMethod(){
try {
sqlSession.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void show1(){
studentMapper.save(new Student("会诚意","创可贴"));
}
@Test
public void show2(){
List<Student> all = studentMapper.findAll();
for (int i = 0; i < all.size(); i++) {
Student student = all.get(i);
System.out.println(student);
}
}
}
解读:
- 被 @Before 和 @After 注解修饰的方法 会分别在每个测试方法(被 @Test 包围的方法)执行前和执行后允许。
- 案例中@Before注解方法 :获取名为 “mybatis.xml” 的配置文件资源,创建SqlSessionFactory、SqlSession以及相应的Mapper对象。
- 案例中@After注解方法:关闭SqlSession并且关闭输入流。
- 案例中@Test注解方法:表示它是一个测试方法,在一个测试类中,可以创建多个不同名,但被注解修饰的方法。
Spring整合MyBatis-Plus
1. 在项目中导入依赖:
MySQL的依赖坐标:
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
MyBatis-Plus的依赖坐标:
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.1</version>
</dependency>
Junit的依赖坐标:
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
Lombok的依赖坐标:
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
2. 配置数据源
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启全局配置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--插件-->
<plugins>
<!--mp分页插件-->
<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin>
</plugins>
<!--开发模式-->
<environments default="env">
<environment id="env">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/2307db?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--映射器注册-->
<mappers>
<package name="com.apesource.dao"/>
</mappers>
</configuration>
总结:
- 除了加入了
<plugins> <!--mp分页插件--> <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin> </plugins> 加入了MyBatis-Plus的分页插件外,其他配置与 Spring 整合 MyBatis 的大差不差。
3. 编写实体类
使用Lombok快速构建:与整合MyBatis不同的是使用了MP的注解
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "student")
public class Student {
@TableId(value = "stu_id",type = IdType.AUTO)
private int stuId;
@TableField(value = "stu_name")
private String stuName;
@TableField(value = "stu_hobby")
private String stuHobby;
public Student(String stuName, String stuHobby) {
this.stuName = stuName;
this.stuHobby = stuHobby;
}
}
解读:
@TableName(value = "student"):用于指定实体对应的表名。 @TableId(value = "stu_id",type = IdType.AUTO):用于表示主键字段,并且设置了主键自增。 @TableField(value = "stu_name")和 @TableField(value = "stu_hobby"):用于指定实体类字段和数据库表字段的映射关系。将实体类字段 stuName 和 stuHobby 分别映射到数据库表中的列 stu_name 和 stu_hobby。
4. 编写API接口与编写单元测试方法(业务)
MP是在MyBatis上做了扩展,所以编写接口和编写实现业务和MyBatis差不多,这里不再一一赘述,后面更新MP在这两个方面上对MyBatis的扩展。