- MyBatis简介
MyBatis用于持久层框架,持久层是对数据库操作的部分,前版本iBatis 由Apache软件基金组织进行更名并维护。
特点:
简化数据库的操作
SQL映射灵活(半ORM框架)
支持高级映射
易于集成维护
配置动态SQL
缓存机制
功能:
替代JDBC,JDBC是java中提供的用于操作数据库的技术及方案
- 数据库的连接控制难。连接池
- SQL语句硬编码。将sql语句存放到xml配置文件中
- 参数传递问题。提供类型适配器
- 返回值问题。响应对象注入
总结:
- MyBaits 让程序开发者的工作聚焦在业务成面而不是SQL处理的层面
- 抗拒数据格式不匹配的问题
执行原理
代码详解:
1、MyBatis的核心配置文件 通常命名为 mybatis-config.xml
它用于配置 MyBatis 的全局设置,包括数据库连接信息、事务管理器、数据源、映射文件等。
<?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>
<!-- 数据库连接相关配置-->
<environments default="development">
<environment id = "development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="318605"/>
</dataSource>
</environment>
</environments>
<!-- 关联映射文件-->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
-
<?xml version="1.0" encoding="UTF-8" ?>
:声明这是一个 XML 文件,版本为 1.0,编码为 UTF-8。 -
<!DOCTYPE configuration ...>
:声明这个 XML 文件遵循 MyBatis 3.0 的 DTD(文档类型定义),DTD 定义了 XML 文件的结构和规则。 -
<configuration> 根元素 所有配置都在这个标签内
environments
标签用于配置 MyBatis 的环境,default
属性指定默认使用的环境 ID-
environment
标签定义了一个具体的环境配置,id
属性用于唯一标识这个环境。 -
transactionManager
标签用于配置事务管理器,type="JDBC"
表示使用 JDBC 事务管理器 -
dataSource
标签用于配置数据源,type="POOLED"
表示使用连接池数据源。 -
property
标签用于配置数据源的具体属性:-
driver
:数据库驱动类名。 -
url
:数据库连接 URL。 -
username
:数据库用户名。 -
password
:数据库密码。
-
-
mappers
标签用于配置 MyBatis 的映射文件(Mapper 文件),mapper
标签指定了映射文件的位置,resource
属性指定了映射文件的路径。
这个 mybatis-config.xml
文件是 MyBatis 的核心配置文件,用于配置数据库连接、事务管理器、数据源和映射文件等信息。将它放在 resources
目录下是为了确保它在类路径中,MyBatis 能够正确加载并使用它。这种放置方式符合 Java 项目的标准结构,有助于项目的管理和维护。
2、数据库映射文件
<?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 namespace = "org.example.dao.UserMapper">
<select id = "selectUserById" parameterType="int" resultType="org.example.pojo.User">
select * from user where id = #{id};
</select>
<select id = "findUserByName" parameterType="string" resultType="org.example.pojo.User">
select * from user where username like '%${value}%'
</select>
</mapper>
-
mapper
标签是 Mapper 文件的根元素。 -
namespace
属性指定了这个 Mapper 文件的命名空间,通常是一个 Java 接口的全限定名(包括包名和类名)。MyBatis 会通过这个命名空间将 Mapper 文件与对应的 Java 接口绑定。 -
<select>
标签用于定义一条查询语句。 -
id
属性指定了这个 SQL 语句的唯一标识符,通常与 Java 接口中的方法名一致。 -
parameterType
属性指定了 SQL 语句的参数类型,这里是int
,表示传入的参数是一个整数。 -
resultType
属性指定了 SQL 语句的返回结果类型,这里是org.example.pojo.User
,表示查询结果会被映射到一个User
对象中。 -
SQL 语句:
select * from user where id = #{id};
是一个简单的查询语句,#{id}
是 MyBatis 的参数占位符,表示传入的参数值。
3、用户类
package org.example.pojo;
import java.util.Date;
public class User {
private int id;
private String name;
private Date Birthday;
private int sex;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return Birthday;
}
public void setBirthday(Date birthday) {
Birthday = birthday;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", Birthday=" + Birthday +
", sex=" + sex +
", phone='" + phone + '\'' +
'}';
}
}
4、接口类
package org.example.dao;
import org.example.pojo.User;
public interface UserMapper {
public User selectUserById(int id);
}
5、Test类
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.example.dao.UserMapper;
import org.example.pojo.User;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class UserMapperTest {
@Test
public void findUserByIdTest() throws IOException {
// 1. 加载mybatis核心配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2 创建SQL工厂
// 3. 获取SQL工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sql会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 5.执行sql
User user = userMapper.selectUserById(31);
System.out.println(user);
sqlSession.close();
}
}
-
@Test
注解表示这是一个 JUnit 测试方法。 -
SqlMapConfig.xml
是 MyBatis 的核心配置文件,通常包含数据库连接信息、事务管理器、数据源配置等。 -
Resources.getResourceAsStream
方法从类路径中加载配置文件,并返回一个输入流。 -
SqlSessionFactoryBuilder
用于解析配置文件并创建SqlSessionFactory
。 -
SqlSessionFactory
是 MyBatis 的核心对象,用于创建SqlSession
。 -
SqlSession
是 MyBatis 的核心接口,用于执行 SQL 语句、获取 Mapper 接口的代理对象以及管理事务。 -
openSession
方法创建一个新的SqlSession
实例。 -
getMapper
方法根据接口类型动态生成UserMapper
的代理对象。 -
这个代理对象会与 Mapper 文件中的 SQL 语句绑定。
-
调用
selectUserById
方法,传入用户 ID(这里是31
)。 -
MyBatis 会根据 Mapper 文件中的 SQL 语句执行查询,并将结果映射到
User
对象中。 -
查询结果通过
System.out.println
输出。
注意如果对于 增加删除修改 需要使用sqlSession.commit() 提交事务
整体流程
-
加载核心配置文件:
-
MyBatis 从
SqlMapConfig.xml
中读取全局配置,包括数据库连接信息、事务管理器、数据源等。
-
-
创建
SqlSessionFactory
:-
通过
SqlSessionFactoryBuilder
解析配置文件并创建SqlSessionFactory
。 -
SqlSessionFactory
是线程安全的,通常在整个应用中只需要一个实例。
-
-
获取
SqlSession
:-
通过
SqlSessionFactory
创建SqlSession
。 -
SqlSession
是 MyBatis 的核心对象,用于执行 SQL 语句和管理事务。
-
-
获取 Mapper 接口的代理对象:
-
通过
SqlSession.getMapper
方法获取UserMapper
接口的代理对象。 -
这个代理对象会与 Mapper 文件中的 SQL 语句绑定。
-
-
执行 SQL 查询:
-
调用
selectUserById
方法,MyBatis 会根据 Mapper 文件中的 SQL 语句执行查询。 -
查询结果会被映射到
User
对象中。
-
-
关闭资源:
-
关闭
SqlSession
,释放数据库连接资源。
-
文件之间的关系
-
SqlMapConfig.xml
:-
MyBatis 的核心配置文件,定义了全局配置和 Mapper 文件的位置。
-
例如:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="318605"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
-
-
UserMapper.xml
:-
Mapper 映射文件,定义了 SQL 语句与 Java 方法的映射关系。
-
例如:
<mapper namespace="org.example.dao.UserMapper"> <select id="selectUserById" parameterType="int" resultType="org.example.pojo.User"> select * from user where id = #{id}; </select> </mapper>
-
-
UserMapper
接口:-
定义了数据库操作的方法。
-
例如:
public interface UserMapper { User selectUserById(int id); }
-
-
User
类:-
表示用户实体,与数据库中的
user
表对应。 -
例如:
public class User { private int id; private String name; private Date Birthday; private int sex; private String phone; // getter 和 setter 方法 }
-
-
UserMapperTest
类:-
测试类,用于验证
UserMapper
接口的功能。
-
总结
-
UserMapperTest
类:通过加载 MyBatis 配置文件、创建SqlSessionFactory
和SqlSession
,获取UserMapper
的代理对象,并执行 SQL 查询。 -
整体流程:配置文件 →
SqlSessionFactory
→SqlSession
→ Mapper 代理对象 → SQL 查询 → 结果映射。 -
文件关系:
-
SqlMapConfig.xml
配置全局设置和 Mapper 文件位置。 -
UserMapper.xml
定义 SQL 语句与 Java 方法的映射。 -
UserMapper
接口定义数据库操作方法。 -
User
类表示用户实体。
-
-
这种设计使得数据库操作更加面向对象,代码更加简洁和易于维护。