7、mybatis中的sql映射文件详解(2)

对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了解如何用的问题,如何使用mybatis、有几种使用方式、各种方式的优缺点,在这个阶段也会学习mybatis涉及到的一些标签的用法;当知道了基础用法之后,就开始接触一些高级的用法,例如动态sql的使用、mybatis的缓存使用等;至此,在实战项目中使用mybatis进行开发已经没有问题了。

接下来就开始深入的研究一下mybatis这个持久层的框架,在纯技术的方面进行研究,提高自己的能力。首先,大家需要了解一下mybatis的整体技术架构和工作原理;接下来,就开始了解一下mybatis各大核心组件的具体功能及其工作原理。至此,算是对mybatis的原理简单的了解一下了,由于博主的能力有限,因此对于mybatis的框架技术研究也就到这里算结束了。

最后会了解一些其他的东西,例如:mybatis的逆向工程使用、如何开发一个mybatis插件,在这里会介绍一下mybatis的分页实现等。

至此,mybatis也算是入门了,出去就可以和别人说,你稍微了解mybatis框架,对其也多少有一点自己的理解和看法了。

目录

1、输入映射

1、1 传入参数的方式

1)传入单个参数

2)传入多个参数

3)传入实体bean

4)传入集合

1、2 参数的获取

1)#{}

2)${}

2、输出映射

2、1 自动映射结果集 resultType

1)结果映射到Integer

2)结果映射到实体

3)结果映射到集合

4)结果映射到map

2、2 自定义结果集映射 resultMap


上一篇 留的两个问题如何传入参数、如何将查询结果映射到java对象中,这一篇做一下介绍。

大体上可分为两部分:输入映射、输出映射

1、输入映射

输入映射这里指的是将java中的参数传入到mybatis映射文件中,继而进行数据查询。

1、1 传入参数的方式

需要往sql中传入参数时,在sql 映射文件中需要指定类型,一般通过 parameterType 属性进行设置 ,但是mybatis是强大的,即使在sql映射文件中不用 parameterType 指明传入参数的类型,mybatis依然可以自动识别类型,但是建议在开发时写明,维护时可以直接明确传入参数的类型。

虽然上边这句话可能有人觉得会自相矛盾,但是还是有必要理解的,可以看一个例子:

sql 文件中写两个sql,他们区别在于,一个指定了传入参数的类型

<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert><insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>

在接口中定义两个方法,调用时效果是一样的,都会添加数据到数据库

Integer insertUser(User user);Integer insertUser2(User user);

 好了,知道了上边的这些,就可以继续下边的介绍了,接下来一次介绍传入单个参数、多个参数、传入实体、传入map、传入list时如何开发sql映射文件

1)传入单个参数

直接看例子吧,没什么可说的

<delete id="delUser">delete from oa_user where id = #{id}
</delete>
Integer delUser(Long id);或者// 可以使用 @Param 来设置传入的参数名
Integer delUser(@Param("id") Long id);

2)传入多个参数

有的时候可能需要传入多个参数,mybatis会自动将多个参数封装到一个map中,sql映射文件中获取参数时也是通过获取map中参数方式。例如:需要根据性别和状态获取用户列表数据,则可以这样开发

<select id="selectUsersBySexAndStatus" resultType="com.app.mapper.User">select * from oa_user where sex = #{sex} and status = #{status}
</select>

 接口中方法:

List<User> selectUsersBySexAndStatus(String sex, String status);

3)传入实体bean

<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>

 接口中的方法

Integer insertUser(User user);

4)传入集合

<insert id="insertUserList" useGeneratedKeys="true" keyProperty="id">insert into oa_user (id, loginName, name) values<foreach collection="list" item="user" separator=",">(#{user.id}, #{user.loginName}, #{user.name})</foreach>
</insert>
Integer insertUserList(List<User> list);

1、2 参数的获取

在sql映射文件中有两种获取参数的方式,一种是使用 #{},第二种是使用 ${},接下来,说一下这两者的用法和区别。

1)#{}

以预编译的形式将参数设置到sql语句中,相当于 JDBC 中的PreparedStatement,可以有效防止参数注入,一般可适用于大部分增、删、改、查语句中。

另外,可以通过jdbcType 属性进行类型的设置,用到的时候查询mybatis官方文档即可,我基本没有碰到过。

使用时,直接通过#{param} 参数名获取对应的参数值。

2)${}

将对应值直接拼接到sql语句中,相当于 Statement,一般用于模糊查询、排序语句中。

使用时,直接通过#{param} 参数名获取对应的参数值。

使用范例在这里就不写了,之前所有的例子中基本都用到了参数。

2、输出映射

2、1 自动映射结果集 resultType

对于一些简单的查询,mybatis可以自动映射结果集到类、实体、集合中,需要通过resultType 属性进行标识。具体使用如下:

1)结果映射到Integer

对于增、删、改的处理,如果没有使用resultType显示声明返回的结果集映射类型,则自动映射到Integer类型,为处理成功的记录数。

<!-- 返回结果集映射到Integer,为添加结果记录数 -->
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>

2)结果映射到实体

一般是用于数据查询,返回单条记录,会将数据自动封装到对应的实体类中:

<!-- 会将添加的结果映射到User实体类中,返回添加成功的User -->
<insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>

3)结果映射到集合

一般用于数据查询,返回多条记录,会将数据自动映射到对应的实体类中集合中,但是在sql 映射文件中使用resultType声明返回的结果类型为实体类型,而非集合类型,这个需要注意:

<select id="selectUserList" resultType="com.app.mapper.User">select * from oa_user
</select>

4)结果映射到map

 通过 resultType 显式设置返回结果集映射到 map 即可,resultType = 'map'

2、2 自定义结果集映射 resultMap

可以使用 resultMap标签 来进行结果集的自定义映射。在实际开发中,其实使用自动映射一般就可以满足需求了。

其大体思路就是,先使用 resultMap 标签定义映射关系,之后使用resultMap 属性来标识返回的结果集通过自定义的映射关系进行映射。​简单使用如下:

<resultMap id="user" type="com.app.mapper.User"><!-- 映射主键列,column是数据表对应的字段,property是实体User对应的字段 --><id column="id" property="id"/><!--映射非主键列时,使用result标签即可这里我自定义映射关系,将loginname字段信息映射到实体类的email属性上--><result column="loginName" property="email"/>
</resultMap><!-- 在这里使用resultMap 声明结果集映射的类型 -->
<select id="selectUser3" resultMap="user">select * from oa_user where id = #{id}
</select>

 好了,这一篇就到此位置,针对于resultMap还可以实现更复杂的映射,由于篇幅原因在这里先不详细介绍,在 下一篇 继续描述。

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

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

相关文章

jzoj4051-序列统计【NTT】

正题 题目链接:https://jzoj.net/senior/#contest/show/3017/2 题目大意 求有多少个长度为nnn的序列使得 都是在集合SSS中的数这些数的乘积%mx\% mx%mx 解题思路 设fi,jf_{i,j}fi,j​表示长度为iii的序列&#xff0c;乘积为jjj的有多少个&#xff0c;显然有 fi,j∗w%mfi−1…

玩Docker只要浏览器就够了,PWD是个神奇的网站

本文是d4d系列的第9篇&#xff0c;在这一篇中给大家介绍一个学习Docker最为快捷高效的方式&#xff0c;你不需要自己搭建环境&#xff0c;也不用担心把自己的开发环境搞乱&#xff0c;你需要的只是一个浏览器&#xff0c;就可以立即开始学习Docker的常用命令&#xff1b;你甚至…

【树形DP】没有上司的晚会 (ssl 1607)

没有上司的晚会没有上司的晚会没有上司的晚会 Description Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c…

8、mybatis中的sql映射文件详解(3)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

P3159-[CQOI2012]交换棋子【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3159 题目大意 n∗mn*mn∗m的棋盘&#xff0c;每个格子有黑子或白子&#xff0c;每次可以交换两个位置的棋&#xff0c;给出起始态和最终态和每个格子参与交换的最多次数。 求最少交换次数。 解题思路 这里只把白色棋子算作…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

【动态规划】【递归】取数字问题 (ssl 1644)

取数字问题取数字问题取数字问题 Description 给定M*N的矩阵&#xff0c;其中的每个元素都是-10到10之间的整数。你的任务是从左上角&#xff08;1&#xff0c;1&#xff09;走到右下角&#xff08;M&#xff0c;N&#xff09;&#xff0c;每一步只能向右或向下&#xff0c;并…

9、mybatis中动态sql的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

P4721-[模板]分治FFT【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4721 题目大意 给出序列ggg&#xff0c;然后f01f_01f0​1 fi∑j1ifi−jgjf_{i}\sum_{j1}^if_{i-j}g_jfi​j1∑i​fi−j​gj​ 求序列fff 解题思路 使用分治后用NTTNTTNTT计算前区间对后区间的贡献即可。 时间复杂度O(nlo…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…

P3195-[HNOI2008]玩具装箱【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品&#xff0c;分成若干段&#xff0c;每一段的长度为j−i∑ilrCkj-i\sum_{il}^rC_kj−i∑ilr​Ck​&#xff0c;打包价格为(长度−L)2(长度-L)^2(长度−L)2 求最小价格和。 解题思路 si∑j1iCjs_i\su…

【动态规划】书的复制 (ssl 1203)

书的复制书的复制书的复制 Description 现在要把m本有顺序的书分给k个人复制&#xff08;抄写&#xff09;&#xff0c;每个人的抄写速度都一样&#xff0c;一本书不允许分给两个或两个以上的人抄写&#xff0c;分给每个人的书&#xff0c;必须是连续的&#xff0c;比如不能把…

P1975-[国家集训队]排队【树状数组套线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P1975 题目大意 一个nnn个数字的序列&#xff0c;每次交换两个数&#xff0c;求逆序对。 解题思路 显然交换lll和rrr的话对[1..l−1][1..l-1][1..l−1]和[r1,n][r1,n][r1,n]是不会有影响的&#xff0c;所以我们只需要考虑ll…

【动态规划】分组背包 (ssl 2291)

分组背包分组背包分组背包 Description 有N件物品和一个容量为V的背包。第i件物品的费用是c[i]&#xff0c;价值是w[i]。这些物品被划分为若干组&#xff0c;每组中的物品互相冲突&#xff0c;最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量&#…

如何在Visual Studio 2017中使用C# 7+语法

前言之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法&#xff0c;然后闲来无事&#xff0c;搞着&#xff0c;搞着没搞出来&#xff0c;然后就写了这篇博文&#xff0c;不喜勿喷&#xff0c;或许对您有帮助。在Visual Studio 2017配置支持C# 7语法心想都VS20…