【MyBatis框架点滴】——MyBatis输出映射
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51553225
上文说到,MyBatis中,通过parameterType指定输入参数的类型。这里说一下用resultType和resultMap来指定输出参数的类型。
resultType
resultType是最常用的指定输入参数类型的方式,一般用来指定输出简单类型和pojo。
一、指定输出简单类型
映射文件:
<select id="findUserByUserName" parameterType="string"
resultType="int">
select count(*) from user where username =#{username}
</select>
实现:
/**
* 根据姓名查询用户数量
* @param username
* @return
* @throws Exception
*/
@Override
public int findUserByUserName(String username) throws Exception {
SqlSession session=sqlSessionFactory.openSession();
int result=session.selectOne("com.danny.mybatis.findUserByUserName",username);
session.close();
return result;
}
测试:
@Test
public void testQueryByUserName() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
int result = userDao.findUserByUserName("DannyHoo");
System.out.println(result);
}
二、指定输入pojo
用resultType指定输入参数的类型为pojo时,有三种情况:
1、查询出来的列名与pojo中的属性名完全一致,结果会创建pojo对象,映射成功。
User.java
public class User implements Serializable {
private int id;
private String username;
private int sex;
private Date birthday;
private String address;
//getter、setter
}
映射文件:
<select id="findUserById" parameterType="int"
resultType="com.danny.mybatis.po.User">
select id,username,sex,birthday,address from user where id=#{value}
</select>
当查询的字段与User的属性名完全一致时,查询结果会自动映射为pojo对象,且每个属性都会有值,如下:
2、查询出来的列名与pojo中的属性名部分一致,查询结果会自动映射为pojo对象,且部分属性会有值;
映射文件:
<select id="findUserById" parameterType="int"
resultType="com.danny.mybatis.po.User">
select id,username as name,sex as,birthday as birthdate,address from user where id=#{value}
</select>
3、查询出来的列名与pojo中的属性名完全不一致,则不会创建对象,结果为null;
<select id="findUserById" parameterType="int"
resultType="com.danny.mybatis.po.User">
select id as number,username as name,sex as s,birthday as birthdate,address as addr from user where id=#{value}
</select>
这时,输出的user直接为null:
需要注意的是,当输出类型为pojo时,不管查询结果为单个pojo对象还是集合,resultType的属性值都写成pojo的类型。
resultType还可以指定输出类型为Map,当指定输出类型为Map时,默认映射的结果集中列名为key值,查询到的数据为value。
resultMap
上面resultType指定输出类型为pojo时,查询结果集的列名可能与pojo的字段不一致,因此可以使用resultMap为列名和pojo的字段之间作一个映射关系。
比如上面的第2中情况,用resultType指定输出类型为pojo时,查询出来的列名与pojo中的属性名部分一致,查询结果会自动映射为pojo对象,但只有部分属性会有值。可以利用resultMap为其余不对应的列名与字段建立映射关系,使最终查询到的每列的值都可以一 一对应到pojo对象中。
映射文件:
<!--定义User的resultMap-->
<resultMap type="com.danny.mybatis.po.User" id="userResultMap">
<id column="name" property="username"/>
<id column="birthdate" property="birthday"/>
</resultMap>
<!--User查询语句-->
<select id="findUserById" parameterType="int" resultMap="userResultMap">
select id,username as name,sex,birthday as birthdate,address from user where id=#{value}
</select>
如上,在<select></select>
的同级添加<resultMap></resultMap>
标签,为两个不对应的属性配置映射关系。
配置后,查询结果如下:
总结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
【 转载请注明出处——胡玉洋《【MyBatis框架点滴】——MyBatis输出映射》】
- 第四次工业革命
- 每周.NET前沿技术文章摘要(2017-06-07)
- 再谈Silverlight中的对象序列化/反序列化
- jQuery打造智能提示插件
- 每周.NET前沿技术文章摘要(2017-05-17)
- 每周.NET前沿技术文章摘要(2017-05-24)
- ruby学习笔记(10)-puts,p,print的区别
- Linux下的Mongodb部署应用梳理
- Ocelot API网关的实现剖析
- ruby学习笔记(9)-别名(alias)与方法取消(undef,remove_method)
- Pupet自动化管理环境部署记录
- ruby学习笔记(8)-"静态方法的4种写法"与"单例方法的2种写法"
- Puppet常识梳理
- linux下增加磁盘改变指定文件路径分区挂载点和迁移数据
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 一天一大 leet(搜索插入位置)难度:简单-Day20200717
- 一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
- 一天一大 leet(分割数组的最大值)难度:困难-Day20200725
- 一天一大 leet(矩阵中的最长递增路径)难度:困难-Day20200726
- 一天一大 lee(克隆图)难度:中等-Day20200812
- 一天一大 lee(有效的括号)难度:简单-Day20200814
- 一天一大 leet(判断子序列)难度:简单-Day20200727
- 一天一大 leet(寻宝)难度:困难-Day20200729
- LeetCode刷题记录(easy难度21-40题)
- 一天一大 lee(移除盒子)难度:困难-Day20200815
- LeetCode刷题记录(easy难度1-20题)
- 改变 Python 中线程执行顺序的方法
- 一天一大 leet(整数拆分)难度:中等-Day20200730
- iOS客户端启动速度优化实践
- 一天一大 leet(魔术索引)难度:简单-Day20200731