什么是MyBatis?
MyBatis是一个优秀的持久层框架,它简化了数据库访问和操作的过程,同时提供了强大的SQL解析和映射功能,使得开发人员可以通过简单的配置来实现复杂的数据库操作。MyBatis是一种ORM(Object Relational Mapping)框架,它能够将关系型数据库中的数据映射成为面向对象的Java对象,从而实现对象与数据库之间的无缝转换。
Mybatis整体架构
基础支持层
基础支持层主要负责与数据库交互的基本功能,包括连接数据库、执行SQL语句、处理事务等。这部分功能主要由SqlSession接口和SqlSessionFactory接口定义。SqlSessionFactory是一个工厂类,用于创建SqlSession对象,而SqlSession则负责执行SQL语句和管理事务。
接口层
接口层是MyBatis的重要特性之一,它将Mapper接口与XML配置文件进行绑定,使得开发人员可以通过Java接口来调用SQL语句,而无需编写繁琐的SQL语句和结果映射代码。接口层主要由org.apache.ibatis.annotations包中的注解和接口组成,以及org.apache.ibatis.binding.MapperProxy类实现.
核心处理层
核心处理层主要包含了MyBatis框架的核心功能,包括SQL解析、参数处理、结果映射等。这部分功能主要由org.apache.ibatis.executor.Executor接口和相关实现类完成。Executor接口定义了数据库操作的基本方法,而具体的实现类负责具体的SQL执行和结果处理。
Mybatis对比传统JDBC
JDBC方式
我们先来看使用传统JDBC来查询数据库数据处理
public User getUserById(int id) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
User user = null;
try {
// 建立数据库连接
connection = DriverManager.getConnection(url, username, password);
// 定义SQL语句
String sql = "SELECT * FROM user WHERE id = ?";
// 创建预编译的SQL语句
statement = connection.prepareStatement(sql);
statement.setInt(1, id); // 设置SQL语句中的参数
// 执行查询并获取结果集
resultSet = statement.executeQuery();
// 处理结果集
if (resultSet.next()) {
user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setAge(resultSet.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源,释放数据库连接
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
Mybatis方式
// 1.创建XML配置文件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>
<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://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/apache/ibatis/demo/dao/UserMapper.xml"/>
</mappers>
</configuration>
// 2.创建MyBatis的映射文件UserMapper.xml
<?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.apache.ibatis.demo.dao.UserMapper">
<select id="selectById" resultType="org.apache.ibatis.demo.domain.User">
select * from user where id = #{id}
</select>
</mapper>
// 3.创建Java类User,用于映射数据库表中的数据
@Data
public class User {
private int id;
private String name;
private int age;
}
// 4.创建一个UserMapper接口,用于定义MyBatis映射文件中的SQL操作方法
public interface UserMapper {
User selectById(int id);
}
// 5.操作数据
public class Main {
public static void main(String[] args) {
// 创建MyBatis的SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
// 获取SqlSession对象
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 获取UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询id为1的用户数据
User user = userMapper.getUserById(1);
System.out.println(user);
}
}
}
对比
// 相比传统的JDBC方式,MyBatis具有以下优势:
1.简化SQL编写
MyBatis通过XML配置或注解来生成SQL语句和结果映射,使得开发人员不再需要手动编写大量的SQL语句和结果集映射代码。
2.提供对象关系映射
MyBatis支持将数据库表和Java对象之间进行映射,开发人员可以通过面向对象的方式来操作数据库,减少了数据转换的工作。
3.动态SQL支持
MyBatis可以根据不同的条件生成不同的SQL语句,实现动态SQL,而传统JDBC需要手动拼接SQL语句。
4.缓存机制
MyBatis支持缓存查询结果,可以提高查询性能,减少对数据库的访问次数。
源码编译
后续我们将结合源码来学习Mybatis,可以通过下面地址(https://www.cnblogs.com/mokingone/p/9108999.html)编译Mybatis源码,方便后面的学习.