MyBatis中Mapper映射文件的输入(parameterType)和输出(resultType)映射
Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。
输入类型parameterType
1)传递简单类型
传递简单类型,前两节课都见过,这里只给出案例:
2)传递pojo对象
MyBatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo的属性名称。传递pojo对象之前也已讲过,这里同样只给出案例:
3)传递pojo包装对象
开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数。即一个pojo类的属性是另一个pojo类对象。
例如,新建vo如下:
public class QueryVo {private String query;private User user;public String getQuery() {return query;}public void setQuery(String query) {this.query = query;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}
}
在UserMapper接口中定义方法:
/*** 根据QueryVo提供的数据进行查询* @param vo* @return*/
User getUserByQueryVo(QueryVo vo);
接下来我们就要在UserMapper.xml映射文件中编写sql语句了,即在UserMapper.xml映射文件中添加如下配置信息:
<select id="getUserByQueryVo" parameterType="com.oak.po.QueryVo">select * from `user` where id=#{user.id} and name=#{user.name}
</select>
输出类型(resultType)
1)输出简单类型
例如:查看user表中的记录总数,首先在UserMapper接口中定义方法:
/*** 得到总记录数* @return*/
Integer count();
在UserMapper.xml中配置:
<!-- 查询user表中的记录总数 -->
<select id="count" resultType="int">select count(id) from `user`
</select>
输出简单类型必须查询出来的结果集只有一条记录,最终将第一个字段的值转换为输出类型。
2)输出POJO对象
输出pojo列表,我之前同样已讲过,这里只给出案例:
3)输出POJO列表(返回值为集合)
输出pojo列表,我之前同样已讲过,这里只给出案例:
我们只要返回值类型定义为返回集合中一个元素的类型即可(集合的泛型)。
注意:
如果查找的字段名与返回值属性名不一致则无法完成映射!所以要保证select字段名与返回值类型属性一致!也就是返回的结果的列名和pojo中的属性要一致才可以自动映射
案例
我们重新定义一个类型为角色role,每一个角色对应一个用户,首先在数据库中创建role表
CREATE TABLE `NewTable` (
`role_id` int(4) NOT NULL AUTO_INCREMENT ,
`role_name` varchar(7) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`user_id` int(4) NOT NULL ,
PRIMARY KEY (`role_id`)
)ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
在po包中新建Role:
public class Role {private Integer roleId;private String roleName;private Integer userId;//方法略
}
在UserMapper接口中定义方法:
/*** 根据user_id查找role信息* @param userId* @return*/
Role findRoleByUserId(int userId);
在UserMapper.xml中定义sql映射:
<!-- 根据user 的 id查找role信息 -->
<select id="findRoleByUserId" parameterType="int"
resultType="com.oak.po.Role">select * from `role` where user_id=#{id}
</select>
注意:此处查找的是select * 也就是查找的是role表中的字段名role_id,role_name和user_id
测试:
@Test
public void testFindRoleByUserId(){//第四步 得到sqlSession,与Spring整合后省略SqlSession sqlSession=sqlSessionFactory.openSession();//获得代理对象(与Spring整合后只需要通过Spring容器拿到UserMapper接口的代理对象就行了)UserMapper userMapper=sqlSession.getMapper(UserMapper.class);Role role=userMapper.findRoleByUserId(2);System.out.println(role);sqlSession.close();
}
查看结果:
你会发现查询有一条结果,但是封装到返回对象中时失败了。
所有这里一定要注意:返回的结果的列名和pojo中的属性要一致才可以自动映射。
这里我们可以使用别名的方式,把xml中的sql修改为:
<!-- 根据user 的 id查找role信息 -->
<select id="findRoleByUserId" parameterType="int"
resultType="com.oak.po.Role">select role_id roleId,role_name roleName,user_id userId from `role` where user_id=#{id}
</select>
测试:
这种方式比较简单粗暴,其实要达到我们所预期的效果,还有另一种方式,那就是使用resultMap这个属性
resultMap
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
我们修改映射文件中的sql,不使用取别名的方式,把resultType替换为resultMap:
<!-- 根据user 的 id查找role信息 -->
<select id="findRoleByUserId" parameterType="int" resultMap="role_list_map">select role_id,role_name,user_id from `role` where user_id=#{id}
</select>
然后定义resultMap,由于映射文件中sql查询列和Role属性不一致,因此需要定义resultMap:role_list_map将sql查询列和Role类属性对应起来:
<resultMap type="com.oak.po.Role" id="role_list_map"><!-- id是主键的映射,其中property是pojo中主键的属性,column是返回结果中主键的列 --><id property="roleId" column="role_id" /><!-- 普通列使用result映射 --><result property="roleName" column="role_name" /><result property="userId" column="user_id" />
</resultMap>
type:指resultMap要映射成的数据类型(返回结果映射的pojo,可以使用别名)。
< id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个< id />(复合主键时多个)。
< result />:普通列使用result标签映射。
property:表示POJO类的属性。
column:表示sql查询出来的字段名(列名)。
column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
可以直接测试
MyBatis中Mapper映射文件的输入(parameterType)和输出(resultType)映射相关推荐
- MyBatis之输入(parameterType)与输出(resultType、resultMap)映射
MyBatis之输入(parameterType)与输出(resultType.resultMap)映射 2017/9/30 在MyBatis中,我们通过parameterType完成输入映射(指将值 ...
- java mapper xml if_bug篇——Mybatis中Mapper.xml文件的if判断问题
一.问题描述 上述表达,当传入参数validCoupon的值为"1"时,仍然不能执行if判断下的sql语句. 二.剖析原因 public class ExpressionEvalu ...
- Mybatis中Mapper.xml文件sql中动态获取----#{}和${}区别
1. #{} 获取参数的内容,支持索引获取,param1获取指定位置参数,并且sql使用?占位符 2. ${} 纯字符串拼接,不使用?,默认找${内容}内容的get/set方法,如果写数字,就是一个数 ...
- idea中*mapper.xml文件字体颜色变成黄色的解决办法
idea中*mapper.xml文件字体颜色变成黄色的解决办法 问题描述: 今天在写*Mapper.xml文件时,发现此文件中代码的颜色变成黄色了,没有办法使用idea的提示功能,具体如下: 解决方案 ...
- 【sql的mapper.xml文件】完美去除idea中mapper.xml文件中的黄色绿色背景色
文章目录 完美去除idea中mapper.xml文件中的背景色 换主题颜色 1.settings->Editor->Inspection 2.Editor->Color Scheme ...
- mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明
记录一个发现的小问题,刚刚在UserMapper.xml文件中有一段中文注释掉的内容: <!-- <resultMap id="Usermap" type=" ...
- Mybatis中Mapper映射文件详解(默认值)
Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出, ...
- Mybatis中mapper文件中的两层循环
导言 使用mapper.xml文件来存储和执行sql语句是Mybatis框架中重要的应用.在mapper.xml文件中对List数据的循环遍历较为普遍和常用,而两层或多层循环是大家不常用的.下面简单介 ...
- mybatis中mapper文件中的动态sql语句
有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...
- Mybatis中Mapper动态代理方式
文章目录 开发规范 Mapper接口开发需要遵循以下规范 Mapper.xml(映射文件) UserMapper(接口文件) 加载UserMapper.xml文件 总结 selectOne和selec ...
最新文章
- 同样是持久化,竟然有这么大的差别!
- Leetcode 剑指 Offer 40. 最小的k个数 (每日一题 20210825)
- delphi内存泄露查找工具之MemProof教程
- Oracle中压缩数据节省空间和提高速度
- c语言的程序灵魂是什么,C语言 第二章 程序的灵魂--算法
- ABAP表生成Java实体Bean
- 视差滚动(Parallax Scrolling)插件补充
- [多图]Google Chrome漫画书中文版
- 一个合格的程序员,需要哪些必备技能?
- 中文场景文字识别技术创新大赛,总奖池5.4万!
- android编程设备信息,Android获取当前手机设备信息工具类详解
- Epic Games Launcher 无效驱动器E
- ecilpse写html图片,eclipse怎么导入图片
- 本科毕业论文论文框架,可参考
- 批量将txt文件转为csv文件
- python使用influxdb-client管理InfluxDB的bucket
- macOS-允许打开任何来源的程序
- 发票样板 html+css
- 程序员视角的计算机系统 第一章 计算机系统 之旅
- Markdown中插入公式
热门文章
- HDU 2144(最长公共子序列+并查集)
- Windows/Linux 下启动Kafka,外带安装包
- 扫描指定ip的指定端口,识别开放的端口所对应的服务
- 医学相关excel表格计算机作业,求计算机作业电子表格演示文稿。
- Redis 的操作为什么是的原子性的详解
- 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4]
- 微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
- 使用MVC2模式创建新闻网站
- [Luogu P2522] [HAOI2011]Problem b (莫比乌斯反演)
- SQL Server系统表sysobjects介绍