MyBatis 详解(原理 + 使用 + 常见面试题)
在 Java Web 开发中,数据库操作是非常重要的一部分。
早期我们使用 JDBC 直接操作数据库,但 JDBC 存在代码冗余、维护困难等问题,因此出现了很多 ORM 框架,其中 MyBatis 是目前非常流行的持久层框架之一。
一、什么是 MyBatis
MyBatis 是一个 优秀的持久层框架,用于简化 Java 程序与数据库之间的交互。
MyBatis 的主要作用:
将 Java 对象与 SQL 语句进行映射,实现数据库操作。
简单来说:
Java对象 ←→ SQL语句 ←→ 数据库
MyBatis 通过 XML 或注解 来管理 SQL,使开发者可以更加灵活地控制 SQL。
二、为什么使用 MyBatis
在 MyBatis 出现之前,很多项目使用 JDBC 操作数据库。
使用 JDBC 的问题:
-
SQL 语句写在 Java 代码中,维护困难
-
大量重复代码(连接数据库、关闭资源)
-
ResultSet 手动封装对象比较麻烦
例如 JDBC 查询代码:
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps = conn.prepareStatement("select * from user");
ResultSet rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("name"));
}
代码复杂且重复。
而 MyBatis 可以简化为:
List<User> list = userMapper.findAll();
大大提高开发效率。
三、MyBatis 的核心思想
MyBatis 的核心是:
SQL 与 Java 对象映射
映射关系:
数据库表 → Java对象
表字段 → 对象属性
SQL语句 → Mapper方法
示例:
数据库表
user
id
name
age
Java 对象
public class User {
private Integer id;
private String name;
private Integer age;
}
SQL 映射:
<select id="findAll" resultType="User">
select * from user
</select>
四、MyBatis 核心组件
MyBatis 的核心组件包括:
1 SqlSessionFactory
作用:
创建 SqlSession 对象
通常在项目启动时创建。
2 SqlSession
作用:
执行 SQL
常用方法:
-
selectOne()
-
selectList()
-
insert()
-
update()
-
delete()
示例:
SqlSession session = factory.openSession();
List<User> list = session.selectList("findAll");
3 Mapper 接口
Mapper 用于定义数据库操作方法。
例如:
public interface UserMapper {
List<User> findAll();
User findById(int id);
int insert(User user);
}
4 Mapper XML
用于编写 SQL。
<select id="findAll" resultType="User">
select * from user
</select>
五、MyBatis 环境配置
1 引入依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
2 创建配置文件
mybatis-config.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
3 创建 Mapper
public interface UserMapper {
List<User> findAll();
}
4 编写 Mapper XML
<mapper namespace="com.mapper.UserMapper">
<select id="findAll" resultType="User">
select * from user
</select>
</mapper>
5 测试代码
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.findAll();
System.out.println(list);
六、MyBatis 常用标签
1 select
查询数据
<select id="findById" resultType="User">
select * from user where id = #{id}
</select>
2 insert
插入数据
<insert id="insert">
insert into user(name,age) values(#{name},#{age})
</insert>
3 update
更新数据
<update id="update">
update user set name=#{name},age=#{age} where id=#{id}
</update>
4 delete
删除数据
<delete id="delete">
delete from user where id=#{id}
</delete>
七、MyBatis 动态 SQL
MyBatis 支持动态 SQL。
常用标签:
| 标签 | 作用 |
|---|---|
| if | 条件判断 |
| where | 自动添加 where |
| set | 更新字段 |
| foreach | 循环 |
示例
<select id="findUser" resultType="User">
select * from user
<where>
<if test="name != null">
name like concat('%',#{name},'%')
</if>
</where>
</select>
八、MyBatis 优点
优点:
-
SQL 与代码分离
-
支持动态 SQL
-
学习成本低
-
灵活性高
-
与 Spring 集成方便
九、MyBatis 缺点
缺点:
-
SQL 需要自己编写
-
大型项目 SQL 文件较多
-
不适合复杂 ORM 场景
十、MyBatis 面试高频问题
1 MyBatis 和 JDBC 区别?
回答:
MyBatis 是一个持久层框架,对 JDBC 进行了封装,可以自动完成数据库连接管理、SQL 执行和结果映射,从而减少大量重复代码,提高开发效率。
2 #{} 和 ${} 的区别?
| 写法 | 区别 |
|---|---|
| #{} | 预编译,防止 SQL 注入 |
| ${} | 字符串拼接,存在 SQL 注入风险 |
推荐使用:
#{}
3 MyBatis 一级缓存和二级缓存?
一级缓存:
SqlSession 级别
二级缓存:
Mapper 级别
十一、总结
MyBatis 是 Java 后端开发中最常用的持久层框架之一。
核心特点:
-
SQL 与代码分离
-
灵活控制 SQL
-
与 Spring 生态兼容
在实际项目中,MyBatis 常常与:
-
Spring
-
Spring Boot
-
MyBatis-Plus
一起使用,构成完整的开发框架。
更多推荐



所有评论(0)