MyBatis 是一个优秀的持久层框架,它对JDBC进行了封装,简化了数据库操作。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,能够使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,简单的Java对象)映射成数据库中的记录。
入门篇:MyBatis 基础概念
什么是MyBatis?
MyBatis 是一个半ORM(对象关系映射)框架,它允许我们使用Java对象操作数据库。相比于完全的ORM框架如Hibernate,MyBatis 更加灵活,它只处理SQL语句的映射,而业务逻辑仍然由我们编写。
MyBatis 的核心组件
- SqlSession:是MyBatis 的核心接口,它包含执行SQL所需的所有方法。
- Executor:执行器接口,MyBatis 有多种执行器实现,如简单执行器、批处理执行器等。
- StatementHandler:用于执行预处理语句。
- ParameterHandler:用于处理SQL语句中的参数。
- ResultHandler:用于处理查询结果。
- Mapper:MyBatis 的核心,映射文件中的SQL与Java接口方法一一对应。
基础用法:配置与使用MyBatis
配置MyBatis
首先,我们需要在pom.xml文件中添加MyBatis的依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
然后,在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/mydatabase"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mycompany/myapp/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
编写Mapper接口和XML映射文件
在com/mycompany/myapp/mapper目录下创建EmployeeMapper.java接口:
package com.mycompany.myapp.mapper;
import com.mycompany.myapp.domain.Employee;
public interface EmployeeMapper {
Employee getEmployeeById(int id);
}
然后,在同一个目录下创建EmployeeMapper.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.mycompany.myapp.mapper.EmployeeMapper">
<select id="getEmployeeById" resultType="com.mycompany.myapp.domain.Employee">
SELECT * FROM employee WHERE id = #{id}
</select>
</mapper>
使用MyBatis
现在,我们可以创建一个SqlSessionFactory,然后使用它来创建SqlSession:
public class Main {
public static void main(String[] args) {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
Employee employee = session.selectOne("com.mycompany.myapp.mapper.EmployeeMapper.getEmployeeById", 1);
System.out.println(employee);
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
进阶篇:MyBatis 高级技巧
动态SQL
MyBatis 支持动态SQL,可以通过<if>、<choose>、<when>、<otherwise>等标签来编写动态SQL。
<select id="findEmployeeByCondition" resultType="Employee">
SELECT * FROM employee
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
缓存
MyBatis 支持两种缓存机制:一级缓存和二级缓存。
- 一级缓存:默认开启,在同一个
SqlSession中,相同查询条件下查询结果会被缓存。 - 二级缓存:需要在
mybatis-config.xml中开启,并在映射文件中配置。
批处理
MyBatis 支持批处理,可以减少数据库访问次数,提高性能。
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
session.insert("com.mycompany.myapp.mapper.EmployeeMapper.insertEmployee", employee1);
session.insert("com.mycompany.myapp.mapper.EmployeeMapper.insertEmployee", employee2);
session.flushStatements();
session.commit();
session.close();
总结
MyBatis 是一个功能强大的Java开源框架,通过本文的介绍,相信你已经对MyBatis有了基本的了解。通过学习和实践,你将能够运用MyBatis解决各种数据库操作问题,提高开发效率。
