MyBatis保姆级教程核心内容解析

360影视 欧美动漫 2025-06-02 20:42 2

摘要:轻量级:无侵入性,只需关注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、关联映射)或提供具体代码示例?欢迎随时提问!

来源:老客数据一点号

相关推荐