Mybatis中输入输出映射和动态Sql

一、输入映射

  我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型、POJO、HashMap等数据类型

  1、简单类型

  2、POJO包装类型

  ①这是单表查询的时候传入的POJO包装类型,即可以直接传入实体类,但是当多表查询的时候,就需要自定义POJO类型

  ②我们使用自定义POJO类型来具体的了解一下

  先设计 包装类型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相关的属性的包装类,UserVo是用于视图层面的包装类型,同样也是作为Mapper配置文件的输入类型

  其中User文件同Mybatis简单入门中的User,包括数据表部分也一样。这里给出UserPoJO和UserVo文件

 1 package cn.mybatis.po;2 3 public class UserPoJo extends User{4     private User user;5 6     public void setUser(User user) {7         this.user = user;8     }9 
10     public User getUser() {
11         return user;
12     }
13 }复制代码

 1 package cn.mybatis.po;2 3 public class UserVo {4     private UserPoJo userPoJo;5 6     public UserPoJo getUserPoJo() {7         return userPoJo;8     }9 
10     public void setUserPoJo(UserPoJo userPoJo) {
11         this.userPoJo = userPoJo;
12     }
13 }复制代码

  然后我们配置UserMapper.xml文件

  然后在UserMapper接口文件中添加

    //测试包装类型的查询public List<UserPoJo> findUserList(UserVo userVo) throws Exception;复制代码

  使用Junit测试刚刚做的配置

 1     @Test2     public void testFindUserList() throws Exception {3         SqlSession sqlSession = sqlSessionFactory.openSession();4         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);5 6         UserPoJo userPoJo = new UserPoJo();7         UserVo userVo = new UserVo();8         userPoJo.setSex("男");9         userPoJo.setUsername("u");
10         userVo.setUserPoJo(userPoJo);
11 
12         List<UserPoJo> userPoJoList = userMapper.findUserList(userVo);
13 
14         System.out.println(userPoJoList);
15     }复制代码

  最后结果如下

二、输出映射

1、resultType

①在使用resultType进行映射的时候,只有查询出来的列名和包装类型中的属性名一致的时候,才会映射成功

②当使用简单类型作为输出映射的时候,我们需要保证Sql查询的结果只有一行一列,这样就可以使用简单类型

如下所示示例

SELECT COUNT(*) FROM t_userSELECT username FROM t_user WHERE id = 2复制代码

2、resultMap  

  查询出来的列名和包装类型的属性名不一致的时候,可以使用resultMap来进行相应的映射(具体在使用中来说就是:定义resultMap中和属性的映射关系,然后将输出结果设置为resultMap的类型)  

  下面我们使用一个例子来进行具体的测试

  ①首先编写mapper配置文件,其中需要加上resultMap的配置

 1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">5 <mapper namespace="cn.mybatis.mapper.UserMapper">6 7     <!--定义resultMap8         type:resultMap最终映射的Java对象类型9         id:对resultMap的标识
10     -->
11     <resultMap id="userResultMap" type="user">
12         <!--id:标识查询结果集中的唯一标识-->
13         <id column="_id" property="id"></id>
14         <!--result:标识查询结果集中其他列的标识-->
15         <result column="_username" property="username"></result>
16         <result column="_password" property="password"></result>
17         <result column="_sex" property="sex"></result>
18         <result column="_address" property="address"></result>
19     </resultMap>
20 
21     <select id="findUserById_resultMap" parameterType="int" resultMap="userResultMap">
22         SELECT id _id, username _username, PASSWORD _password, address _address, sex _sex FROM t_user WHERE id = #{id}
23     </select>
24 </mapper>复制代码

  ②然后在Mapper接口中添加方法

    //测试resultMappublic User findUserById_resultMap(int id) throws Exception;复制代码

  ③ 测试方法

1     @Test
2     public void testFindUserById_resultMap() throws Exception {
3         SqlSession sqlSession = sqlSessionFactory.openSession();
4         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
5 
6         User user = userMapper.findUserById_resultMap(2);
7 
8         System.out.println(user);
9     }复制代码

  ④可以发现,使用resultMap的方式跟直接查询的结果是一致的

三、动态Sql

1、if判断

我们在上面使用包装类查询的用例的时候,考虑到可能出现userPoJo会是null的情况,以及其相应的属性也可能是null的情况,这样的话,如果我们直接在Sql中进行拼接而不做判断的话,可能会出现一些错误,所以我们使用if来进行动态的拼接。

    <select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">SELECT * FROM t_user<where><if test="userPoJo != null"><if test="userPoJo.sex != null and userPoJo.sex != ''">AND sex = #{userPoJo.sex}</if><if test="userPoJo.username != null and userPoJo.username != ''">AND username LIKE '%${userPoJo.username}%'</if></if></where></select>复制代码

2.Sql片段

上面的例子中,我们可以将if判断抽取出来作为一个Sql片段,这样做的好处是,可能再进行别的单表查询User信息的时候可以重复使用这些Sql。

 1     <!--定义Sql片段-->2     <sql id="query_user_info">3         <if test="userPoJo != null">4             <if test="userPoJo.sex != null and userPoJo.sex != ''">5                 AND sex = #{userPoJo.sex}6             </if>7             <if test="userPoJo.username != null and userPoJo.username != ''">8                 AND username LIKE '%${userPoJo.username}%'9             </if>
10         </if>
11     </sql>复制代码

然后在别的Sql中将上面的Sql片段引入拼接即可

1     <select id="findUserList" parameterType="cn.mybatis.po.UserVo" resultType="cn.mybatis.po.UserPoJo">
2         SELECT * FROM t_user
3         <where>
4             <include refid="query_user_info"></include>
5         </where>
6     </select>复制代码

3.foreach

当我们需要一种同样的查询方式只是参数不同的时候:SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3),可以使用foreach来记性sql拼接

    <sql id="query_ids"><if test="ids != null"><!--SELECT * FROM t_user WHERE 1=1 AND (id = 1 OR id =2 OR id = 3)cilleation: 指定的是输入参数集合的属性名item:每次遍历的名称open:开始遍历时拼接串close:结束遍历时候拼接的串separator:遍历的两个对象中间需要拼接的串--><foreach collection="ids" item="item_id" open="AND (" close=")" separator=" OR ">id=#{item_id}</foreach></if></sql>复制代码

然后将上面的Sql片段加入响应的statment中

    <select id="findUserByIds" parameterType="userVo" resultType="userPoJo">SELECT * FROM t_user<where><include refid="query_ids"></include></where></select>复制代码

测试结果如下


转载于:https://juejin.im/post/5ceb9bc9f265da1bb13f1022

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

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

相关文章

css纯字母或者字母换行显示

white-space:normal; word-break:break-all;转载于:https://www.cnblogs.com/mmykdbc/p/7661009.html

javascript使用btoa和atob来进行Base64转码和解码

javascript中如何使用Base64转码 let str javascript;let btoaStr window.btoa(str); //转码结果 amF2YXNjcmlwdAconsole.log(btoaStr);console.log(window.atob(btoaStr)); //解码结果 javascriptBase64转码的对象只能是字符串, var str "China&#xff0c;中国"…

珠宝条码打印扫描解决方案

随着人们生活水平的逐步提高&#xff0c;珠宝消费日益增长&#xff0c;据统计&#xff0c;我国珠宝首饰零售规模超过7000亿&#xff0c;过去5年复合增长为15%&#xff0c;是规模增长最为迅速的可选消费品类之一。面对千亿级的消费市场&#xff0c;珠宝行业竞争激烈&#xff0c;…

课程作业1

1使用组合数公式利用n!来计算 a.设计思想 定义n和k&#xff0c;用递归函数表示出N!的阶乘结果&#xff0c;c(n,k)n!/(k!(n-k)!);调用函数求出c(n,k)的结果 b.源代码 package kecheng1; import java.util.Scanner; public class Test {public static void main(String[] args) {…

新手学Python推荐的四本书籍+2个资源网站

2019独角兽企业重金招聘Python工程师标准>>> 很多伙伴初学Python&#xff0c;会问到&#xff1a;有没有好的学习书籍推荐&#xff1f;有没有好的学习网站推荐&#xff1f; 针对这类伙伴的问题&#xff0c;小优给大家整理了学习Python的四本书籍2个资源网站&#xff…

【转】Linux系统编程---dup和dup2详解

正常的文件描述符&#xff1a; 在linux下&#xff0c;通过open打开以文件后&#xff0c;会返回一个文件描述符&#xff0c;文件描述符会指向一个文件表&#xff0c;文件表中的节点指针会指向节点表。看下图&#xff1a; 打开文件的内核数据结构 dup和dup2两个函数都可以用来复制…

Android Activity标签属性

Android Activity标签属性 Activity 是 Android 系统四大应用组件之一&#xff0c;用户可与 Activity 提供的屏幕进行交互&#xff0c;以执行拨打电话、拍摄照片、发送电子邮件等操作开发者必须在清单文件中声明要使用的 Activity&#xff0c;这样系统才能访问它。声明方式是在…

Java -----JVM运行时数据区

一、JVM体系结构 想要了解运行时数据区&#xff0c;先关注一下JVM的体系结构&#xff0c;知道数据区在JVM的整体位置和作用。 二、JVM运行时数据区 1.程序计数器 一块较小的内存空间&#xff0c;它是当前线程所执行的字节码的行号指示器&#xff0c;字节码解释器工作时通过改变…

20155235 《网络攻防》 实验八 Web基础

20155235 《网络攻防》 实验八 Web基础 实验内容 Web前端HTML(0.5分) 能正常安装、启停Apache。理解HTML&#xff0c;理解表单&#xff0c;理解GET与POST方法,编写一个含有表单的HTML。Web前端javascipt(0.5分) 理解JavaScript的基本功能&#xff0c;理解DOM。编写JavaScript验…

python每天1道面试题(3)--字符串组合

""" 题目3&#xff1a;输入一个字符串&#xff0c;输出该字符串中字符的所有组合。举个例子&#xff0c;如果输入abc&#xff0c;它的组合有a、b、c、ab、ac、bc、abc。解题思路: 先用列举法,举例出组合元素长度分别是1,2,..,len(str)时的具体元素, 然后发现当数…

【每周一图】蜂鸟

摄影/祈澈姑娘小花园偶遇的一只蜂鸟转载于:https://www.cnblogs.com/wangting888/p/9702088.html

API网关如何实现对服务下线实时感知

上篇文章《Eureka 缓存机制》介绍了Eureka的缓存机制&#xff0c;相信大家对Eureka 有了进一步的了解&#xff0c;本文将详细介绍API网关如何实现服务下线的实时感知。 一、前言 在基于云的微服务应用中&#xff0c;服务实例的网络位置都是动态分配的。而且由于自动伸缩、故障和…

TCP为什么要三次握手和四次挥手

http://www.jellythink.com/archives/705 简析TCP的三次握手与四次分手 https://zhuanlan.zhihu.com/p/24001696 计算机网络面试题 https://www.zhihu.com/question/36930631 TCP四次分手中&#xff0c;主动关闭方最后为什么要等待2MSL之后才关闭连接&#xff1f; http://ww…

Java处理文件BOM头的方式推荐

背景&#xff1a; java普通的文件读取方式对于bom是无法正常识别的。 使用普通的InputStreamReader&#xff0c;如果采用的编码正确&#xff0c;那么可以获得正确的字符&#xff0c;但bom仍然附带在结果中&#xff0c;很容易导致数据处理出错。另外&#xff0c;对于存在BOM头的…

封装svg组件

如何封装svg图标组件 封装svg图标组件的方法有很多种&#xff0c;如果只是单纯的想使用svg图标&#xff0c;可以将svg导出fonts字体图标使用&#xff0c;但这样做会失去svg原有的样式与尺寸&#xff0c;也可以当成img图片或者背景引入&#xff0c;但这样做非常繁琐。 最近项目中…

RabbitMQ 延迟队列,消息延迟推送

应用场景 目前常见的应用软件都有消息的延迟推送的影子&#xff0c;应用也极为广泛&#xff0c;例如&#xff1a; 淘宝七天自动确认收货。在我们签收商品后&#xff0c;物流系统会在七天后延时发送一个消息给支付系统&#xff0c;通知支付系统将款打给商家&#xff0c;这个过程…

windows Navicat Premium连接oracle

需要下载并指定Instant Client 下载地址&#xff1a;在oracle官网搜索Instant Client Downloads选择自己需要的客户端 //说明 //Navicat 版本 9 或以上捆绑了 instant client&#xff0c;但是捆绑的用不了&#xff0c;捆绑的10.2。因此下载高版本替换之 //版本有要求&#xff0…

关于arraylist的扩容机制

ArrayList会自动改变size的长度&#xff1a; 首先&#xff0c;ArrayList定义了一个私有的未被序列化的数组elementData&#xff0c;用来存储ArrayList的对象列表&#xff08;注意只定义未初始&#xff09;&#xff1a;private transient Object[] elementData;   其次&am…

不同级别UI设计师的区别有哪些?

不同等级的UI设计师在工作内容以及基本的薪资待遇方面也是有区别的&#xff0c;很多在UI培训学校学习的小伙伴们并不知道各个等级的UI设计师工作内容有什么差别&#xff0c;那么合肥学码思小编就给大家总结一下这些区别分别表现在哪些方面。 一、初级UI设计师 初级UI设计师的主…

Linux命令行参数前加--,-和不加杠

参数前“-”的表明后面的参数是字符形式。参数前“--”的则表明后面的参数是单词形式。参数前有横的是System V风格。 参数前没有横的是BSD风格。 转载于:https://www.cnblogs.com/YYRise/p/9090476.html