网站首页 > 技术文章 正文
一、映射文件基础内容
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
映射配置文件(mapper文件)中包含了要执行的 SQL 语句以及相应的数据和对象之间的映射关系。
1、映射配置 Demo
2、关于 select 语句属性
select 语句有很多属性:
- id – 唯一标识 select 语句
- parameterType --参数类型
- paramerterMap – 参数映射
- resultType – 返回类型
- resultMap – 返回类型映射
- flushCache – 当语句被调用时,是否清除本地缓存或二级缓存
- useCache – 是否使用二级缓存
- timeout – 在抛出异常之前,驱动程序等待数据库返回请求结果的秒数
- fetchSize – 每次批量返回的结果行数
- statementType – 使用 STATEMENT,PREPARED 或 CALLABLE 的一个
- resultSetType – 使用 FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个
3、关于 resultType
resultType 可表示返回基本类型,也可表示返回自定义对象类型
返回基本类型:
<select id="listUserInfo" resultType="int">
SELECT userId FROM user_info
</select>
返回自定义类型:
<select id="getUserInfoById" resultType="UserInfo">
SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}
</select>
4、关于 resultMap
resultMap 主要解决 TABLE 字段与 JavaBean 映射不匹配问题。
举个栗子:
定义一个 JavaBean:
@Getter
@Setter
public class UserInfo {
String userName;
String addr;
}
JavaBean 对应的 sql 语句:
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`user_id` int(5) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`user_addr` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
JavaBean 与 Sql 语句中,user_name 与 userName 不匹配,user_addr 与 addr 不匹配。
通过 resultMap 就能很好地解决该问题
<resultMap id="userInfoMap" type="UserInfo">
<result property="userName" column="user_name"/>
<result property="addr" column="user_addr"/>
</resultMap>
property 表示 JavaBean 属性,column 表示 table 表字段。
5、关于占位符 #{} 与 ${}
- #{} 是预编译处理,${} 是字符串替换。
- #{},采用的是占位符形式,参数化执行,防止SQL注入,底层原理使用 PreparedStatement 对象。
- ${},采用的是字符串替换,不能防止SQL注入,底层原理使用 Statement 对象。
二、映射文件动态SQL
动态 SQL 的原理是:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。
MyBatis 中的动态 SQL 标签主要包括:
1、<if> 标签:条件判断
if 语句使用方法简单,常常与 test 属性联合使用:
<if test="判断条件"> SQL语句 </if>
普通的 Sql 中对于只有一个参数,后面的 #{param} 表示占位符,里面的 param 可以为任意值,对于多个参数则须写清对应的 pojo 类里面的属性
在 普通的 Sql 中如果我们想 #{username} 为空情况下就只查 #{sex},这种情况该如何实现呢?使用 if 来判断,可多个 if 语句同时使用。以下语句表示为可以按照网站名称(name)或者网址(url)进行模糊查询。如果您不输入名称或网址,则返回所有的网站记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录。
2、<where> + <if> 标签
where、if 同时使用可以进行查询、模糊查询
Ps:<if> 失败后, <where> 关键字只会去掉库表字段赋值前面的 and,不会去掉语句后面的 and 关键字,即 <where> 只会去掉 <if> 语句中的最开始的 and 关键字。
这个 <where> 标签会知道如果它包含的标签中有返回值的话,它就插入一个 where。此外,如果标签返回的内容是以 AND 或 OR 开头的,则它会剔除掉。
3、<set> + <if> 标签
Set、if 同时使用可以用来修改
4、choose(when,otherwise) 语句
有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
在上面代码中,我们有三个条件,id,username,sex,只能选择一个作为查询条件
- 如果 id 不为空,那么查询语句为:select * from user where id=?;
- 如果 id 为空,那么看username 是否为空,如果不为空,那么语句为 select * from user where username=?;
- 如果 username 为空,那么查询语句为 select * from user where sex=?;
5、<trim> 格式化的标记
trim 标记是一个格式化的标记,可以完成 set 或者是 where 标记的功能
用 trim 改写上面第二点的 if+where 语句:
- prefix:前缀
- prefixoverride:去掉第一个 and 或者是 or
用 trim 改写上面第三点的 if+set 语句:
- suffix:后缀
- suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
trim+if 同时使用可以添加:
6、<foreach> 标签
foreach是用来对集合的遍历,这个和 Java 中的功能很类似。通常处理 Sql 中的 in 语句。
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
7、<sql>:可重用语句
在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了 <sql> 这个标签了。<include> 用于引用 <sql> 标签定义的常量
举个栗子:
引定义好的 Sql:
三、MyBatis 映射关联查询
1、一对多映射
2、多对一映射
3、多对多映射
- 上一篇: Java开发者必备:5个提升编码效率的实用技巧
- 下一篇: 只需三步,让二维码数据秒变ERP对象
猜你喜欢
- 2025-07-20 Hutool JSONUtil巧妙过滤null值:JSON转Map数据清洗的终极方案
- 2025-07-20 HBase基础知识,面向列的实时分布式数据库
- 2025-07-20 Java Map 所有的值转为String类型
- 2025-07-20 HashMap-entrySet( )原理(hashmap原理详解)
- 2025-07-20 常见的Java性能问题,我来手把手教你定位!
- 2025-07-20 面试怕被问Hashmap,多看看这个文章
- 2025-07-20 Map遍历的四种方法效率对比(map遍历方式)
- 2025-07-20 面试官:知道ThreadLocal嘛?谈谈你对它的理解?
- 2025-07-20 内存溢出OutOfMemoryError科普系列一
- 2025-07-20 HashMap详解(hashmap理解)
- 最近发表
-
- Qt编程进阶(63):Qt Quick高级控件的使用
- Qt编程进阶(47):QML鼠标事件处理(qt编程难不难)
- 使用Xamarin和Visual Studio开发Android可穿戴设备应用
- Qt使用教程:创建Qt Quick应用程序(三)
- QML性能优化 | 常见界面元素优化(qml布局自适应大小)
- Qt使用教程:创建移动应用程序(二)
- Qt Quick 多媒体开发播放音乐和视频
- Qt使用教程:创建Qt Quick UI表单(三)
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
- QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)