JAVA-Web后端学习4 MyBatis
愛してるばんざーい!ここでよかった 私たちの今がここにある
MyBatis介绍
JDBC代码疑似是有些太复杂了,而且也不太符合我们之前要求的模块化编程,所以我们使用MyBatis框架来进行简化。
MyBatis是一款优秀的持久层框架,用于简化JDBC开发。MyBatis在底层仍然使用 JDBC 来访问数据库,但封装了 JDBC 的复杂性,提供了更简洁、更易用的 API。
//原来的JDBC连接代码
public class JdbcTest {
@Test
public void testQuery() throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/dbtest";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url,username,password);
//3.获取SQL语句执行对象
PreparedStatement pstmt = connection.prepareStatement("select * from user where username = ? and age = ?");
//4.执行SQL
pstmt.setString(1,"lvbu");
pstmt.setInt(2,28);
ResultSet rs = pstmt.executeQuery();
//5.处理结果集
while(rs.next()) {
UserData userData = new UserData(
rs.getInt("id"),
rs.getString("username"),
rs.getString("password"),
rs.getString("name"),
rs.getInt("age")
);
System.out.println(userData);
}
//6.释放资源
pstmt.close();
connection.close();
}
}
//MyBatis框架核心代码
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<UserData> findAll();
}
MyBatis入门编程
首先是准备工作,创建一个SpringBoot工程并引入MyBatis依赖

接下来创建数据库,数据表以及相应的数据封装实类,这里就直接略过了
然后在MyBatis的配置文件application.properties中引入相关的数据库驱动依赖
spring.application.name=Mybatis
# 配置数据库的连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/dbtest //数据库地址
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //MYSQL驱动
spring.datasource.username=root //登录数据库用户名
spring.datasource.password=123456 //登录数据库密码
接下来 配置MyBatis的持久层接口
这是我们使用到了两个注解@Mapper和@Select
@Mapper 注解是一个重要的标记注解,用于标识接口,使得 MyBatis 能够识别并将其与相应的 SQL 映射关联起来。使用@Mapper注解的接口,应用程序运行时会自动为该接口创建一个实现类对象(代理对象),并且自动存入IOC容器。
@Select注解是一种用于定义DQL语句的注解,它允许开发者以声明式的方式编写查询操作,从而简化了数据库查询的编写过程。
@Mapper //
public interface UserMapper {
@Select("select * from user")
public List<UserData> findAll();
}
最后,准备单元测试类
@SpringBootTest //SpringBoot中单元测试的注解 - 当前测试类中的测试方法运行时会启动SpringBoot项目
class MybatisApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testFindAll() {
List<UserData> userList = userMapper.findAll();
userList.forEach(System.out::println);
}
}
运行结果如下:

MyBatis辅助配置
MyBatis中存在一些辅助配置,凭借这些可以提高我们的开发效率
MYSQL语句识别
在IDEA中的@Select中添加MYSQL语句时没有相关提示,因为默认是不识别SQL语句的,那么我们可以注入MYSQL语言
在IDEA中的@Select中的MYSQL语句处右击,然后点击Show Context Actions(显示上下文操作),然后选择Inject language or reference(注入语言或引用),选择MYSQL,这样IDEA就可以识别MYSQL了
配置完后,不出意外user报错了

因为IDEA没有和数据库(database)建立连接,也就无法识别其中的表user,所以我们在建立数据源连接的时候需要指定数据库

接下来发现IDEA无报错,且可以识别数据库相关字段

MYSQL日志输出
在MyBatis配置文件application.properties中加入这一行
# 配置MyBatis日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
接下来执行代码,日志输出如下所示:

JDBC对比MyBatis
JDBC存在三大问题
①代码中需要设置数据库连接以及登录用户名密码的硬编码问题,
②代码繁琐
③涉及到大量连接,资源浪费,性能降低
相较于JDBC,MyBatis只需要考虑两个核心步骤:①application.properties文件的配置 ②Mapper接口层的设置
MyBatis数据库连接池
数据库连接池类似于线程池,负责管理分配数据库连接,允许应用程序多次复用同一个现有的数据库连接,而不是重新建立一个;如果连接保持空闲时间超过最大空闲时间,那么数据库连接池就会自动释放连接从而避免没有释放连接引起的数据库连接遗漏。
优点:①资源重用 ②统一管理提升系统响应速度 ③避免数据库遗漏
数据库连接池标准接口为:DataSource 其核心方法如下:
Connection getConnection() throws SQLExeception; //功能:获取连接
常见产品为:C3P0,DBCP,Druid(常见),Hikari(常见,SpringBoot默认)
我们可以查看IDEA的运行日志,发现了Hikari的存在,其中划线处为添加连接

切换连接池
切换连接池需要做两步,修改POM.XML和application.properties
这是切换为国内的Druid的连接池
//POM.XML中配置依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.19</version>
</dependency>
//application.properties中添加druid的DataSource连接信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
MyBatis完成增删改查
入门MyBatis语句之后,使用MyBatis完成SQL的增删改查操作,其实相较于之前都大差不差
其中为防止硬编码,使用#作为占位符,(有的时候也会看见$占位符,但是常用的是前者)
删除操作
//UserMapper.java中定义
@Delete("delete from user where id = #{id}")
public void deleteByID(Integer id);
//测试方法中调用
@Test
public void testDelete() {
userMapper.deleteByID(5);
}
修改操作
这里一定要保证占位符后接的变量名与结构体变量名一致,接下来的插入操作也是如此
//UserMapper.java中定义
@Update("update user set username = #{username},password = #{password},name = #{name},age = #{age} where id = #{id}")
public void updateByID(UserData userData);
//测试方法中调用
@Test
public void testUpdate() {
UserData userData = new UserData(
6,"xiaohu","123456","小虎",30
);
userMapper.updateByID(userData);
}
插入操作
//UserMapper.java中定义
@Update("update user set username = #{username},password = #{password},name = #{name},age = #{age} where id = #{id}")
public void updateByID(UserData userData);
//测试方法中调用
@Test
public void testInsert() {
UserData userData = new UserData(
null,"zhouyu","123456","周瑜",18
);
userMapper.insertValues(userData);
}
查询操作
//UserMapper.java中定义
@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(String username, String password);
//测试方法中调用
@Test
public void testSelect() {
List<UserData> userList = userMapper.selectByUsernameAndPassword("xiaohu","123456");;
userList.forEach(System.out::println);
}
值得注意的是,在有的旧版本中,MyBatis编译之后是无法识别传递进来的username和password的
啥意思,就是说传递进来编译之后是这样的,从而导致无法识别
@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(String var1, String var2);
所以需要添加@Param注解,这个需要根据代码版本来了,最新版本的就不用这么做
@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(@Param("username") String username,@Param("password") String password);
MyBatis的XML映射配置
对于复杂的SQL语句来说,使用注解还是太麻烦了,而现在常用的都是用XML配置文件
XML入门配置
首先在resources下设置和MyBatis持久层接口Mapper一模一样的包路径,然后定义和Mapper名称一样的XML配置文件
其中注意,新建包路径一定要使用/将多级目录分开,否则容易报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.example.mapper.UserMapper.findAll,也就是MyBatis无法找到与Mapper接口方法对应的SQL语句

XML文件中namespace属性要和Mapper接口全限定名保持一致,sql语句的id要和Mapper接口中的方法名一直且保持返回类型一致
//UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.UserMapper">
<!-- resultType查询返回单条记录的类型-->
<select id="SelectAll" resultType="org.example.pojo.UserData">
select * from user
</select>
</mapper>
接下来,配置Mapper接口和单元测试方法
//Mapper接口
@Mapper
public interface UserMapper {
public List<UserData> SelectAll();
}
//MyBatisXmlTestApplicationTests.java 单元测试类
@SpringBootTest
class MyBatisXmlTestApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectAll() {
List<UserData> userData = userMapper.SelectAll();
userData.forEach(System.out::println);
}
}
接下来,测试运行,结果如下:

XML辅助配置
配置XML映射文件位置
如果我们不想在resources下设置和MyBatis持久层接口Mapper一模一样的包路径,那么在application.properties中设置XML映射文件位置
# 指定XML映射配置文件的位置
mybatis.mapper-locations=classpath:mapper/*.xml

MyBatisX插件
在IDEA插件中下载MyBatisX插件,从而提升MyBatis的开发效率


浙公网安备 33010602011771号