目录
1.什么是Mybatis
MyBatis 是一个开源的 Java 持久层框架,它是 Apache 软件基金会旗下的一个子项目。MyBatis 的主要目标是简化数据库访问层的开发,提供了一种将 SQL 语句和 Java 方法进行映射的方式,使得开发者可以通过 XML 或者注解的方式配置 SQL 映射关系,从而在 Java 代码中直接调用相应的方法执行 SQL 操作,而无需编写繁琐的 JDBC 代码。MyBatis 还提供了许多高级功能,如动态 SQL、结果映射、缓存机制等,使得开发者可以更加灵活和高效地操作数据库。MyBatis 被广泛应用于 Java 开发领域,特别是在企业级应用和中小型项目中。
Mybatis框架是一个ORM(对象关系映射)框架,用于将对象模型和关系型数据库之间的数据进行映射。ORM 框架就是用来实现 ORM 技术的软件框架,它们简化了开发者对数据库的操作,通过将数据库表和行映射到面向对象的模型,使得开发者可以使用面向对象的方式来操作数据库,而不必编写繁琐的 SQL 查询和数据库访问代码。
2.mybatis的优势
- 简化 SQL 编写: MyBatis 通过 XML 配置或注解方式,将 SQL 语句与 Java 方法进行映射,避免了在 Java 代码中编写大量的 SQL 语句,使得代码更加清晰和易于维护。
- 灵活性: MyBatis 允许开发者直接编写 SQL 语句,从而具有更高的灵活性。开发者可以根据实际需求编写复杂的 SQL 查询,并且可以充分利用数据库的特性。
-
参数映射: MyBatis 支持将 Java 对象直接作为参数传递给 SQL 语句,无需手动设置参数类型和值,简化了参数处理过程。
-
结果集映射: MyBatis 支持将数据库查询结果映射为 Java 对象,使得开发者可以直接操作 Java 对象而无需手动解析结果集,提高了代码的可读性和可维护性。
-
缓存机制: MyBatis 提供了一级缓存和二级缓存机制,可以缓存查询结果,减少数据库访问次数,提高系统性能。
-
事务管理: MyBatis 提供了事务管理功能,可以通过配置文件或者注解来管理事务,简化了事务处理的过程。
-
异常处理: MyBatis 封装了 JDBC 的异常处理,提供了更友好和更具可读性的异常信息,便于开发者排查问题。
-
整合性: MyBatis 能够与 Spring、Spring Boot 等常用的 Java 开发框架深度整合,使得在实际项目中的应用更为便捷。
MyBatis 相较于 JDBC 具有更高的抽象程度、更强的灵活性和可扩展性,能够简化开发过程,提高代码的可读性和可维护性,并且在性能优化和缓存管理方面也有一定的优势。
3.环境搭建
-
创建工程
项目目录结构
-
引入相关依赖
- 由于项目要连接数据库以及对程序进行测试,所以想要在pom.xml文件中导入MySQL驱动包,Jnuit测试包,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- <scope>test</scope>-->
<scope>compile</scope>
</dependency>
</dependencies>
</project>
IDEA默认集成Maven,第一次引入依赖时候,需要在联网状态下进行,且引入依赖需要较长时间,耐心等待依赖完成即可。
-
数据库准备
创建一个名为mybatis的数据库。
create database mybatis;
-
编写数据库连接信息配置文件
在项目src/main/resources目录下创建数据库连接的配置文件,命名为db.properties,在该文件中配置数据库连接的参数。
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8
mysql.username=root
mysql.password=123456
前缀.键=值,driver表示mysql的驱动,url表示mysql子协议(localhost表示本地3306,mybatis为创建的库名,servertimezone表示时区,characterencoding表示编码方式)
-
编写核心配置文件和映射文件
在项目的src/main/resources目录下创建核心配置文件,用于项目的环境配置,如数据库连接相关配置等,通常命名为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>
<!-- 环境配置 -->
<!-- 加载类路径下的属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!---->
</configuration>
-
数据的准备
在mybatis数据库创建users表,插入两条记录。
use mybatis;
create table user(
uid int primary key auto_increment,
uname varchar(20) not null,
uage int not null
);
insert into users(uid,uname,uage) values(1,'张三',20),(2,'李四',18);
-
创建POJO实体
在项目的src/main/java目录下创建org.example.pojo包,在org.example.pojo包下创建User类,该类用于封装User对象的属性。
package org.example.pojo;
public class User {
private int uid; //用户id
private String uname; //用户姓名
private int uage; //用户年龄
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", uage=" + uage +
'}';
}
}
-
创建映射文件UserMapper.xml
在src/main/resources目录下创建一个文件夹mapper用于放置映射文件UserMapper.xml,实现SQL语句和Java对象之间的映射,将查询到的关系数据封装成java对象。
<?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为映射的根节点-->
<!-- mapper为映射的根节点,namespace指定Dao接口的完整类名
mybatis会依据这个接口动态创建一个实现类去实现这个接口,
而这个实现类是一个Mapper对象-->
<mapper namespace="org.example.pojo.User">
<!--select:查询statement(声明)
id ="接口中的方法名,语句的唯一标识"
parameterType="传入的参数类型,可省略"
resultType = "配置返回的结果集类型,返回实体类对象,使用包.类名"-->
<select id="findById" parameterType="int"
resultType="org.example.pojo.User">
select * from users where uid = #{id}
</select>
</mapper>
-
修改mybatis-config.xml配置文件
在配置文件中添加UserMapper.xml映射文件路径的配置,用于将映射文件加载到程序中。
<!--设置配置映射文件的位置-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
<!--添加到configiguration标签里面,environment标签下面-->
-
编写测试类
在src/test/java目录下创建test包,包下创建UserTest类,用于程序测试。
package Test;
import org.example.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
public class UserTest {
@Test
public void FindById() {
//读取文件名
String resources = "mybatis-config.xml";
//创建流
Reader reader = null;
try {
//读取mybatis-config.xml文件内容到reader对象中
reader = Resources.getResourceAsReader(resources);
} catch (IOException e) {
e.printStackTrace();
}
//初始化mybatis数据库,创建SqlSessionFactory类的实例
SqlSessionFactory sqlMapper = new
SqlSessionFactoryBuilder().build(reader);
//创建SqlSession对象
SqlSession session = sqlMapper.openSession();
//传入参数查询,返回结果
User user = session.selectOne("org.example.pojo.User.findById", 1);
//输出结果
System.out.println(user.getUname());
//关闭session
session.close();
}
}
运行结果显示
4.工作原理
-
加载配置: MyBatis 通过读取配置文件(通常是
mybatis-config.xml
)来获取配置信息,包括数据库连接信息、映射文件路径、插件等。这个过程一般由SqlSessionFactoryBuilder
来完成。 -
创建 SqlSessionFactory: 基于加载的配置信息,MyBatis 构建
SqlSessionFactory
对象。SqlSessionFactory
是一个线程安全的对象,用于创建SqlSession
。 -
创建 SqlSession: 当应用程序需要与数据库进行交互时,它会请求
SqlSessionFactory
创建一个新的SqlSession
。SqlSession
提供了对数据库操作的各种方法,包括执行 SQL、获取 Mapper 等。 -
执行 SQL: 应用程序通过
SqlSession
执行 SQL 语句。这些 SQL 语句可以是直接在代码中写的、在 XML 文件中定义的,或者是通过注解指定的。SqlSession
会将 SQL 语句发送到数据库并返回结果。 -
映射处理: MyBatis 将查询结果映射为 Java 对象。这个过程可以通过配置文件中的映射规则、注解或者接口中的方法来定义。MyBatis 将查询结果按照映射规则转换成 Java 对象,并返回给应用程序。
-
事务管理: 如果配置了事务管理器,MyBatis 将会在
SqlSession
的操作中处理事务。事务管理可以是基于 JDBC 的、基于 Spring 的声明式事务管理,或者是自定义的事务管理器。 -
关闭资源: 在完成数据库操作后,应用程序需要关闭
SqlSession
。关闭SqlSession
会释放数据库连接和其他资源。