MyBatis框架进阶指南:深入理解CRUD与参数映射
第二章:从查询到完整CRUD - 功能全面升级
在上一篇文章中(MyBatis框架入门指南:从零开始掌握持久层框架-CSDN博客),我们主要介绍了MyBatis的基本查询操作。现在,我们将全面扩展功能,实现完整的CRUD(创建、读取、更新、删除)操作,这是数据库应用开发中最核心的功能。
2.1 增删改查操作详解
2.1.1 新增操作(Create)
<insert id="insert" parameterType="User"><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select last_insert_id()</selectKey>insert into user(username, birthday, sex, address) values(#{username}, #{birthday}, #{sex}, #{address})
</insert>
关键点解析:
|
|
|
MySQL的 |
2.1.2 删除操作(Delete)
<delete id="delete" parameterType="Integer">delete from user where id = #{id}
</delete>
注意事项:
-
删除操作通常需要事务控制
-
实际项目中建议使用逻辑删除而非物理删除
2.1.3 更新操作(Update)
<update id="update" parameterType="User">update user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id}
</update>
2.2 模糊查询的两种实现方式对比
方式一:SQL中直接拼接(使用${})
<select id="findByName" resultType="User" parameterType="string">select * from user where username like '%${value}%'
</select>
特点:
${}
是字符串替换,直接将参数拼接到SQL中
存在SQL注入风险
必须使用value
作为参数名
方式二:参数中传递通配符(使用#{})
<select id="findByName" resultType="User" parameterType="string">select * from user where username like #{name}
</select>
调用时:
mapper.findByName("%王%");
特点:
#{}
是预编译处理,更安全
可以使用任意参数名
通配符逻辑在Java代码中控制
第三章:深入理解参数与结果映射
3.1 parameterType的三种使用场景
3.1.1 简单类型参数
<select id="findById" parameterType="int" resultType="User">select * from user where id = #{id}
</select>
类型处理:
-
MyBatis内置了Java基本类型的别名
-
当参数是单个简单类型时,#{}中的名称可以任意
3.1.2 POJO对象参数
<insert id="insert" parameterType="User">insert into user(username, sex) values(#{username}, #{sex})
</insert>
工作原理:
-
MyBatis通过OGNL表达式获取对象属性值
-
属性名必须与POJO中的属性名一致
3.1.3 包装对象参数
public class QueryVo {private User user;private String roleName;// getter/setter
}
<select id="findByVo" parameterType="QueryVo" resultType="User">select * from user where username = #{user.username} and role = #{roleName}
</select>
应用场景:
-
复杂查询条件
-
多表关联查询参数
-
分页查询参数封装
3.2 resultType与resultMap的选择
3.2.1 resultType的自动映射
<select id="findAll" resultType="User">select id, username, sex from user
</select>
适用条件:
-
数据库列名与Java属性名一致(或符合下划线转驼峰规则)
-
查询结果不需要特殊处理
3.2.2 resultMap的显式映射
<resultMap id="userResultMap" type="User"><id property="id" column="user_id"/><result property="username" column="user_name"/><result property="sex" column="user_sex"/>
</resultMap><select id="findAll" resultMap="userResultMap">select user_id, user_name, user_sex from t_user
</select>
-
数据库字段名与Java属性名不一致
-
复杂的结果集映射(如一对一、一对多)
-
需要自定义类型处理
第四章:配置文件深度解析
4.1 数据源配置详解
<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>
</environments>
关键配置项:
-
事务管理器(transactionManager)
-
type="JDBC"
:使用JDBC的事务管理 -
type="MANAGED"
:由容器管理事务
-
-
数据源(dataSource)
-
type="UNPOOLED"
:不使用连接池 -
type="POOLED"
:使用MyBatis内置连接池 -
type="JNDI"
:使用JNDI获取数据源
-
生产建议: 实际项目中通常使用Druid等专业连接池
4.2 类型别名的最佳实践
<typeAliases><!-- 为单个类定义别名 --><typeAlias type="com.example.domain.User" alias="User"/><!-- 为整个包下的类定义别名 --><package name="com.example.domain"/>
</typeAliases>
-
别名使用技巧:
-
简单类名作为别名(首字母大小写不敏感)
-
在团队中建立统一的别名规范
-
避免过度使用别名导致可读性下降
实战经验分享
5.1 参数传递的常见问题
问题1: 多个简单类型参数如何传递?
解决方案:
-
使用@Param注解:
User findByCond(@Param("name") String name, @Param("sex") String sex);
<select id="findByCond" resultType="User">select * from user where username=#{name} and sex=#{sex} </select>
-
使用Map封装参数:
Map<String, Object> params = new HashMap<>(); params.put("name", "张三"); params.put("sex", "男"); mapper.findByMap(params);
问题2: 如何实现分页查询?
解决方案:
-
使用RowBounds(内存分页,不推荐大数据量)
-
使用PageHelper插件(推荐)
-
手动编写分页SQL
5.2 结果映射的高级技巧
技巧1: 自动映射下划线转驼峰
在配置文件中开启:
<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
技巧2: 处理枚举类型
public enum Sex {MALE("男"), FEMALE("女");private String value;// 构造方法和getter
}
<resultMap id="userMap" type="User"><result property="sex" column="sex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
</resultMap>
总结与展望
本文深入讲解了MyBatis的CRUD操作实现、参数传递机制和结果映射策略。相比基础篇,我们增加了:
-
完整的增删改查操作实现
-
多种参数传递方式的对比
-
结果集映射的详细解析
-
配置文件的最佳实践
-
实际开发中的经验技巧