MyBatis映射文件常用元素详解与示例

引言

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis的配置文件和映射文件分离,映射文件用于定义SQL语句和结果映射。本文将介绍MyBatis映射文件中常用的元素及其示例用法。


一、基础CRUD元素

1. <mapper>

作用:定义映射文件的根元素,指定命名空间。
属性namespace(对应Mapper接口的全限定名)。

<mapper namespace="com.example.UserMapper">

2. <select>

作用:定义查询操作。
关键属性

  • id:方法名
  • parameterType:参数类型
  • resultType/resultMap:返回类型

示例:查询用户

<!-- 
查询用户信息
参数:用户ID(整数类型)
返回:一个User对象
说明:WHERE id = #{id}:根据id条件进行查询,#{id}是MyBatis的占位符,用于动态传参。
用法:在Mapper接口中定义对应的方法,例如:User getUserById(int id); 
-->
<select id="getUserById" parameterType="int" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>

官方文档


3. <insert>

作用insert元素用于定义插入语句,用于向数据库中插入数据。
属性useGeneratedKeys(是否使用自增主键),keyProperty(主键属性名)。

示例:插入用户并返回自增ID

<!-- 插入用户信息到数据库参数:User对象(包含name和age属性)功能:将用户信息插入到users表中说明:1. useGeneratedKeys="true":表示启用数据库自动生成主键(通常是自增ID)。2. keyProperty="id":指定生成的主键值将赋值到User对象的id属性中。3. 通过#{name}和#{age}动态获取User对象的name和age属性值。用法:在Mapper接口中定义对应的方法,例如:int insertUser(User user);调用后,user对象的id属性会被自动填充为数据库生成的主键值。-->
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

4. <update><delete>

作用:更新和删除操作。

示例:更新用户

<!-- 
更新用户信息
参数:User对象(包含id、name和age属性)
功能:根据用户ID更新用户的名字和年龄
说明:1. parameterType="User":表示传入的参数是一个User对象。2. #{name}、#{age}、#{id}:MyBatis占位符,用于从User对象中动态获取对应的属性值。3. UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}:更新users表中指定ID的用户记录。
用法:在Mapper接口中定义对应的方法,例如:int updateUser(User user);调用时传入一个User对象即可。-->
<update id="updateUser" parameterType="User">UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}
</update>

示例:删除用户

<!-- 
删除用户信息
参数:用户ID(整数类型)
功能:根据用户ID删除用户记录
说明:1. parameterType="int":表示传入的参数是一个整数类型的用户ID。2. #{id}:MyBatis占位符,用于动态获取传入的用户ID值。3. DELETE FROM users WHERE id=#{id}:从users表中删除指定ID的用户记录。
用法:在Mapper接口中定义对应的方法,例如:int deleteUser(int id);调用时传入用户ID即可。-->
<delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}
</delete>

官方文档


二、结果映射 <resultMap>

拓展阅读:MyBatis映射文件 <resultMap> 元素详解与示例

1. 基础字段映射

用途:解决数据库列名与Java属性名不一致问题。

示例

<!-- 
用户结果映射
功能:将数据库查询结果映射到User对象
说明:1. id="UserResult":标识这个结果映射的唯一名称。2. type="User":指定目标Java对象类型为User。3. <id property="userId" column="user_id">:定义User对象的userId属性与数据库表的user_id列对应。4. <result property="userName" column="user_name">:定义User对象的userName属性与数据库表的user_name列对应。-->
<resultMap id="UserResult" type="User"><id property="userId" column="user_id" /><result property="userName" column="user_name" />
</resultMap><!-- 
查询用户信息
功能:从users表中查询user_id和user_name列,并将结果映射到User对象
说明:1. id="getUser":标识这个查询操作的唯一名称。2. resultMap="UserResult":指定使用UserResult结果映射来处理查询结果。3. SELECT user_id, user_name FROM users:从users表中查询user_id和user_name两列。
用法:在Mapper接口中定义对应的方法,例如:List<User> getUser();返回一个包含所有用户信息的User对象列表。-->
<select id="getUser" resultMap="UserResult">SELECT user_id, user_name FROM users
</select>

2. 关联关系映射

  • <association>:一对一关联
  • <collection>:一对多关联

示例:用户与订单的一对多关系

<!-- 
用户与订单结果映射
功能:将用户和其关联的订单信息映射到User对象
说明:1. id="UserWithOrders":标识这个结果映射的唯一名称。2. type="User":指定目标Java对象类型为User。3. <id property="id" column="id">:定义User对象的id属性与数据库表的id列对应,作为主键。4. <collection property="orders" ofType="Order">:定义User对象的orders属性为集合类型,存储Order对象。a. property="orders":User类中的订单集合属性。b. ofType="Order":集合中的元素类型为Order。c. <id property="orderId" column="order_id">:定义Order对象的orderId属性与数据库表的order_id列对应,作为主键。d. <result property="orderNo" column="order_no">:定义Order对象的orderNo属性与数据库表的order_no列对应。5. 通过这个结果映射,可以将用户的订单信息一并查询出来,并映射为嵌套的Java对象结构。-->
<resultMap id="UserWithOrders" type="User"><id property="id" column="id"/><collection property="orders" ofType="Order"><id property="orderId" column="order_id"/><result property="orderNo" column="order_no"/></collection>
</resultMap><!-- 
查询用户及其订单信息
功能:从users和orders表中查询用户及订单数据,并通过UserWithOrders结果映射转换为Java对象
说明:1. id="getUserWithOrders":标识这个查询操作的唯一名称。2. resultMap="UserWithOrders":指定使用UserWithOrders结果映射来处理查询结果。3. SELECT u.*, o.order_id, o.order_no FROM users u LEFT JOIN orders o ON u.id = o.user_id:a. 查询users表的所有列(u.*)和orders表的order_id、order_no列。b. 使用LEFT JOIN将users表和orders表连接,连接条件为用户ID(u.id = o.user_id)。c. 查询结果将包含用户的基本信息和其关联的订单信息。
用法:在Mapper接口中定义对应的方法,例如:List<User> getUserWithOrders();返回一个包含用户及其订单信息的User对象列表。-->
<select id="getUserWithOrders" resultMap="UserWithOrders">SELECT u.*, o.order_id, o.order_no FROM users u LEFT JOIN orders o ON u.id = o.user_id
</select>

三、动态SQL元素

1. <if>

用途:条件判断。

示例:动态过滤用户

<!-- 
动态条件查询用户信息
功能:根据传入的条件动态查询用户信息,支持组合条件过滤
参数:parameterType="map" 表示传入的参数是一个Map对象,可以包含多个条件
说明:1. SELECT * FROM users:从users表中查询所有列的数据。2. <where>:标识查询条件的开始,MyBatis会自动处理WHERE关键字的拼接。3. <if> 标签用于动态判断条件是否满足:- test="name != null":如果传入的name参数不为空,则拼接name = #{name}作为查询条件。- test="age != null":如果传入的age参数不为空,则拼接age = #{age}作为查询条件。4. 这个查询的灵活性在于可以根据传入的参数动态生成查询条件,如果多个条件同时存在,MyBatis会自动将它们用AND连接。
用法:在Mapper接口中定义对应的方法,例如:List<User> findUsers(Map<String, Object> params);参数params可以包含"name"和/或"age"键,也可以都不包含。如果参数不包含这些键,查询将没有条件限制(即查询所有用户)。
注意:1. 如果需要查询默认条件下的数据,建议为每个参数设置默认值或在Mapper方法中提供默认参数。2. 如果需要更复杂的条件组合(如OR条件),可以使用<choose>、<when>等动态SQL标签。3. 传递的参数类型为Map,便于动态传递多个查询条件。4. #{name}和#{age}是MyBatis的占位符,用于动态获取Map中的值。-->
<select id="findUsers" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>

2. <choose>, <when>, <otherwise>

用途:多条件分支(类似Java的switch-case)。

示例

<!-- 
动态条件查询用户信息
功能:根据传入的条件动态查询用户信息
参数:parameterType="map" 表示传入的参数是一个Map对象,可以包含多个条件
说明:1. SELECT * FROM users:从users表中查询所有列的数据。2. <where>:定义查询条件的开始,MyBatis会自动处理WHERE关键字的拼接。3. <choose>:类似于Java中的switch语句,用于条件选择。4. <when test="name != null">name = #{name}:当传入的name不为空时,拼接name = #{name}作为查询条件。5. <when test="age != null">age = #{age}:当传入的age不为空时,拼接age = #{age}作为查询条件。6. <otherwise>status = 1:当所有<when>条件都不满足时,拼接status = 1作为默认查询条件。
用法:在Mapper接口中定义对应的方法,例如:List<User> selectByCondition(Map<String, Object> params);参数params可以包含"name"或"age"键,也可以都不包含。返回一个包含符合条件的User对象列表。
注意:1. 如果传入多个条件,MyBatis会自动将它们拼接成AND连接的条件。2. 如果不需要默认条件,可以移除<otherwise>标签。3. 传递的参数类型为Map,便于动态传递查询条件。4. #{name}和#{age}是MyBatis的占位符,用于动态获取Map中的值。5. 如果需要更复杂的查询条件,可以结合使用<if>、<where>等动态SQL标签。-->
<select id="selectByCondition" parameterType="map" resultType="User">SELECT * FROM users<where><choose><when test="name != null">name = #{name}</when><when test="age != null">age = #{age}</when><otherwise>status = 1</otherwise></choose></where>
</select>

3. <foreach>

用途:遍历集合,常用于IN查询或批量操作。

示例:批量插入用户

<!-- 
批量插入用户信息
功能:将多个用户对象批量插入到users表中
参数:parameterType="list"指定传入的参数是一个用户对象列表
说明:1. INSERT INTO users (name, age) VALUES定义插入语句的目标表和字段,这里是name和age。2. <foreach item="user" collection="list" separator=",">- 标识这是一个批量操作。- collection="list"表示传入的参数是一个列表。- item="user"表示列表中的每个元素。- separator=","用于分隔每个插入的值。3. (#{user.name}, #{user.age})表示从每个用户对象中获取name和age属性值,并插入到数据库中。4. 此方法适用于需要批量插入多个用户记录的场景,可以显著提高插入效率。
使用方法:在Mapper接口中定义对应的方法,例如:int batchInsert(List<User> users);调用时传入一个User对象列表即可。
注意:1. 如果传入的用户列表为空,MyBatis将不会执行任何插入操作。2. 如果用户的数据库不支持批量插入,可能会导致插入失败或者性能问题。3. 如果需要插入多个字段,可以在values中添加更多的 #{user.xxx} 占位符。-->
<insert id="batchInsert" parameterType="list">INSERT INTO users (name, age) VALUES<foreach item="user" collection="list" separator=",">(#{user.name}, #{user.age})</foreach>
</insert>

四、复用SQL片段

1. <sql><include>

用途:定义可重用的SQL片段。

示例

<!-- 
定义SQL片段
功能:定义一个可重用的SQL片段,包含用户表的列名
说明:1. id="userColumns":定义这个SQL片段的唯一名称,用于在其他地方引用。2. 这个片段包含用户表的主要列名:id, name, age。3. 通过使用SQL片段,可以避免在多个查询中重复编写相同的列名。4. 如果需要按条件查询或动态列过滤,可以在此基础上进行扩展。-->
<sql id="userColumns">id, name, age</sql><!-- 
查询所有用户信息
功能:从 users 表中查询所有用户信息,并返回 User 对象列表
说明:1. id="getAllUsers":标识这个查询操作的唯一名称。2. resultType="User":指定查询结果的类型为 User 对象。3. <include refid="userColumns"/>:引用之前定义的SQL片段,避免重复编写列名。4. 这个查询会从 users 表中选择 id, name, age 列的所有数据。
用法:在Mapper接口中定义对应的方法,例如:List<User> getAllUsers();返回一个包含所有用户信息的User对象列表。
建议:1. 如果需要查询特定条件下的用户,可以在SQL中添加 WHERE 子句。2. 如果需要避免列名和别名冲突,可以在SQL片段中使用别名,例如:<sql id="userColumns">id AS user_id, name AS user_name, age AS user_age</sql>3. 对于查询结果的列数较多的情况,建议使用 resultMap 映射字段,以确保列名与对象属性正确对应。-->
<select id="getAllUsers" resultType="User">SELECT <include refid="userColumns"/> FROM users
</select>

五、参数处理

1. #{}${}

  • #{}:预编译参数(防SQL注入)
  • ${}:直接替换(慎用,如动态表名)

示例:动态排序

<!-- 
动态排序查询用户信息
功能:从 users 表中查询所有用户信息,并根据传入的 orderBy 参数进行排序
参数:orderBy(字符串类型)
注意:1. ${orderBy} 是 MyBatis 的动态 SQL 特性,用于将传入的参数直接拼接到 SQL 语句中,而不是通过预编译参数。2. 使用 ${} 时需要特别小心,因为它会直接将参数插入到 SQL 语句中,可能导致 SQL 注入漏洞。3. 如果 `orderBy` 参数未经过充分验证,可能会被恶意构造的 SQL 语句利用,对数据库造成危害。
建议:1. 在应用程序中,确保 `orderBy` 参数只能来源于受信任的来源,如预定义的有效排序字段。2. 对于不可信的输入,应使用白名单机制对 `orderBy` 参数进行验证,只允许指定的有效字段。3. 如果必须使用动态排序,可以考虑以下更安全的实现方式:- 使用枚举起有效的排序字段,并在代码中进行验证。- 或者,将 `orderBy` 参数替换为一个完整的 SQL 片段,但同样需要进行严格的验证和转义。-->
<select id="getUsersOrdered" resultType="User">SELECT * FROM users ORDER BY ${orderBy}
</select>

六、总结

拓展阅读:MyBatis映射文件 resultMap 元素详解与示例

MyBatis官方文档(mybatis.org)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlDbx 是一款数据库管理工具资源分享

SqlDbx_Chs 是 SqlDbx 的中文版本。SqlDbx 是一款数据库管理工具&#xff0c;支持多种数据库系统&#xff0c;如 MySQL、Oracle、SQL Server、PostgreSQL 等&#xff0c;主要用于执行 SQL 查询、管理数据库对象及数据操作。 主要功能 SQL 查询执行&#xff1a;支持编写和运行…

Dav_笔记14:优化程序提示 HINTs -4

指定全局表提示 指定表的提示通常是指发生提示的DELETE&#xff0c;SELECT或UPDATE查询块中的表&#xff0c;而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示&#xff0c;Oracle建议使用全局提示&#xff0c;而不是在视图中嵌入提示。 您可以使用包含具…

Python 文本探秘:正则表达式的易错迷宫穿越 -- 7. 正则表达式

正则表达式是 Python 中处理文本的强大武器&#xff0c;但它复杂的语法和规则构成了一个易错迷宫。本文深入剖析了正则表达式模式编写的错误、匹配规则的误解、性能优化的忽视等问题。通过大量的文本处理实例&#xff0c;展示了错误的正则表达式使用方式以及正确的解决方案。帮…

PPT工具集

PPT模版 免费下载 爱PPT优品PPTPPT之家第一PPTOfficePlus部分免费 AI生成PPT Kimi秘塔搜索 可以输入内容生成PPT大纲。

rocketmq-netty通信设计-request和response

1、NettyRemotingServer启动分析 org.apache.rocketmq.remoting.netty.NettyRemotingServer#start public void start() {this.defaultEventExecutorGroup new DefaultEventExecutorGroup(nettyServerConfig.getServerWorkerThreads(),new ThreadFactory() {private AtomicI…

Datawhale 数学建模导论二 笔记1

第6章 数据处理与拟合模型 本章主要涉及到的知识点有&#xff1a; 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论&#xff0c;如果对这部分内容不熟悉&#xff0c;可以参考相关概率论与数理统计的…

git如何下载指定版本

要使用Git下载指定版本&#xff0c;可以通过以下步骤进行操作‌&#xff1a; ‌1. 使用Git命令行下载指定版本‌&#xff1a; 1.1 首先&#xff0c;使用git clone命令克隆整个git库到本地。例如&#xff1a;git clone [库的URL]。这将下载最新的代码到本地。‌ 1.2 进入克隆…

安卓基础(持续更新的笔记)

为什么要这样&#xff1a; // 创建请求体RequestBody body RequestBody.create(MediaType.parse("application/json; charsetutf-8"),jsonObject.toString()); jsonObject 就包含了一个 JSON 数据&#xff0c;它其实就是&#xff1a; {"name": "张…

Spring Boot应用开发

一、了解Spring Boot Spring Boot是一个基于Spring框架的开源Java基础框架&#xff0c;它可以帮助我们快速开发独立的、基于生产级的基于Spring框架的应用程序。简单来说&#xff0c;它就像是一个“超级助手”&#xff0c;帮你把很多复杂的配置都简化了&#xff0c;让你能更轻…

算法笔记——字典树

什么是字典树&#xff1f; 一棵字典树树就像一个小型字典一样&#xff0c;当你拿到一个字想去字典上查的时候&#xff08;以拼音查法为例&#xff09;&#xff0c;你会先查这个拼音的开头字母&#xff0c;然后在按需查找他下一个字母直到找到相对应的拼音才可以。字典树也是如此…

Python实现AWS Fargate自动化部署系统

一、背景介绍 在现代云原生应用开发中,自动化部署是提高开发效率和保证部署质量的关键。AWS Fargate作为一项无服务器计算引擎,可以让我们专注于应用程序开发而无需管理底层基础设施。本文将详细介绍如何使用Python实现AWS Fargate的完整自动化部署流程。 © ivwdcwso (ID…

单元测试整理

在国外软件开发中&#xff0c;单元测试必不可少&#xff0c;但是国内并不太重视这一块&#xff0c;一个好的单元测试可以提前发现很多问题&#xff0c;也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…

Unity Shader Graph 2D - Procedural程序化图形之渐变的正弦波形

前言 正弦波形也是一种常用、常见的程序化图形&#xff0c;合理的使用正弦波形会创作出一些有趣、美观和丰富的效果&#xff0c;本文将使用Unity Shader Graph来实现一个正弦波形效果&#xff0c;帮助理解和实践Unity Shader Graph以及正弦函数。 创建一个名为SineWave的Shader…

【WPSOffice】汇总

写在前面 PPT篇 幻灯片母版 通过母版功能统一幻灯片的样式、字体、颜色等&#xff0c;提高整体一致性。 智能抠图 选中图片&#xff0c;图片工具-》智能抠图。 统一设置模板样式 字体安装 查找到字体并安装。 在WPS PPT&#xff08;WPS演示&#xff09;中&#xff0c;以…

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Windows环境搭建ES集群

搭建步骤 下载安装包 下载链接&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…

网站地址栏怎么变成HTTPS开头?

在当今的数字世界中&#xff0c;网络安全已成为不可或缺的一部分。对于网站管理员和所有者来说&#xff0c;确保访问者数据的安全和隐私至关重要。HTTPS是一种加密的通信协议&#xff0c;通过在客户端和服务器之间建立安全连接来保护数据传输。将网站从HTTP升级到HTTPS不仅提升…

CSS Grid 网格布局,以及 Flexbox 弹性盒布局模型,它们的适用场景是什么?

CSS Grid网格布局和Flexbox弹性盒布局模型都是现代CSS布局的重要工具&#xff0c;它们各自具有独特的优势和适用场景。 作为前端开发工程师&#xff0c;理解这些布局模型的差异和适用场景对于编写高效、可维护的代码至关重要。 CSS Grid网格布局 适用场景&#xff1a; 复杂…

什么是HTTP Error 429以及如何修复

为了有效管理服务器资源并确保所有用户都可以访问&#xff0c;主机提供商一般都会对主机的请求发送速度上做限制&#xff0c;一旦用户在规定时间内向服务器发送的请求超过了允许的限额&#xff0c;就可能会出现429错误。 例如&#xff0c;一个API允许每个用户每小时发送100个请…

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…