摘要:轻量级:无侵入性,只需关注SQL本身,无需强制遵循特定ORM模式。SQL灵活掌控:直接编写/优化SQL,避免Hibernate等ORM框架的“黑盒”问题,尤其适合复杂查询或需深度调优的场景。结果集映射强大:自动/半自动将数据库记录映射到Java对象(POJO、
一、MyBatis 核心优势 & 定位 (Why MyBatis?)
轻量级: 无侵入性,只需关注SQL本身,无需强制遵循特定ORM模式。SQL灵活掌控: 直接编写/优化SQL,避免Hibernate等ORM框架的“黑盒”问题,尤其适合复杂查询或需深度调优的场景。结果集映射强大: 自动/半自动将数据库记录映射到Java对象(POJO、Map等)。与JDBC对比: 极大简化了JDBC冗余代码(连接管理、参数设置、结果集遍历封装等)。二、环境搭建 & 基础配置 (手把手开始)
项目引入依赖:org.mybatis
mybatis
3.5.13
mysql
mysql-connector-java
8.0.33
核心配置文件 mybatis-config.xml:-->
三、核心操作:CRUD 全解析 (XML映射文件)
映射文件 UserMapper.xml:
...
INSERT INTO users (name, email, create_time)
VALUES (#{name}, #{email}, #{createTime})
parameterType: 传入参数类型 (可省略,MyBatis通常能推断)
useGeneratedKeys + keyProperty: 获取数据库自增主键并注入到对象的id属性 -->
SELECT id, name AS userName, email FROM users WHERE id = #{id}
resultType: 直接指定返回的Java类型 (字段名与属性名一致或使用别名匹配)
resultMap: 引用上面定义的复杂映射 -->
UPDATE users
SET name = #{name}, email = #{email}
WHERE id = #{id}
DELETE FROM users WHERE id = #{id}
SELECT * FROM users
-->
配套Mapper接口 UserMapper.java (推荐方式):java
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
int insertUser(User user);
User selectUserById(Long id);
int updateUser(User user);
int deleteUserById(Long id);
List selectAllUsers;
}
四、SQL执行 & 获取SqlSession (关键步骤)
java
// 1. 从XML配置文件构建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession) { // 2. 获取SqlSession
// 方式一:直接执行映射语句 (旧方式)
User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1L);
// **方式二 (强烈推荐):获取Mapper接口代理对象**
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUserById(1L);
// 执行其他操作...
session.commit; // 显式提交事务 (非自动提交时)
} // try-with-resources 自动关闭session
五、日志配置 (问题排查必备)
mybatis-config.xml 中配置:以Log4j2为例 (log4j2.xml):
日志输出内容: 执行的SQL语句、参数、返回结果集数量、执行时间等。
六、参数传递详解 (灵活应对各种场景)
单个基本类型/简单类型参数:SELECT * FROM users WHERE id = #{id}
单个JavaBean对象参数:INSERT INTO users (name, email) VALUES (#{name}, #{email})
多个参数 - 使用 @Param 注解 (推荐):
java
// Mapper接口
User selectUserByNameAndEmail(@Param("username") String name, @Param("useremail") String email);
SELECT * FROM users WHERE name = #{username} AND email = #{useremail}
多个参数 - 使用Map (不推荐,可读性差):java
// Mapper接口
User selectUserByMap(Map params);
SELECT * FROM users WHERE name = #{nameKey} AND email = #{emailKey}
参数中的特殊处理:Ø #{} vs ${}:
#{}:PreparedStatement参数占位符,防止SQL注入,会对值进行转义,如 #{name} -> ? (安全!)
${}:字符串直接替换,有SQL注入风险!仅用于动态表名、列名等非值位置。如:ORDER BY ${columnName}
七、常见问题 & 最佳实践 (保姆级关怀)
Null值处理: 在mybatis-config.xml中配置 jdbcTypeForNull (如 OTHER, NULL) 或在#{}中指定 jdbcType (如 #{age, jdbcType=INTEGER})。主键回填: 使用 。列名与属性名不一致:Ø SQL中使用 AS 别名 (SELECT user_name AS userName ...)。
Ø 定义 手动映射。
Ø 开启全局 mapUnderscoreToCamelCase 自动映射下划线转驼峰。
事务管理: 确保在需要事务的操作后调用 session.commit。考虑使用Spring集成管理事务。SqlSession 生命周期: 通常是方法级作用域,用完立即关闭(用try-with-resources确保)。Mapper接口开发:强烈推荐使用Mapper接口绑定映射文件的方式,提升代码类型安全性和可读性。总结: 这份指南覆盖了MyBatis入门到实战的核心路径。掌握配置、CRUD编写、日志查看和灵活的参数传递,你已具备独立操作数据库的基础能力。
下一步进阶方向:
动态SQL:, //, , , (处理批量操作)结果集映射高级技巧: 一对一 ()、一对多 ()、嵌套查询/嵌套结果缓存机制: 一级缓存 (SqlSession级别)、二级缓存 (Mapper命名空间级别)插件开发 (Plugin): 拦截器,用于分页、性能监控等与Spring/SpringBoot集成:mybatis-spring 项目,简化配置和管理动手实践建议: 按照教程步骤创建一个简单的用户管理模块(包含增删改查),观察日志输出,尝试不同的参数传递方式,体验MyBatis的便捷性。遇到问题随时查阅日志和文档!
是否需要我继续详解某个进阶主题(如动态SQL、关联映射)或提供具体代码示例?欢迎随时提问!
来源:老客数据一点号