



15 种超赞的 MyBatis 写法


1. 使用动态 SQL 生成复杂查询
<select id="selectUsersByCondition" parameterType="map" resultType="User">SELECT * FROM users WHERE 1=1<if test="username != null">AND username =<if test="age != null">AND age =<if test="status != null">AND status =select>

2. 使用 foreach 实现批量操作
"batchInsert" parameterType="list">INSERT INTO users (username, age)VALUES<foreach collection="list" item="user" separator=",">(foreach>

3. 使用 resultMap 映射复杂结果
<resultMap id="userResultMap" type="User"><id property="id" column="user_id"/><result property="username" column="user_name"/><result property="age" column="user_age"/>resultMap><select id="selectUser" resultMap="userResultMap">SELECT user_id, user_name, user_age FROM users WHERE user_id = #{id}select>

4. 分页查询的实现
Page<User> page = new Page<>(1, 10); // 第 1 页,10 条数据List<User> users = userMapper.selectPage(page, new QueryWrapper<>());

5. 处理一对多关系
<resultMap id="userWithOrders" type="User"><id property="id" column="user_id"/><result property="username" column="user_name"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="amount" column="order_amount"/>collection>resultMap><select id="selectUserWithOrders" resultMap="userWithOrders">SELECT u.user_id, u.user_name, o.order_id, o.order_amountFROM users uLEFT JOIN orders o ON u.user_id = o.user_idselect>

6. 使用 @Mapper 注解与 XML 配合
@Mapperpublic interface UserMapper {ListselectUsersByCondition(Map ;params )}<select id="selectUsersByCondition" parameterType="map" resultType="User">SELECT * FROM users WHERE username =select>

7. 批量更新操作
"batchUpdateUsers" parameterType="list"><foreach collection="list" item="user" separator=";">UPDATE usersSET username =WHERE id =foreach>

8. 使用 bind 处理复杂表达式
"pattern" value="'%' + keyword + '%'"/><select id="selectUsersByKeyword" resultType="User">SELECT * FROM users WHERE username LIKEselect>

9. 自定义类型处理器
(JdbcType.VARCHAR)(CustomType.class)public class CustomTypeHandler extends BaseTypeHandler<CustomType> {public void setNonNullParameter(PreparedStatement ps, int i, CustomType parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.toString());}public CustomType getNullableResult(ResultSet rs, String columnName) throws SQLException {return new CustomType(rs.getString(columnName));}}

10. 实现逻辑删除
<update id="deleteUser" parameterType="int">UPDATE users SET deleted = 1 WHERE id = #{id}update>

11. 分表策略
<select id="selectFromTable" resultType="User">SELECT * FROM ${tableName} WHERE id =select>

12. 复用 SQL 片段
<sql id="baseUserColumns">id, username, age, emailsql><select id="selectUsers" resultType="User">SELECT <include refid="baseUserColumns"/> FROM usersselect>

13. 处理枚举类型
@EnumTypeHandler(EnumTypeHandler.class)public enum UserStatus {ACTIVE, INACTIVE;}

14. 多数据源支持
public class MyBatisConfig {public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}}

15. 延迟加载
<settings><setting name="lazyLoadingEnabled" value="true"/>settings>

总结





