AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# MyBatis 核心功能详解表 ## 📊 核心架构与基础功能 | 功能模块 | 主要功能 | 作用说明 | 关键配置/注解 | |---------|---------|---------|-------------| | **核心配置** | 配置文件 | 全局配置和设置 | `mybatis-config.xml` | | | 类型别名 | 简化类名引用 | `<typeAliases>` | | | 类型处理器 | Java类型与数据库类型转换 | `TypeHandler` | | **映射器** | XML映射器 | SQL语句定义在XML文件中 | `Mapper.xml` | | | 注解映射器 | SQL语句通过注解定义 | `@Select`, `@Insert`等 | | | 动态SQL | 根据条件动态生成SQL | `<if>`, `<choose>`, `<foreach>` | | **执行器** | 执行器类型 | 控制SQL执行行为 | `SIMPLE`, `REUSE`, `BATCH` | | | 缓存机制 | 一级缓存和二级缓存 | 本地缓存, 命名空间缓存 | --- ## 🛠️ SQL映射与执行功能 ### 1. **SQL语句映射方式** | 映射方式 | 优点 | 缺点 | 适用场景 | |---------|------|------|----------| | **XML映射** | 支持复杂SQL、动态SQL | 需要维护XML文件 | 复杂查询、动态SQL | | **注解映射** | 代码简洁,无需XML | 复杂SQL可读性差 | 简单CRUD操作 | | **混合使用** | 灵活选择 | 需要统一规范 | 中型项目 | ### 2. **XML映射文件结构** ```xml <!-- UserMapper.xml 示例 --> <mapper namespace="com.example.mapper.UserMapper"> <!-- 结果映射 --> <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="email"/> <!-- 关联映射 --> <association property="department" javaType="Department"/> <!-- 集合映射 --> <collection property="roles" ofType="Role"/> </resultMap> <!-- 基础CRUD --> <select id="selectById" resultMap="userResultMap"> SELECT * FROM users WHERE id = #{id} </select> </mapper> ``` ### 3. **常用注解映射** | 注解 | 功能 | 示例 | |------|------|------| | `@Select` | 查询语句 | `@Select("SELECT * FROM users WHERE id = #{id}")` | | `@Insert` | 插入语句 | `@Insert("INSERT INTO users(name) VALUES(#{name})")` | | `@Update` | 更新语句 | `@Update("UPDATE users SET name=#{name} WHERE id=#{id}")` | | `@Delete` | 删除语句 | `@Delete("DELETE FROM users WHERE id=#{id}")` | | `@Results` | 结果映射 | `@Results({@Result(property="id", column="user_id")})` | | `@Param` | 参数命名 | `User selectById(@Param("userId") Long id)` | | `@ResultMap` | 引用结果映射 | `@ResultMap("userResultMap")` | --- ## 🔧 动态SQL功能 ### 1. **动态SQL元素表** | 元素 | 功能描述 | 示例 | |------|----------|------| | `<if>` | 条件判断 | `<if test="name != null">AND name = #{name}</if>` | | `<choose>` | 多路选择 | `<choose><when test="..."><otherwise></otherwise></choose>` | | `<trim>` | 修剪字符串 | `<trim prefix="WHERE" prefixOverrides="AND \|OR ">` | | `<where>` | WHERE条件 | `<where><if>...</if></where>` | | `<set>` | SET语句 | `<set><if>...</if></set>` | | `<foreach>` | 循环遍历 | `<foreach item="item" collection="list" separator=",">` | | `<bind>` | 变量绑定 | `<bind name="pattern" value="'%' + name + '%'" />` | ### 2. **动态SQL使用场景** ```xml <!-- 复杂查询示例 --> <select id="findUsers" resultMap="userResultMap"> SELECT * FROM users <where> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="status != null"> AND status = #{status} </if> <if test="roleIds != null and roleIds.size() > 0"> AND role_id IN <foreach item="roleId" collection="roleIds" open="(" separator="," close=")"> #{roleId} </foreach> </if> <choose> <when test="orderBy == 'name'"> ORDER BY name </when> <otherwise> ORDER BY id </otherwise> </choose> </where> </select> ``` --- ## 💾 缓存机制 ### 1. **缓存层级对比** | 缓存级别 | 作用范围 | 生命周期 | 配置方式 | |----------|---------|----------|----------| | **一级缓存** | SqlSession级别 | 会话期间 | 默认开启,不可关闭 | | **二级缓存** | Mapper命名空间 | 应用生命周期 | 需要显式开启 | ### 2. **缓存配置示例** ```xml <!-- 启用二级缓存 --> <cache eviction="FIFO" <!-- 淘汰策略:LRU, FIFO, SOFT, WEAK --> flushInterval="60000" <!-- 刷新间隔(ms) --> size="512" <!-- 缓存对象数量 --> readOnly="true"/> <!-- 是否只读 --> <!-- 具体查询语句的缓存配置 --> <select id="selectById" resultType="User" useCache="true" flushCache="false"> SELECT * FROM users WHERE id = #{id} </select> ``` --- ## 🔄 高级功能与插件 ### 1. **插件机制** | 插件类型 | 功能 | 拦截点 | |---------|------|--------| | **分页插件** | 物理分页支持 | `Executor` | | **性能监控** | SQL执行监控 | `StatementHandler` | | **字段加密** | 数据加解密 | `ParameterHandler`, `ResultSetHandler` | | **多租户** | 数据隔离 | `StatementHandler` | ### 2. **自定义插件示例** ```java @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) }) public class MyInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 拦截逻辑 return invocation.proceed(); } } ``` --- ## 📈 结果集处理 ### 1. **结果映射类型** | 映射方式 | 说明 | 适用场景 | |---------|------|----------| | **自动映射** | 按字段名自动匹配 | 字段名与属性名一致 | | **ResultMap** | 显式定义映射关系 | 复杂映射、字段名不一致 | | **嵌套查询** | 关联对象查询 | 一对一、一对多关系 | | **嵌套结果** | 单次查询多个表 | 提高性能,减少查询次数 | ### 2. **关联查询示例** ```xml <!-- 一对一关联 --> <resultMap id="userWithDept" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <association property="department" javaType="Department"> <id property="id" column="dept_id"/> <result property="name" column="dept_name"/> </association> </resultMap> <!-- 一对多关联 --> <resultMap id="deptWithUsers" type="Department"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="users" ofType="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> </collection> </resultMap> ``` --- ## 🚀 最佳实践建议 | 实践要点 | 具体建议 | |---------|----------| | **SQL管理** | 复杂SQL使用XML,简单SQL使用注解 | | **动态SQL** | 优先使用`<where>`、`<set>`避免语法错误 | | **性能优化** | 合理使用二级缓存,避免缓存滥用 | | **结果映射** | 字段名不一致时使用ResultMap | | **插件使用** | 按需引入插件,避免性能影响 | | **分页处理** | 大数据量时使用物理分页插件 | --- ## 🔧 常用配置项 ```xml <!-- mybatis-config.xml 核心配置 --> <configuration> <settings> <!-- 开启下划线转驼峰 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 查询超时时间 --> <setting name="defaultStatementTimeout" value="30"/> <!-- 返回null字段 --> <setting name="callSettersOnNulls" value="true"/> </settings> <typeAliases> <package name="com.example.model"/> </typeAliases> <typeHandlers> <typeHandler handler="com.example.MyTypeHandler"/> </typeHandlers> <mappers> <mapper resource="mapper/UserMapper.xml"/> <mapper class="com.example.mapper.DepartmentMapper"/> </mappers> </configuration> ``` --- ## 📊 功能对比选择 | 需求场景 | 推荐功能 | 备注 | |---------|----------|------| | **简单CRUD** | 注解映射 + 自动映射 | 快速开发 | | **复杂查询** | XML映射 + 动态SQL | 可维护性好 | | **性能敏感** | 二级缓存 + 批量操作 | 减少数据库压力 | | **多表关联** | 嵌套结果映射 | 减少查询次数 | | **动态条件** | 动态SQL元素 | 灵活构建查询 | 通过合理使用MyBatis的这些核心功能,可以构建出灵活、高效的数据访问层,同时保持代码的可维护性和可扩展性。