1、介绍
1.1简介
- MyBatis 是一个优秀的持久层框架,它内部封装了 JDBC,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 Connection、创建 Statement、手动设置参数、获取结果集等 JDBC 繁杂的过程。
1.2主要特点和介绍
- 对象关系映射 (ORM):O:Object 对象 R:Relational 关系 M:Mapping 映射。MyBatis 提供了一种简单而强大的方法将数据库中的记录映射到 Java 对象。这使得开发者能够更直观地与数据库进行交互,无需直接编写繁琐的 JDBC 代码。开发者可以使用 MyBatis 的 XML 配置文件或注解来定义这些映射关系。
- 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,如
<if>
、<choose>
、<when>
、<otherwise>
等元素,可以根据不同的条件动态生成 SQL 语句。 - 参数处理:MyBatis 支持多种参数类型,如基本类型、JavaBean、Map 等,并且提供了参数占位符(如
#{}
)和直接拼接(如${}
)两种方式来处理参数。 - 结果映射:MyBatis 支持将查询结果映射到 Java 对象或集合中。可以通过 XML 或注解来配置结果映射。
- 插件扩展:MyBatis 允许通过编写插件来扩展其功能。
- 缓存机制:MyBatis 支持一级缓存(SqlSession 级别的缓存)和二级缓存(Mapper 级别的缓存)。通过配置缓存,可以提高查询效率,减少数据库访问次数。
- 事务管理:MyBatis 支持事务管理,可以通过配置事务管理器来管理事务。
- 与其他框架的集成:MyBatis 可以很容易地与 Spring、Struts2 等其他 Java 框架集成。
1.3功能架构
我们把Mybatis的功能架构分为三层:
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
1.4工作流程
- 读取配置文件:MyBatis 首先会读取配置文件(如 mybatis-config.xml),这个配置文件包含了数据库连接信息、Mapper 映射文件的位置等信息。
- 构建 SqlSessionFactory:使用 SqlSessionFactoryBuilder 类,根据配置文件中的信息构建 SqlSessionFactory 实例。SqlSessionFactory 是 MyBatis 的核心类之一,用于创建 SqlSession 对象。
- 创建 SqlSession:通过 SqlSessionFactory 实例创建 SqlSession 对象。SqlSession 是 MyBatis 中用于执行 SQL 语句和获取映射器(Mapper)实例的主要接口。
- 获取 Mapper:从 SqlSession 中获取 Mapper 代理对象。Mapper 是 MyBatis 中用于定义 SQL 语句和结果映射的接口。MyBatis 会根据 Mapper 接口和配置文件中的映射信息,动态生成 Mapper 的实现类,并返回其代理对象。
- 执行 SQL 语句:通过 Mapper 代理对象调用 SQL 语句。MyBatis 会根据 Mapper 接口中的方法名和参数,找到对应的 SQL 语句,并通过 JDBC 执行该 SQL 语句。
- 处理结果:MyBatis 会将 JDBC 返回的结果集(ResultSet)转换成 Java 对象,并返回给调用者。这个过程包括将结果集中的每一行数据映射到 Java 对象的属性上,以及处理可能的关联关系(如一对多、多对一等)。
- 关闭 SqlSession:在完成数据库操作后,需要关闭 SqlSession 对象,以释放 JDBC 连接等资源。
2、入门程序
1、准备一个数据库,这里我们使用mysql数据库创建一个user表并插入数据
CREATE DATABASE mybatis_demo;
USE mybatis_demo; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT NOT NULL
); INSERT INTO user (name, age) VALUES ('AAA', 25), ('BBB', 30);
2、创建maven项目,在pom.xml中添加MyBatis依赖
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version>
</dependency> <!-- MySQL JDBC 驱动 -->
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version>
</dependency>
3、在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> <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/mybatis_demo?useSSL=false&serverTimezone=UTC"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers>
</configuration>
4、在src/main/java/com/example/mapper目录下创建UserMapper.java接口
package com.example.mapper; import com.example.domain.User;
import java.util.List; public interface UserMapper { List<User> getAllUsers();
}
5、在src/main/resources/com/example/mapper目录下创建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="com.example.mapper.UserMapper"> <select id="getAllUsers" resultType="com.example.domain.User"> SELECT * FROM user </select>
</mapper>
6、创建Java实体类
package com.example.domain; public class User { private Integer id; private String name; private Integer age; // getters and setters... @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; }
}
7、编写测试代码
package com.example; import com.example.domain.User;
import com.example.mapper.UserMapper;
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 java.io.IOException;
import java.io.Reader;
import java.util.List; public class MyBatisDemo { public static void main(String[] args) { // 加载MyBatis配置文件 String resource = "mybatis-config.xml"; try (Reader reader = Resources.getResourceAsReader(resource)) { // 构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 获取SqlSession对象 try (SqlSession sqlSession = sqlSessionFactory.openSession()) { // 获取Mapper接口的实现类 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 调用Mapper接口中的方法,执行SQL语句 List<User> users = userMapper.getAllUsers(); // 处理结果 for (User user : users) { System.out.println(user); } // 提交事务(如果操作了数据库的话) // sqlSession.commit(); } } catch (IOException e) { e.printStackTrace(); } }
}