一、输入映射

  我们通过配置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

Mybatis中输入输出映射和动态Sql相关推荐

  1. MyBatis mapper 注解过程中通过 LanguageDriver 实现动态 SQL

    使用前,可以先看一下 链接: http://www.mybatis.org/mybatis-3/dynamic-sql.html 详细说明了 mybatis 的动态 sql 实现方式,这里将重点关注 ...

  2. Mybatis的特性详解——动态SQL

    Mybatis的特性详解--动态SQL 前言 一.动态sql的元素 1.MyBatis if标签:条件判断 2.MyBatis choose.when和otherwise标签 3.MyBatis wh ...

  3. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

  4. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  5. Mybatis的第三章动态sql总结

    我们来讲一下为什么要使用Mybatis的动态sql ? *因为动态sql之所以是Mybatis 的强大特性是因为我们在使用JDBC操作数据库的时候如果查询特别的多,将条件串联成sql字符串是一件很痛苦 ...

  6. MyBatis学习 之 三、动态SQL语句

    2019独角兽企业重金招聘Python工程师标准>>> 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的, ...

  7. MyBatis之基于XML的动态SQL

    先说下我的梦想,大学的时候一直想着是能开店卖胡辣汤,到目前依然还是我的梦想,上周一家出版社联系我问我有没有时间可以合作出书,这也是我的梦想之一,想了想还是放弃了,至少觉得目前不行,毕竟工作还不到五年, ...

  8. Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?

    作者 | 稻草江南 来源 | https://juejin.cn/post/6883081187103866894 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎么 ...

  9. mybatis collection标签_一对多的关系,在MyBatis中如何映射?

    # 使用collection标签 需求:根据用户id查询用户信息的同时获取用户拥有的角色,一个用户可以拥有1个或多个角色. 一般情况下,不建议直接修改数据库表对应的实体类. 所以这里我们延用之前博客中 ...

最新文章

  1. html5与python工资对比_求助各位,python和前端html5如何选择?
  2. Exception经验之谈,万万没想到被很多团队采纳!
  3. 科沃斯机器人双十一全渠道成交额超7亿 两大爆款单品携手破亿
  4. 前端学习(1321):node.js得异步api
  5. 时间戳转换为时间格式,时间格式转换为时间戳
  6. 2012考研数学二第(3)题——数列收敛与部分和有界的关系
  7. linux驱动开发篇Linaro(arm交叉编译器的下载与安装)
  8. 电脑中的驱动程序是什么,是干什么的
  9. An Improved One millisecond Mobile Backbone 论文笔记
  10. 菩提本无树 明镜亦非台
  11. Canvas 指纹追踪技术
  12. 从ADK的WinPE自己手动构建自己的PE
  13. ch.ethz.ssh2.Session和com.jcraft.jsch.Session
  14. Android开发(3):个人信息界面设计
  15. win10系统更新完不能开机怎么办【系统天地】
  16. 查询电话号码归属地的PHP接口(处理过可供前端使用的)
  17. 手机上网:警惕流量“黑洞”
  18. python深度学习之基于LSTM时间序列的股票价格预测
  19. NOTES邮箱打不开,提示打开的文件出错(打开的文件时出错)。
  20. onnx prelu转换

热门文章

  1. python symbol函数展开_QGIS表达式中的函数
  2. python创建数据库表空间_7.自动化监控多个Oracle表空间
  3. 阜阳市乡镇企业中专学校计算机教师高翱简介,2017年中南林业科技大学博士研究生奖助学金...
  4. python中的深拷贝与浅拷贝
  5. 6 areas of artificial intelligence to watch closely 需要密切关注的六大人工智能/机器学习领域
  6. webpack4进阶配置
  7. JAVA EE 基本了解
  8. gbk 转 UTF-8
  9. Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究
  10. Oracle 数据库字典 sys.obj$ 表中关于type#的解释