深入理解MyBatis:总结核心概念
深入理解MyBatis:核心概念与最佳实践
1. MyBatis核心架构
MyBatis采用分层设计,核心组件包括:
- SqlSessionFactory:全局单例,创建SqlSession的工厂
- SqlSession:线程不安全的会话对象,执行CRUD操作
- Executor:SQL执行器,处理缓存和事务
- MappedStatement:封装SQL和映射信息
- TypeHandler:Java类型与JDBC类型的转换处理器
2. 核心配置文件解析
mybatis-config.xml
关键配置项:
<configuration><settings><!-- 开启二级缓存 --><setting name="cacheEnabled" value="true"/><!-- 启用延迟加载 --><setting name="lazyLoadingEnabled" value="true"/></settings><typeAliases><!-- 实体类别名 --><typeAlias type="com.example.User" alias="User"/></typeAliases><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!-- XML映射文件注册 --><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
3. 动态SQL实战技巧
场景1:条件查询
<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="minAge != null">AND age >= #{minAge}</if><choose><when test="status == 'active'">AND active = 1</when><otherwise>AND active = 0</otherwise></choose></where>
</select>
场景2:批量插入
<insert id="batchInsert">INSERT INTO users (name, email) VALUES<foreach item="user" collection="list" separator=",">(#{user.name}, #{user.email})</foreach>
</insert>
4. 高级结果映射
嵌套结果集处理:
<resultMap id="userDetailMap" type="User"><id property="id" column="user_id"/><result property="name" column="user_name"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="amount" column="order_amount"/></collection>
</resultMap><select id="getUserWithOrders" resultMap="userDetailMap">SELECT u.id user_id, u.name user_name,o.id order_id, o.amount order_amountFROM users u LEFT JOIN orders o ON u.id = o.user_idWHERE u.id = #{id}
</select>
5. 缓存机制深度优化
二级缓存配置策略:
<cacheeviction="LRU"flushInterval="60000"size="512"readOnly="true"/>
适用场景建议:
- 一级缓存:事务性操作(默认开启)
- 二级缓存:读多写少的数据(如配置数据)
- 避免缓存:频繁更新的数据/财务数据