04_Mybatis输入\出映射
1. 输入映射
通过paramterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类、
1.1 传递pojo的包装对象
1.需求
完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)
2.定义包装类型pojo
针对上边需求,建议使用自定义的包装类型的pojo,在包装类型的pojo中将复杂的查询条件包装进去。
/**
* Description: 查询时,将多个对象的属性集合在此类
* User: jiatp
* Date:2019/9/3 0003 下午 4:39
*/
public class UserQueryVo {
//用户的查询条件
private UserCustom userCustom;
//传入多个id
private List<Integer> ids;
//可以包装其它信息,商品,订单 等
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
3.mapper.xml
在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'
</select>
4.mapper.java
// 用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo);
5.测试代码
public class MybatisThird {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws IOException {
//mybatis配置文件
String resource = "com/mybatis/config/sqlMapConfig.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
}
//综合查询,用户的所有信息
@Test
public void findUserList(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
//创建包装对象
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
// userCustom.setSex("2");
userCustom.setUsername("李四");
userQueryVo.setUserCustom(userCustom);
//调用查询
List<UserCustom> userList = mapper.findUserList(userQueryVo);
for(UserCustom us:userList) {
System.out.println(us);
}
}
}
2. 输出映射
2.1 resultType
** 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。**
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
1. 输出简单类型
如:用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。
mapper.xml
<!--用户信息查询总数
parameterType:指定输入参数与findUserList一样
-->
<select id="findUserCount" parameterType="UserQueryVo" resultType="int">
select count(1) from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'
</select>
mapper.java
//用户信息总数查询
public int findUserCount(UserQueryVo userQueryVo);
测试代码
//查询用户信息的总数
@Test
public void findUserCount(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
//创建包装对象
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("2");
userCustom.setUsername("李四");
userQueryVo.setUserCustom(userCustom);
//调用查询
int count = mapper.findUserCount(userQueryVo);
System.out.println(count);
}
总结:查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。
2.输出pojo对象和pojo列表**
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。在mapper.java指定的方法返回值类型不一样:
1、输出单个pojo对象,方法返回值是单个对象类型
//根据用户id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id);
2、输出pojo对象list,方法返回值是List<Pojo>
//根据用户名查询用户列表
public List<User> findUserByName(String name) throws Exception;
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用).
2.2 resultMap
resultMap使用方法
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
1、定义resultMap
2、使用resultMap作为statement的输出映射类型
将下边的sql使用User完成映射
SELECT id id_,username username_ FROM USER WHERE id=#{value}
User类中属性名和上边查询列名不一致。
mapper.xml
<!--使用resultMap进行输出映射
1.定义resultMap type:resultMap最终映射的java对象类型,可以使用别名;
id:resultMap的标识
-->
<resultMap id="UserResultMap" type="user">
<!--id表示查询结果集中唯一标识-->
<id column="id_" property="id"/>
<result column="username_" property="username"/>
</resultMap>
<!--resultMap:即是前面定义的resultMap的id-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="UserResultMap">
select id id_,username username_ from user where id=#{id}
</select>
总结:
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo****属性名之间作一个映射关系。
04_Mybatis输入\出映射的更多相关文章
- Java中的字节输入出流和字符输入输出流
Java中的字节输入出流和字符输入输出流 以下哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...
- 使用div 的 contenteditable属性,实现输入编辑,输入 "#" 出现下拉选择
文章原文:https://www.cnblogs.com/yalong/p/11883585.html 演示效果如下: 具体代码可以看 https://github.com/YalongYan/e ...
- mybatis系列-07-输出映射
7.1 resultType 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功. 如果查询出来的列名和pojo中的属性名全部不一致,没有创建 ...
- MaBatis(5)输入/输出映射
本次全部学习内容:MyBatisLearning 输入映射: 通过parameType指定输入参数的类型,类型可以是简单类型,hashmap,pojo等 传递pojo的包装对象 需求: 即 ...
- [C]语法, 知识点总结(一. 进制, 格式化输入/出, 指针)
进制 概念: n进制, 最大的数是n-1, 逢n进1位. 数据类型 概念: 其实就是占的位数不同, 转换到计算机当中都是0和1. 常用: 类型名 占字节数 描述 char 1字节=8个二进制位 字符类 ...
- 文件I/O操作为什么叫输入/出流
参考以下文档: http://blog.csdn.net/hguisu/article/details/7418161 我们关注的焦点是错误的,重点不在文件,我们关注的核心是数据流. 这种流可以是文本 ...
- JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程
1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...
- Mybatis输入映射和输出映射
本节内容: 输入参数映射 输出映射 resultMap Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 一.环境准备 复制 ...
- iBatis.Net(C#)SQL数据映射
转载请注明 http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html 摘要:本文探讨了iBatis.Net框架的XML数据映射文件各配置 ...
随机推荐
- php上传(一)
php上传基础知识总结 1.文件上传 1>文件上传的原理:将客户端上的文件通过浏览器上传到服务器上, 在将服务器上的文件移动到指定目录. 2>客户端的配置 表单页面,浏览框 method= ...
- 暑假集训test-8-28
大概是从我一年以来做过的最傻逼的一套题了.. 一个半小时打完三个程序三个暴力拍完以为自己AK了,开心地耍了两个小时. 结果T3要写高精,LL炸了后4个点,中间还有个点是啥都不选的,我没用0去更新又炸了 ...
- POJ2516费用流
目录 目录 (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 AC代码: #include <iostream> #include <cstdio ...
- Windows内存管理(1)--分配内核内存 和 使用链表
1. 分配内核内存 Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约.和应用程序一样,局部变量是存放在栈空间中的.但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或 ...
- Go kit 概览
该篇为翻译文:原文地址 https://github.com/go-kit/kit Go kit 是一个语言工具包,用于在GO 语言中构建微服务.我们可以解决分布式系统和应用程序架构中的常见问题,因此 ...
- 完美解决 IE6 position:fixed 固定定位问题
关于 position:fixed; 属性 生成绝对定位的元素,相对于浏览器窗口进行定位. 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定. pos ...
- Vue的项目搭建及请求生命周期
目录 Vue的项目搭建及请求生命周期 Vue-CLI的项目搭建 环境搭建 项目创建 pycharm运行Vue项目 Vue项目的大体结构 Vue的请求生命周期 两个小用法 Vue的项目搭建及请求生命周期 ...
- flink widow&window funcion&水印
在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情, 当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是 分组的). 谁可 ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- iOS开发系列-异常处理
概述 在开发中经常调用苹果的API遇到数组越界.实例方法不存在运行时等致命错误,此时程序直接奔溃.其实苹果是在函数内部抛出了一个异常.这样告诉开发者需要检查代码做修改.同样在我们自己封装一些框架或者功 ...