MyBatis 是一个半自动化的持久层框架,它允许用户自己编写 SQL 语句,并通过简单的 XML 或注解来配置映射关系。MyBatis 的核心优势在于其灵活性和对 SQL 的完全控制能力。用户可以直接书写原生的 SQL 语句,进行更细粒度的优化,这对于复杂和性能要求高的查询来说是一个很大的优势。需要注意Mybatis并没有实现J2EE的JPA规范。
官方清晰入门教程 传送门
1. mybatis使用示例
1.1. 添加 MyBatis 依赖
首先,在项目中添加 MyBatis 的依赖。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>MyBatis版本号</version>
</dependency>
1.2. 配置 MyBatis
MyBatis 的配置可以通过 XML 文件或者 Java 代码来完成。最常见的是使用 mybatis-config.xml 配置文件来配置 MyBatis。
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="数据库驱动"/>
<property name="url" value="数据库URL"/>
<property name="username" value="数据库用户名"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
1.3. 创建操作对象实体,Mapper 接口和 XML 映射文件
创建操作对象实体,如User
public class User {
private Integer id;
private String username;
private String password;
private String email;
// 增加对应的Getter 和 Setter 方法
...
}
创建一个 Java 接口,定义执行的操作,例如:
public interface UserMapper {
User getUserById(int id);
}
然后创建一个 XML 映射文件,定义 SQL 语句和结果映射:
<?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.mybatis.example.UserMapper">
<select id="getUserById" resultType="User">
select * from users where id = #{id}
</select>
</mapper>
1.4. 执行 SQL 操作
使用 SqlSessionFactoryBuilder 来创建 SqlSessionFactory,然后使用 SqlSessionFactory 来创建 SqlSession,最后通过 SqlSession 执行数据库操作。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user.getUsername());
}
以上是 MyBatis 的基本使用流程。MyBatis 还支持更多高级特性,如动态 SQL、日志、插件等,可以根据项目的需要进行学习和使用。
2. mybatis执行过程
3. mybatis核心类
- SqlSessionFactoryBuilder
用来创建会话工厂,最佳作用域:使用完就丢弃。 - SqlSessionFactory
用来创建会话,最佳作用域:应用级别,单列最好。 - SqlSession
数据库链接会话,提供给用户执行sql,最佳作用域:请求或作用方法,非线程安全。 - Executor
SqlSession持有,真正用于执行sql.其有多个实现类如下:
- CachingExecutor用于二级缓存,代理模式,内部持有一个实现了缓存的Executor类。
- SimpleExecutor
最简单的执行器,根据对应的sql直接执行,每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。(可以是Statement或PrepareStatement对象) - ReuseExecutor
ReuseExecutor与其它SimpleExecutor的区别是重用jdbc的Statement,该类内部维护了一个sql与Statement对映射集合。 - BatchExecutor
批处理执行器,用于将多个SQL一次性输出到数据库。
- StatementHandler
用来根据MappedStatement获取Statement - ParameterHandler
用来处理参数绑定,将用户传入的参数半丁到sql上 - ResultSetHandler
用来处理结果绑定,将查询结果数据列转换为对象列表 - TypeHandler
负责java数据类型和jdbc数据类型之间的映射和转换
4. mybatis Executor的指定
mybatis默认使用对Executor为SimpleExecutor,如果需要指定,在配置文件Setting节点设置defaultExecutorType参数对值。
参数设定传送门
5. 高级使用
5.1. 拦截器
MyBatis 拦截器是 MyBatis 提供的一种强大的机制,允许用户在 SQL 执行过程中的某个特定点进行拦截,以实现特定的功能。拦截器可以用于多种用途,比如日志记录、性能监控、权限校验等。
要使用 MyBatis 拦截器,需要遵循以下步骤:
5.1.1. 创建拦截器类
创建一个类实现 Interceptor 接口,或者继承 Interceptor 接口的实现类,比如 Plugin 类。在这个类中,可以覆盖以下方法:
- intercept(Invocation invocation): 实现拦截时需要执行的逻辑。
- plugin(Object target): 用于生成目标对象的代理,可以通过该方法决定是否需要对目标对象进行代理。
- setProperties(Properties properties): 用于设置拦截器所需的属性。
5.1.2. 注册拦截器
将创建的拦截器注册到 MyBatis 的配置中。可以通过以下几种方式:
在 MyBatis 的配置文件 mybatis-config.xml 中注册:
xml
<plugins>
<plugin interceptor="com.example.MyInterceptor">
<!-- 配置拦截器属性 -->
<property name="someProperty" value="100"/>
</plugin>
</plugins>
在 MyBatis 的 Java 配置中注册:
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
MyInterceptor interceptor = new MyInterceptor();
interceptor.setSomeProperty("100");
configuration.addInterceptor(interceptor);
};
}
5.1.3. 使用拦截器
一旦拦截器被注册,MyBatis 在执行 SQL 语句时,就会在指定的拦截点调用的拦截器逻辑。
注意事项
- 拦截器的执行顺序是由注册顺序决定的。
- 应确保拦截器的实现不会对 MyBatis 的核心功能产生副作用。
- 考虑到性能,不要在拦截器中执行过于复杂的逻辑。
- 通过使用 MyBatis 拦截器,可以灵活地在 SQL 执行的前后插入自己的处理逻辑,以实现特定的需求。