mybatis系列笔记(4)---输入输出映射
输入输出映射
通过parameterType制定输入参数类型 类型可以是简单类型(int String)也可以是POJO本身 或者包装类
1输入映射
关于输入简单类型和pojo本身的我就不写了,因为比较简单,下面我主要举一个包装类的例子:
使用包装类POJO 将复杂的查询条件封装到POJO中
//当你继承user属性后,你就可以在user的基础上添加自己的属性了
public class UserCustomer extends User { //用户的基本信息
//可以扩展用户的信息
//其他信息
}
查询条件封装的类
public class UserQueryVo {
//这里包装需要查询的条件
private UserCustomer userCustomer;
public UserCustomer getUserCustomer() {
return userCustomer;
}
public void setUserCustomer(UserCustomer userCustomer) {
this.userCustomer = userCustomer;
}
UserMapper.xml
<!--
#{userCustomer.sex} 取出pojo对象 中性别的属性值
${userCustomer.username}取出pojo中 用户的名称
-->
<select id="findUserList" parameterType="com.study.model.UserQueryVo" resultType="com.study.model.UserCustomer">
select * from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select
UserMapper.java
//用户综合信息查询
public List<UserCustomer> findUserList(UserQueryVo userQueryVo) throws Exception;
测试代码
@Test
public void testFindUserList() throws Exception{
SqlSession sqlSession =sqlSessionFactory.openSession();
//创建UserMapper 对象 MyBatis自动生成代理对象
UserMapper userMapper =sqlSession.getMapper(UserMapper.class); //创建包装对象 设置查询条件
UserQueryVo userQueryVo =new UserQueryVo(); UserCustomer userCustomer =new UserCustomer();
userCustomer.setSex("1");
userCustomer.setUsername("小明");
userQueryVo.setUserCustomer(userCustomer); //完成查询
List<UserCustomer> list =userMapper.findUserList(userQueryVo);
System.out.println(list); }
2.输出映射
(1)resultType
使用resultType进行输出映射的时候 只有查询出来的列名和pojo 对应的属性名完全一致 才可以映射
如果查询出来的列名和pojo中的属性完全不一致 没有创建pojo对象
如果查询出来的列名和pojo中的属性只有部分一致 ,就会创建pojo对象 ,不一致的属性值为null
举例:查询用户总人数
mapper.xml
<!-- 7综合查询 -->
<select id="findUserCount" parameterType="com.guigu.model.UserQueryVo" resultType="int">
select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select>
mapper.java
public int findUserCount(UserQueryVo userQueryVo);
测试代码
@Test
public void testFindUserCount() throws Exception{
SqlSession sqlSession =sqlSessionFactory.openSession();
//创建UserMapper 对象 MyBatis自动生成代理对象
UserMapper userMapper =sqlSession.getMapper(UserMapper.class); //创建包装对象 设置查询条件
UserQueryVo userQueryVo =new UserQueryVo(); UserCustomer userCustomer =new UserCustomer();
userCustomer.setSex("1");
userCustomer.setUsername("小明");
userQueryVo.setUserCustomer(userCustomer); int count =userMapper.findUserCount(userQueryVo);
System.out.println(count);
}
在输出参数中,不论你返回的是单个对象还是对象的集合,在resulttype中都只需要写该对象的全名称就可以了
(2)resultMap
resultMap到底做什么用的呢?下面我来举个例子:

比如有下面的mapper.xml配置
<!-- mapper执行语句 -->
<!--
#{userCustomer.sex} 取出pojo对象 中性别的属性值
${userCustomer.username}取出pojo中 用户的名称
-->
<select id="findUserList" parameterType="com.guigu.model.UserQueryVo" resultType="com.guigu.model.UserCustomer">
select id id_,username username_,birthday birthday_,address from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select>
那么运行的输出结果:会发现只有地址能够完成赋值,而其它因为采用别名无法赋值:

得出结论:
如果查询出来的列名和pojo中的属性完全不一致 没有创建pojo对象
如果查询出来的列名和pojo中的属性只有部分一致 ,就会创建pojo对象 ,不一致的属性值为null
上面的问题那如何解决,其实也很简单就是配置resultMap:
<!--
type resultMap最终映射的java对象类型 可以使用别名,因为本来是要写类的全名称,这里输入的就是别名
id 对resultMap唯一的标识符,这里的id要和下面的resultMap中的内容一致
-->
<resultMap type="user" id="userResultMap">
<!--
id表示查询结果集中唯一的标识 主键
column 查询出来的列名
property type pojo中对应的属性名
-->
<id column="id_" property="id"/>
<!--
result对普通名的映射
column 查询出来的列名
property type pojo中对应的属性名
-->
<result column="username_" property="username"/>
<result column="birthday_" property="birthday"/> </resultMap> <!-- 配置结果集类型 -->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id_,username username_,birthday birthday_,address from user where id=#{value}
</select>
总结:
使用resultType 进行输出映射 只有查询出来的列名 和pojo中的属性名一致的时候才可以映射成功 。
如果查询出来的列名和pojo属性名不一致 可以通过定义一个resultMap对列名和pojo属性之间做一个映射。
本文就讲到这里,欢迎大家多多指点,哪里需要修正或者补充,欢迎留言,谢谢!
mybatis系列笔记(4)---输入输出映射的更多相关文章
- MyBatis 系列五 之 关联映射
MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultM ...
- mybatis学习笔记(7)-输出映射
mybatis学习笔记(7)-输出映射 标签: mybatis mybatis学习笔记7-输出映射 resultType 输出简单类型 输出pojo对象和pojo列表 resultMap result ...
- MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...
- Mybatis系列(四)映射文件
转自:https://blog.csdn.net/chris_mao/article/details/48811507 Mybatis的真正强大,在于她对SQL的映射,这也是她吸引人的地方.实现相同的 ...
- mybatis系列笔记(1)---mybatis入门
mybatis入门 MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...
- 1.4(Mybatis学习笔记)关联映射
一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...
- mybatis系列笔记(2)---mapper代理方法
mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...
- mybatis系列笔记(3)---SqlMapConfig.xml解析
SqlMapConfig.xml SqlMapConfig.xml是Mybatis的全局配置参数,关于他的具体用的有专门的MyBatis - API文档,这里面讲的非常清楚,所以我这里就挑几个讲下: ...
- 转:Mybatis系列之集合映射
转:Mybatis系列之集合映射 上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联.本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系. 实现销售与客户多对多关系 本文中仍延用<M ...
随机推荐
- mysql授权远程用户连接(权限最小化原则)
1.进入MySQL,创建一个新用户root,密码为root: 格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码"; gra ...
- HTML5+MUI+HBuilder 之初探情人
07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以 我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪,爆炸式的 ...
- Delphi中String类型原理介绍
Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...
- C++中lower_bound函数和upper_bound函数
STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数. ...
- HTML5 简介、浏览器支持、新元素
什么是 HTML5? HTML5 是最新的 HTML 标准. HTML5 是专门为承载丰富的 web 内容而设计的,并且无需额外插件. HTML5 拥有新的语义.图形以及多媒体元素. HTML5 提供 ...
- Sublime Text3 高亮显示Jade语法 (Windows 环境)
首先下载git clone https://github.com/miksago/jade-tmbundle.git Jade 然后打开sublime --> 菜单栏 --> Prefer ...
- Pomelo的component组件
pomelo的核心是由一系列松耦合的component组成,同时我们也可以实现我们自己的component来完成一些自己定制的功能.对于我们的聊天应用,我们尝试给其增加一个component,目的是展 ...
- doubango(1)--从协议栈结构说起
自顶向下与自底向上 软件设计的两种方法不过于自顶向下与自底向上. 对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现.而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功 ...
- 在Flex中用于处理XML对象的E4X 方法
ECMAScript for XML 规范定义了一组用于使用 XML 数据的类和功能.这些类和功能统称为 E4X.ActionScript 3.0 包含以下 E4X 类:XML.XMLList.QNa ...
- 使用OpenFiler来模拟存储配置RAC中ASM共享盘及多路径(multipath)的测试
第一章 本篇总览 之前发布了一篇<Oracle_lhr_RAC 12cR1安装>,但是其中的存储并没有使用多路径,而是使用了VMware自身提供的存储.所以,年前最后一件事就是把多路径学习 ...