一、MyBatis 是什么?它解决了什么问题?
MyBatis 最初是 Apache 的一个开源项目 iBatis,2010 年更名为 MyBatis。它是一款支持定制化 SQL、存储过程以及高级映射的持久层框架,核心思想是将 SQL 语句与 Java 代码分离,让开发者能够更专注于 SQL 本身的编写,同时简化参数映射和结果集处理的过程。
在 JDBC 时代,开发者需要手动编写加载驱动、创建连接、处理结果集等重复代码,不仅繁琐,还容易出错。而 Hibernate 等全自动化 ORM 框架虽然简化了操作,却在复杂 SQL 场景下显得不够灵活,难以优化性能。MyBatis 的出现恰好弥补了两者的不足:它保留了 SQL 的灵活性,同时通过 XML 或注解的方式实现了参数和结果集的自动映射,让开发者在 “手写 SQL” 和 “自动化处理” 之间找到了完美平衡。
二、MyBatis 核心组件
要掌握 MyBatis,首先需要了解它的核心组件,这些组件相互配合,共同完成数据库操作的全流程:
SqlSessionFactoryBuilder:顾名思义,它是
SqlSessionFactory
的构建者。通过加载 MyBatis 的核心配置文件(通常是mybatis-config.xml
),生成SqlSessionFactory
实例,生命周期短暂,一般在程序启动时执行一次即可。SqlSessionFactory:作为创建
SqlSession
的工厂,它一旦被创建就会在应用程序运行期间一直存在,通常采用单例模式管理,避免频繁创建造成资源浪费。SqlSession:数据库操作的会话对象,提供了增删改查的方法,同时负责管理事务。它是线程不安全的,因此每次使用后需要及时关闭,通常通过
try-with-resources
语法确保资源释放。Mapper 接口:开发者定义的数据库操作接口,MyBatis 会通过动态代理为其生成实现类,将接口方法与 XML 映射文件中的 SQL 语句关联起来,无需手动编写实现类。
映射文件(Mapper XML):存储 SQL 语句的地方,通过
namespace
与 Mapper 接口绑定,支持动态 SQL、结果集映射等功能,是 MyBatis 灵活性的核心体现
三、MyBatis项目创建过程
1. 环境准备
- 引入依赖(以 Maven 为例):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
- 编写核心配置文件
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>
<!-- 配置全局配置 -->
<settings>
<!-- 允许下划线命名的列名自动映射到驼峰命名的属性 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--开发模式-->
<environments default="env">
<environment id="env">
<!--事务管理-->
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/summer_practice?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="162534"/>
</dataSource>
</environment>
</environments>
<!--映射器的注册-->
<mappers>
<mapper resource="com/ape/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
2. 定义实体类和 Mapper 接口
// 实体类
public class Student implements Serializable {
private int stuId;
private String stuName;
private String nickName;
private String stuSex;
private int stuAge;
@Override
public String toString() {
return "Student{" +
"stuId=" + stuId +
", stuName='" + stuName + '\'' +
", nickName='" + nickName + '\'' +
", stuSex='" + stuSex + '\'' +
", stuAge=" + stuAge +
'}';
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public Student(String stuName, String nickName, String stuSex, int stuAge) {
this.stuName = stuName;
this.nickName = nickName;
this.stuSex = stuSex;
this.stuAge = stuAge;
}
public Student() {
}
public Student(int stuId, String stuName, String nickName, String stuSex, int stuAge) {
this.stuId = stuId;
this.stuName = stuName;
this.nickName = nickName;
this.stuSex = stuSex;
this.stuAge = stuAge;
}
}
// Mapper接口
public interface StudentMapper {
public List<Student> selectStudent();
}
3. 编写映射文件StudentMapper.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.ape.mapper.StudentMapper">
<select id="selectStudent" resultType="com.ape.pojo.Student">
# select stu_id AS stuId,stu_name AS stuName,nick_name AS nickName,stu_age AS atuAge,stu_sex AS stuSex from student;
select * from student;
</select>
</mapper>
4. 测试
public class test {
InputStream is = null;
SqlSession session = null;
StudentMapper mapper = null;
@Before
public void beforeMethod(){
try {
//1.加载mybatis的主配置文件
is = Resources.getResourceAsStream("Mybatis_config.xml");
//2.创建SqlSessionFactoryBuilder(会话工厂制造器)
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//3.创建SqlSessionFactory(会话工厂对象)
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(is);
//4.创建SqlSession,类似jdbc的Connection与Statment的结合(会话对象)
session = factory.openSession();
//5.加载映射器(获取mapper映射器)
mapper = session.getMapper(StudentMapper.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@After
public void afterMethod(){
try {
//7.资源回收
session.close();
is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Test
public void test01() throws IOException {
//6.调用方法
List<Student> students = mapper.selectStudent();
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
System.out.println(student);
}
}
}
5、项目创建好的结构
四、总结
MyBatis 以其 “半自动化” 的特性,在灵活性和开发效率之间找到了平衡,成为 Java 持久层框架的佼佼者。它让开发者能够专注于 SQL 优化,同时通过映射机制简化参数和结果集处理,极大地提升了开发效率。无论是小型项目的快速开发,还是大型项目的复杂 SQL 场景,MyBatis 都能胜任。掌握 MyBatis,不仅是 Java 开发者的必备技能,更是理解数据持久层设计思想的重要途径。如果你还在为数据库操作的繁琐而困扰,不妨试试 MyBatis,相信它会给你带来全新的开发体验。