当前位置: 首页 > news >正文

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>

关键点解析:

<selectKey>标签用于获取插入后的自增主键值

keyProperty指定将返回的主键值设置到JavaBean的哪个属性

order="AFTER"表示在插入语句执行后获取主键

MySQL的last_insert_id()函数获取最后插入的ID

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>

 

关键配置项:

  1. 事务管理器(transactionManager)

    • type="JDBC":使用JDBC的事务管理

    • type="MANAGED":由容器管理事务

  2. 数据源(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>
  1. 别名使用技巧:

  2. 简单类名作为别名(首字母大小写不敏感)

  3. 在团队中建立统一的别名规范

  4. 避免过度使用别名导致可读性下降

实战经验分享

5.1 参数传递的常见问题

问题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>

  2. 使用Map封装参数:

    Map<String, Object> params = new HashMap<>();
    params.put("name", "张三");
    params.put("sex", "男");
    mapper.findByMap(params);

问题2: 如何实现分页查询?

解决方案:

  1. 使用RowBounds(内存分页,不推荐大数据量)

  2. 使用PageHelper插件(推荐)

  3. 手动编写分页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操作实现、参数传递机制和结果映射策略。相比基础篇,我们增加了:

  1. 完整的增删改查操作实现

  2. 多种参数传递方式的对比

  3. 结果集映射的详细解析

  4. 配置文件的最佳实践

  5. 实际开发中的经验技巧

 

http://www.lryc.cn/news/587225.html

相关文章:

  • CVE-2022-0609
  • Oracle SQL - 使用行转列PIVOT减少表重复扫描(实例)
  • 常用的docker命令备份
  • Docker从环境配置到应用上云的极简路径
  • 《Google 软件工程》:如何写好文档?
  • Qt窗口:QToolBar、QStatusBar、QDockWidget、QDialog
  • QT 多线程 管理串口
  • Vue框架之计算属性与侦听器详解
  • 深入理解 LangChain:AI 应用开发的全新范式
  • openEuler欧拉系统重置密码
  • 标注识别 自己的数据集20张 roboflow 实例分割
  • 基于requests_html的爬虫实战
  • 【DVWA系列】——File Upload——low详细教程(webshell工具冰蝎)
  • Vue Router 完全指南:从入门到实战,高效管理前端路由
  • 12.I/O复用
  • 光盘处理难题不用愁,DVDFab 来救场
  • 博客项目 laravel vue mysql 第五章 标签功能
  • 从 Intel MacBook 迁移到 ARM MacBook 的完整指南
  • 【牛客刷题】四个选项:高考选择题方案统计(并查集+动态规划)
  • 【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】
  • 时序预测 | Matlab代码实现VMD-TCN-GRU-MATT变分模态分解时间卷积门控循环单元多头注意力多变量时序预测
  • 【Linux系统】进程状态 | 进程优先级
  • 未来航空电子系统
  • C语言基础知识--文件读写(一)
  • 移动端设备本地部署大语言模型(LLM)
  • React强大且灵活hooks库——ahooks入门实践之状态管理类hook(state)详解
  • [Plecs基础知识系列]基于Plecs的半导体热仿真方法(实战篇)_1.建立电路模型
  • Linux修炼:开发工具
  • 《每日AI-人工智能-编程日报》--2025年7月12日
  • 使用Starrocks替换Clickhouse的理由