一、什么是 MyBatis?
MyBatis是一款优秀的Java 持久层框架,它通过XML 或注解的方式,将 SQL 语句与 Java 对象进行映射,简化了 JDBC 操作,同时又保留了 SQL 的灵活性。
一句话总结:
MyBatis = JDBC 封装 + SQL 可控
MyBatis 的优点
SQL 可控、可优化(比 Hibernate 更灵活)
与 Spring 集成方便
学习成本低,适合初学者
支持动态 SQL,功能强大
二、MyBatis 的核心组成
MyBatis 的核心主要包括以下几个部分:
| 组件 | 作用 |
|---|---|
| SqlMapConfig.xml | 全局配置文件 |
| Mapper.xml | SQL 映射文件 |
| Mapper 接口 | 定义数据库操作方法 |
| SqlSessionFactory | 创建 SqlSession |
| SqlSession | 执行 SQL 的核心对象 |
三、MyBatis 开发环境搭建
1. 引入依赖(Maven)
<dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies>2. 创建 MyBatis 核心配置文件
SqlMapConfig.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/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>四、创建实体类(Entity)
public class User { private Integer id; private String username; private String password; // getter / setter }五、Mapper 映射文件
1. Mapper.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.qcby.mapper.UserMapper"> <select id="findAll" resultType="com.qcby.entity.User"> select * from user </select> <select id="findById" parameterType="int" resultType="com.qcby.entity.User"> select * from user where id = #{id} </select> <insert id="insertUser" parameterType="com.qcby.entity.User"> insert into user(username,password) values(#{username},#{password}) </insert> </mapper>2. Mapper 接口
public interface UserMapper { List<User> findAll(); User findById(int id); void insertUser(User user); }六、MyBatis 执行流程示例
public class MyBatisTest { public static void main(String[] args) throws Exception { // 1. 读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 创建 SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // 3. 获取 SqlSession SqlSession sqlSession = factory.openSession(); // 4. 获取 Mapper 代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 5. 执行方法 List<User> users = mapper.findAll(); users.forEach(System.out::println); // 提交事务 sqlSession.commit(); // 关闭资源 sqlSession.close(); in.close(); } }七、MyBatis 参数传递方式
1. 基本类型
where id = #{id}2. 对象参数
where username = #{username}3. 多参数(@Param)
User find(@Param("name") String name, @Param("pwd") String pwd);where username = #{name} and password = #{pwd}八、MyBatis 动态 SQL(重点)
1. if 标签
<select id="findUser" resultType="User"> select * from user <where> <if test="username != null"> and username = #{username} </if> <if test="password != null"> and password = #{password} </if> </where> </select>2. foreach(批量操作)
<select id="findByIds" resultType="User"> select * from user where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>九、MyBatis 常见问题总结
1. 找不到 Mapper.xml
确认路径是否在
resources下resource="mapper/UserMapper.xml"路径是否正确
2. Getter 错误
实体类属性名与 SQL 返回字段不一致
缺少 getter / setter 方法
3. 事务未提交
增删改操作后记得
sqlSession.commit()
十、总结
MyBatis 作为 Java 后端中使用最广泛的持久层框架之一,具有以下特点:
SQL 灵活、易于优化
配置清晰、扩展性强
非常适合学习数据库与 Java 持久层原理
建议学习路线:
JDBC → MyBatis → MyBatis + Spring → MyBatis Plus