Mybatis深入了解(四)----输入输出映射
- 输入映射
- 定义包装类型POJO
- Mapperxml
- Mapperjava
- 测试代码
- 输出映射
- resultType
- 输出简单类型-需求
- Mapperxml
- Mapperjava
- 测试代码
- 小结
- 输出POJO对象和POJO列表
- resultMap
- 使用方法
- 将下边的sql使用User完成映射
- 小结
- resultType
输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、POJO的包装类型。
举个栗子:完成用户信息的综合查询,需要传入条件很复杂(可能包括用户信息、其他信息,比如商品、订单)。传递POJO的包装类对象,看下面的实例:
定义包装类型POJO
针对上面的需求,建议将条件包装进自定义的POJO类中。
package cn.itcast.mybatis.po;import java.util.List;/*** 包装类型* @author Administrator**/
public class UserQueryVo {private List<Integer> ids;//包装所需要的查询条件private UserCustom userCustom;public UserCustom getUserCustom() {return userCustom;}public void setUserCustom(UserCustom userCustom) {this.userCustom = userCustom;}public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}//可以包装其他的查询条件,订单、商品//....
Mapper.xml
在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。
<!-- 用户信息综合查询#{userCustom.sex}:取出pojo包装对象中性别值${userCustom.username}:取出pojo包装对象中用户名称--><select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">SELECT * FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'</select>
Mapper.java
在UserMapper的接口类中定义接口:
//用户信息综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
测试代码
@Testpublic void testFindUserList() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建UserMapper对象,mybatis自动生成mapper代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//创建包装对象,设置查询条件UserQueryVo userQueryVo = new UserQueryVo();UserCustom userCustom = new UserCustom();userCustom.setSex("1");userCustom.setUsername("张三丰");userQueryVo.setUserCustom(userCustom);//调用userMapper的方法List<UserCustom> list = userMapper.findUserList(userQueryVo);System.out.println(list); }
输出映射
resultType
使用resultType进行输出映射,只有查询出来的列名和POJO中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
输出简单类型-需求
用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。
Mapper.xml
<!-- 用户信息综合查询总数parameterType:指定输入类型和findUserList一样resultType:输出结果类型--><select id="findUserCount" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="int">SELECT count(*) FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.user}%' </select>
Mapper.java
//用户信息综合查询总数
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
测试代码
@Testpublic void testFindUserCount() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建UserMapper对象,mybatis自动生成mapper代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//创建包装对象,设置查询条件UserQueryVo userQueryVo = new UserQueryVo();UserCustom userCustom = new UserCustom();userCustom.setSex("1");userCustom.setUsername("张三丰");userQueryVo.setUserCustom(userCustom);//调用userMapper的方法int count = userMapper.findUserCount(userQueryVo);System.out.println(count);}
小结
查询出来的结果集只有一行且一列,可以使用 简单类型进行输出映射。
输出POJO对象和POJO列表
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。
在mapper.java指定的方法返回值类型不一样:
1. 输出单个POJO对象,方法返回值是单个对象类型
//根据id查询用户信息
public User findUserById(int id) throws Exception;
2. 输出POJO对象list,方法返回值是List<POJO>
//根据用户名列查询用户列表
public List<User> findUserByName(String name) throws Exception;
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 )。
resultMap
mybatis中使用resultMap完成高级输出结果映射。
使用方法
如果查询出来的列名和POJO的属性名不一致,通过定义一个resultMap对列名和POJO属性名之间作一个映射关系。>
1. 定义resultMap
2. 使用resultMap作为statement的输出类型
将下边的sql使用User完成映射
SELECT id id_,username username_ FROM USER WHERE id=#{value}
User类中属性名和上边查询列名不一致。
- 定义resultMap
<!-- 定义resultMap将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系type:resultMap最终映射的java对象类型,可以使用别名id:对resultMap的唯一标识--><resultMap type="user" id="userResultMap"><!-- id表示查询结果集中唯一标识 column:查询出来的列名property:type指定的pojo类型中的属性名最终resultMap对column和property作一个映射关系 (对应关系)--><id column="id_" property="id"/><!-- result:对普通名映射定义column:查询出来的列名property:type指定的pojo类型中的属性名最终resultMap对column和property作一个映射关系 (对应关系)--><result column="username_" property="username"/></resultMap>
- 使用resultMap作为statement的输出映射类型
<!-- 使用resultMap进行输出映射resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace--><select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">SELECT id id_,username username_ FROM USER WHERE id=#{value}</select>
- Mapper.java
//根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id) throws Exception;
- 测试代码
@Testpublic void testFindUserByIdResultMap() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//创建UserMapper对象,mybatis自动生成mapper代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用userMapper的方法User user = userMapper.findUserByIdResultMap(1);System.out.println(user);}
小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
Mybatis深入了解(四)----输入输出映射相关推荐
- 框架:Mybatis开发规范及输入输出映射配置时注意事件
程序员需要编写mapper.xml映射文件 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象. 1.开发规范: 1.在mapper.xml中na ...
- mybatis入门基础(四)----输入映射和输出映射
阅读目录 一:输入映射 二:输出映射 回到顶部 一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 ...
- java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)
1.mapper代理 1.mybatis开发dao的方法----引入(为啥要使用mapper代理) 1.SqlSession使用范围 1.SqlSessionFactoryBuilder 通过SqlS ...
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- Mybatis - 一对多/多对一映射
文章目录 前言 项目结构 一.数据库表 1. 员工表 t_emp 2. 部门表 t_dept 二.实体类 1. Emp 员工实体类(添加多对一属性) 2. dept 部门实体类(添加一对多属性) 三. ...
- 老司机学习MyBatis之mappers如何配置映射注册
一.前言 定义SQL映射语句,首先我们要告诉MyBatis去哪里找到这些语句,Java在自动查找这方面没有提供一个很好的方法,所以最佳方式是告诉MyBatis到哪里去查找映射文件,你可以使用相对路径的 ...
- mybatis学习笔记(7)-输出映射
2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(7)-输出映射 标签: mybatis [TOC] 本文主要讲解mybatis的输出映射. 输出映射有 ...
- MyBatis官方文档-XML 映射文件
最近更新: 15 七月 2019|版本: 3.5.2 文章目录 XML 映射文件 insert, update 和 delete sql 结果映射 高级结果映射 结果映射(resultMap) id ...
- 深入剖析 mybatis 原理(四)插件的原理和应用
< 一生所爱> 从前现在过去了再不来 红红落叶长埋尘土内 开始终结总是没变改 天边的你飘泊白云外 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 情人别后永远再不来(消 ...
最新文章
- JavaEE框架整合之基于注解的SSH整合
- [codevs1022]覆盖
- 明天要上班了,假如上天再给我一个假期…
- oracle学习笔记三
- Android 6.0以上运行权限及RxPermissions的使用
- lengthOfLongestSubstring
- 推荐几个超会整活儿的Go公众号
- 更改shape文件字段名,提示Failed to alter the name of the field
- 蓝屏:微软撤回 Windows 8.1 八月更新等4个补丁
- Git版本控制的原理
- WampServer的下载方法-解决报错the installation folder chosen is not that wampserver
- java编写蠕虫病毒_网络蠕虫病毒代码分析
- 安捷伦or是德信号源+频谱仪操作:从程控到自动测试(一)仪器校准的程控实现
- 硬盘检测神器-HD Tune Pro/Hard Disk Sentinel
- matlab 的滤波器分析,滤波器matlab分析
- serverlet增删改查项目代码
- 如何从godaddy转出域名
- keras+theano安装教程
- FB微软谷歌大会惊喜欠奉,AI风向还是看今夏的百度Create吧
- [T-ARA][TIAMO]
热门文章
- 能跳过节假日的闹钟_非人哉:叫九月起床有多难?闹钟坏了许多个,哮天去叫被打了一顿...
- 深入理解JVM虚拟机(三):虚拟机性能监控工具
- nginx利用referer指令实现防盗链配置
- 王艳 201771010127《面向对象程序设计(java)》第十七周学习总结
- [启发式搜索/A*] [SCOI2005]骑士精神题解
- 移动端H5混合开发设置复盘与总结
- Bootstrap 字体图标(Glyphicons)
- java创建线程的几种方式
- 构建之法第5词作业(12-15章)
- 关于函数形参的一些讨论