目录
一、介绍
在当今快速发展的软件工程领域,微服务架构和敏捷开发模式已经成为主流。Spring Boot,以其“约定优于配置”的设计理念,极大地简化了Java应用的开发过程,使得开发者能够更加专注于业务逻辑的实现而非繁琐的配置细节。而MyBatis,作为一款优秀的持久层框架,提供了映射语句和参数到SQL语句的强大功能,使得操作数据库变得更加灵活和高效。当这两者结合时,Spring Boot与MyBatis-Flex(一个基于MyBatis的增强版插件)的集成,不仅进一步提升了开发效率,还为复杂的数据处理需求提供了强大的支持。
本文将深入探讨如何在Spring Boot项目中整合MyBatis-Flex,实现数据的查询、更新、新增、删除以及分页功能,同时覆盖注解和XML两种配置方式。刚接触Spring Boot的新手,本文都将为你提供实用的指导和示例代码,帮助你掌握这一高效的数据访问技术栈。
MyBatis-Flex是基于MyBatis框架的一个增强版本,它旨在提供更简洁、更高效的数据库操作体验。相比于原生的MyBatis,MyBatis-Flex引入了一系列的改进和新特性,使其在处理复杂的数据库操作时更加得心应手。
-
自动映射:MyBatis-Flex提供了自动映射功能,能够智能地将查询结果映射到实体类,减少了手动编写映射规则的工作量。
-
链式调用:它支持链式调用语法,使得数据库操作更加流畅和直观,例如,可以连续执行查询、过滤、排序等操作。
-
条件构建器:MyBatis-Flex内置了条件构建器,允许开发者通过简单的API调用来构建复杂的SQL查询条件,无需直接编写SQL语句。
-
分页查询:它提供了便捷的分页查询接口,可以轻松实现数据的分页加载,优化大数据量下的查询性能。
-
批量操作:支持批量插入、更新和删除操作,提高了数据处理的效率。
-
注解支持:除了XML配置文件,MyBatis-Flex还支持使用注解的方式定义数据访问层(DAO)接口,使得代码更加简洁。
-
错误处理:它有更友好的异常处理机制,能够提供更详细的错误信息,便于问题排查。
-
性能优化:MyBatis-Flex在性能上也做了很多优化,如缓存机制的改进、SQL执行效率的提升等,有助于提高应用程序的整体响应速度。
二、Spring boot整合MyBatis-Flex依赖
在创建完成Spring boot项目后,我们在POM配置文件中添加MyBatis-Flex所相关的依赖,我们分别添加了MyBatis-Flex、Mysql、Druid依赖这些都是整合MyBatis-Flex所必须的依赖,Druid的话也可以使用HikariCP更替。将代码添加到<dependencies></dependencies>标签对中去
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.9.7</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
将依赖代码添加进POM文件后点击(这个或者这个)Maven的构建按钮重新构建项目。
三、配置application文件
在我们添加完成依赖后就可以开始配置application文件了,配置文件位于resources目录下,使用Sprig Initializr创建项目的话,在resources目录会生成一个application.properties文件,不过我比较喜欢使用YML文件,所以本文章都是用YML文件来配置
首先我们删除application.properties文件添加一个application.yml的YML文件
把代码复制进去application.yml配置文件里面去
server:
port: 8889
spring:
datasource: # 数据源相关配置
type: com.alibaba.druid.pool.DruidDataSource # 指定数据源类型为Druid
driver-class-name: com.mysql.cj.jdbc.Driver # MySQL驱动类名
url: jdbc:mysql://localhost:3306/testone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC # 数据库连接URL
username: testone # 数据库用户名
password: testone # 数据库密码
# Druid数据源专有配置
druid:
initial-size: 5 # 初始化时建立物理连接的个数
min-idle: 5 # 最小空闲连接数
max-active: 20 # 最大连接池数量
max-wait: 60000 # 获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
min-evictable-idle-time-millis: 300000 # 连接在池中最小生存的时间,单位毫秒
validation-query: SELECT 1 FROM DUAL # 用来检测连接是否有效的sql,要求是一个查询语句
test-while-idle: true # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
test-on-borrow: false # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
test-on-return: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
pool-prepared-statements: true # 开启PSCache,并指定每个连接上PSCache的大小
max-pool-prepared-statement-per-connection-size: 20 # 每个连接上PSCache的大小
use-global-data-source-stat: true # 是否全局共享连接池统计信息
filters: stat,wall,log4j2 # 配置监控统计拦截的filters,stat:监控统计,wall:防御sql注入,log4j2:日志记录
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 # SQL合并,慢SQL记录阈值
四、创建模拟数据的SQL
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,唯一标识',
`username` varchar(50) NOT NULL COMMENT '用户名,登录账号',
`password` varchar(100) NOT NULL COMMENT '用户密码,加密存储',
`email` varchar(100) DEFAULT NULL COMMENT '用户邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '用户电话号码',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`) USING BTREE COMMENT '用户名唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户基本信息表';
记得需要修改数据库配置在application.yml文件,j2ee为数据库名称,username为账号,password为密码,如果是远程·数据库就需要把localhost修改掉。否则会爆数据库连接异常
五、创建所需实体类
在我们创建完成User表后我们开始创建实体类,先创建项目所需要的文件夹
创建完成后再entity文件夹里面创建我们的User实体类
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.util.Date;
/**
* @author 青云
*/
@Data//Lombok注解,自动生成getters、setters、toString、equals和hashCode方法
@Table("user") // 指定对应的数据库表名
public class User
{
/**
* 用户ID,唯一标识
*/
@Id(keyType = KeyType.Auto)
private Integer id;
/**
* 用户名,登录账号
*/
private String username;
/**
* 用户密码,加密存储
*/
private String password;
/**
* 用户邮箱
*/
private String email;
/**
* 用户电话号码
*/
private String phone;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
六、创建Mapper接口编写注解方法
6.1创建Mapper接口
在mapper文件夹里面创建UserMapper接口,并继承 BaseMapper<User>,在加上@Mapper注解。
import com.example.demo.entity.User;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
/**
* @author 青云
*/
@Mapper
public interface UserMapper extends BaseMapper<User>
{
}
6.2添加Mapper扫描注解
添加完UserMapper接口后返回Spring boot启动类添加上去Mapper扫描注解
//里面填写的是mapper文件所在的包
@MapperScan("com.mybatisflex.test.mapper")
6.3添加注解方法
将增删改查的方法写入UserMapper里面,并分别加入增删改查的注解。
@Insert("insert into user(username,password) values(#{username},#{password})")
boolean addUser(@Param("username")String username, @Param("password") String password);
@Update("update user set password = #{password} where username = #{username}")
boolean changePassword(@Param("username")String username, @Param("password") String password);
@Delete("delete from user where username = #{username}")
boolean deleteUser(@Param("username")String username);
@Select("select * from user where username = #{username}")
User findUser(@Param("username")String username);
如果出现“没有配置任何数据源来运行此 SQL 并提供高级代码辅助。 通过问题菜单(Alt+Enter)禁用此检查。”这个不影响项目运行,如果想消除提示配置数据源添加上数据库即可。
6.4关于增删改查注解的解释
-
@Insert
注解- 用于定义插入操作的SQL语句。
- 可以直接在注解中编写SQL语句,也可以引用外部的XML文件中的SQL语句。
- 支持动态SQL,例如使用
${}
或#{}
来动态插入变量值。 - 示例:
@Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})") void insert(User user);
-
@Update
注解- 用于定义更新操作的SQL语句。
- 同样支持直接在注解中编写SQL或引用XML文件。
- 动态SQL支持,可以根据条件选择性地更新字段。
- 示例:
@Update("UPDATE user SET password = #{newPassword} WHERE id = #{id}") void updatePassword(@Param("id") int id, @Param("newPassword") String newPassword);
-
@Delete
注解- 用于定义删除操作的SQL语句。
- 直接在注解中编写SQL语句或引用XML。
- 示例:
@Delete("DELETE FROM user WHERE id = #{id}") void deleteById(int id);
-
@Select
注解- 用于定义查询操作的SQL语句。
- 支持返回单个对象、列表或自定义结果集。
- 可以使用
@ResultMap
注解来映射复杂的查询结果。 - 示例:
@Select("SELECT * FROM user WHERE id = #{id}") User findById(int id);
七、测试注解方法的增删改查
打开测试类位于src\test\java\com.xxx.xxx\下
7.1编写测试类
这里的测试类我们添加了userMapper类的自动装箱然后分别编写了添加用户、修改用户密码、查找用户、删除用户的测试方法。
package com.example.demo;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests
{
@Autowired
private UserMapper userMapper;
@Test
void testAddUser() {
String username = "user1";
String password = "pass1";
// 添加用户
boolean result = userMapper.addUser(username, password);
System.out.println("添加用户: " + result);
}
@Test
void testChangePassword() {
String username = "user1";
String newPassword = "pass2";
userMapper.changePassword(username, newPassword);
// 修改密码
boolean result = userMapper.changePassword(username, newPassword);
System.out.println("修改密码: " + result);
}
@Test
void testFindUser() {
String username = "user1";
// 查找用户
User user = userMapper.findUser(username);
System.out.println(user);
}
@Test
void testDeleteUser() {
String username = "user1";
// 删除用户
userMapper.deleteUser(username);
}
}
7.2运行添加用户方法
在方法名这一行旁边有一个打勾或者一个三角的运行按钮,点开即可运行该测试方法。
运行方法等待运行完毕后,控制台往下拉找到我们的输出信息
我们可以看到运行成功了,成功的添加了用户。如果用出现任何异常则运行测试会不通过也就是图片左上角会显示一个×。
7.3运行修改用户密码方法
运行步骤如上,接下来我们会获得运行的结果
7.4运行查找用户方法
这里我将User的ToString方法重写了输出所有属性。
7.5删除用户方法
至此我们就将Mybatis-Flex基本的注解方法(增删改查注解)就讲完了
8.使用 XML文档执行增删改查操作
8.1 添加Mapper XML文件扫描目录配置
打开application.yml文件在最后面添加(一定要注意在添加的时候不要有缩进符不懂看一看截图)
mybatis-flex:
mapper-locations:
- classpath*:/mapper/*.xml
8.2创建UserMapper的XML文件
我们先在UserMapper接口里添加待会要使用的XML文件执行操作的方法。
boolean addUserXml(@Param("username")String username, @Param("password") String password);
boolean changePasswordXml(@Param("username")String username, @Param("password") String password);
boolean deleteUserXml(@Param("username")String username);
User findUserXml(@Param("username")String username);
接着在resources文件夹里新建一个mapper文件夹
然后创建UserMapper的XML文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findUserXml" resultType="com.example.demo.entity.User">
select *
from user
where username = #{username}
</select>
<insert id="addUserXml">
insert into user(username, password)
values (#{username}, #{password})
</insert>
<update id="changePasswordXml">
update user
set password = #{password}
where username = #{username}
</update>
<delete id="deleteUserXml">
delete
from user
where username = #{username}
</delete>
</mapper>
这样子XML文件就和UserMapper接口里面的方法关联起来了
8.3创建测试类的方法
最后我们还需要测试一下方法能否成功执行,我们需要在测试类里面先写测试方法(可以将之前的注解测试方法复制一下)
@Test
void testAddUserXml() {
String username = "user2";
String password = "pass1";
// 添加用户
boolean result = userMapper.addUserXml(username, password);
System.out.println("添加用户: " + result);
}
@Test
void testChangePasswordXml() {
String username = "user2";
String newPassword = "pass2";
userMapper.changePassword(username, newPassword);
// 修改密码
boolean result = userMapper.changePasswordXml(username, newPassword);
System.out.println("修改密码: " + result);
}
@Test
void testFindUserXml() {
String username = "user2";
// 查找用户
User user = userMapper.findUserXml(username);
System.out.println(user);
}
@Test
void testDeleteUserXml() {
String username = "user2";
// 删除用户
userMapper.deleteUserXml(username);
}
8.4执行增删改查的测试方法
添加用户
修改用户密码
查询用户
删除用户
(这里忘记输出了)
至此就讲解完成了使用XML文件来操作的步骤了。
9.总结
总体来说我比较推荐使用注解的方法来操作数据库,比较简单的查询就可以使用注解来操作,如果遇到比较麻烦的可以使用XML文件来操作。除了注解和XML文件来操作数据库之外,还有一种可以来操作数据库使用MyBatis-Flex自带的方法来操作数据库(个人感觉是超级方便的),这个东西下篇再说哈哈哈哈。
如有问题可下方评论留言