当前位置: 首页 > 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.dtcms.com/a/277292.html

相关文章:

  • Redis集群方案——哨兵机制
  • 无需付费即可利用AI消除音频噪声和生成字幕
  • 《Linux篇》自动化构建-make/Makefile
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • AI抠图软件,本地运行超快速
  • 水往低处流,人也往低处走
  • 三种网络类型
  • 跨域中间件通俗理解
  • 教程:如何查看浏览器扩展程序的源码
  • Linux驱动11 --- buildroot杂项驱动开发方法
  • 网络资源模板--基于Android Studio 实现的音乐播放器App
  • 【Go语言-Day 19】深入理解Go自定义类型:Type、Struct、嵌套与构造函数实战
  • 系规备考论文:论IT服务知识管理
  • 20250711_Sudo 靶机复盘
  • vue的优缺点
  • React强大且灵活hooks库——ahooks入门实践之状态管理类hook(state)详解
  • 在NDK开发中如何正确创建JNI方法
  • Perl小骆驼学习笔记 - 9. 用正则表达式处理文本
  • 香港服务器Python自动化巡检脚本开发与邮件告警集成
  • 《雨下小暑》诗赏——小暑时节暴雨之晨的清凉视听(智普清言)
  • iOS UI视图面试相关
  • 从儿童涂鸦到想象力视频:AI如何重塑“亲子创作”市场?
  • [特殊字符]使用 Nginx 将 HTTP 重定向到 HTTPS
  • Anaconda3安装教程(Windows)
  • 低代码引擎核心技术:OneCode常用动作事件速查手册及注解驱动开发详解
  • Web应用性能优化之数据库查询实战指南
  • 楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(二)
  • 【Linux系统与网络编程】06:进程间通信
  • Day 19: 标准库巡礼:Python的“百宝箱”
  • c++学习之---红黑树的实现