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)映射相关推荐

  1. MyBatis之输入(parameterType)与输出(resultType、resultMap)映射

    MyBatis之输入(parameterType)与输出(resultType.resultMap)映射 2017/9/30 在MyBatis中,我们通过parameterType完成输入映射(指将值 ...

  2. java mapper xml if_bug篇——Mybatis中Mapper.xml文件的if判断问题

    一.问题描述 上述表达,当传入参数validCoupon的值为"1"时,仍然不能执行if判断下的sql语句. 二.剖析原因 public class ExpressionEvalu ...

  3. Mybatis中Mapper.xml文件sql中动态获取----#{}和${}区别

    1. #{} 获取参数的内容,支持索引获取,param1获取指定位置参数,并且sql使用?占位符 2. ${} 纯字符串拼接,不使用?,默认找${内容}内容的get/set方法,如果写数字,就是一个数 ...

  4. idea中*mapper.xml文件字体颜色变成黄色的解决办法

    idea中*mapper.xml文件字体颜色变成黄色的解决办法 问题描述: 今天在写*Mapper.xml文件时,发现此文件中代码的颜色变成黄色了,没有办法使用idea的提示功能,具体如下: 解决方案 ...

  5. 【sql的mapper.xml文件】完美去除idea中mapper.xml文件中的黄色绿色背景色

    文章目录 完美去除idea中mapper.xml文件中的背景色 换主题颜色 1.settings->Editor->Inspection 2.Editor->Color Scheme ...

  6. mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明

    记录一个发现的小问题,刚刚在UserMapper.xml文件中有一段中文注释掉的内容: <!-- <resultMap id="Usermap" type=" ...

  7. Mybatis中Mapper映射文件详解(默认值)

    Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出, ...

  8. Mybatis中mapper文件中的两层循环

    导言 使用mapper.xml文件来存储和执行sql语句是Mybatis框架中重要的应用.在mapper.xml文件中对List数据的循环遍历较为普遍和常用,而两层或多层循环是大家不常用的.下面简单介 ...

  9. mybatis中mapper文件中的动态sql语句

    有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...

  10. Mybatis中Mapper动态代理方式

    文章目录 开发规范 Mapper接口开发需要遵循以下规范 Mapper.xml(映射文件) UserMapper(接口文件) 加载UserMapper.xml文件 总结 selectOne和selec ...

最新文章

  1. 同样是持久化,竟然有这么大的差别!
  2. Leetcode 剑指 Offer 40. 最小的k个数 (每日一题 20210825)
  3. delphi内存泄露查找工具之MemProof教程
  4. Oracle中压缩数据节省空间和提高速度
  5. c语言的程序灵魂是什么,C语言 第二章 程序的灵魂--算法
  6. ABAP表生成Java实体Bean
  7. 视差滚动(Parallax Scrolling)插件补充
  8. [多图]Google Chrome漫画书中文版
  9. 一个合格的程序员,需要哪些必备技能?
  10. 中文场景文字识别技术创新大赛,总奖池5.4万!
  11. android编程设备信息,Android获取当前手机设备信息工具类详解
  12. Epic Games Launcher 无效驱动器E
  13. ecilpse写html图片,eclipse怎么导入图片
  14. 本科毕业论文论文框架,可参考
  15. 批量将txt文件转为csv文件
  16. python使用influxdb-client管理InfluxDB的bucket
  17. macOS-允许打开任何来源的程序
  18. 发票样板 html+css
  19. 程序员视角的计算机系统 第一章 计算机系统 之旅
  20. Markdown中插入公式

热门文章

  1. HDU 2144(最长公共子序列+并查集)
  2. Windows/Linux 下启动Kafka,外带安装包
  3. 扫描指定ip的指定端口,识别开放的端口所对应的服务
  4. 医学相关excel表格计算机作业,求计算机作业电子表格演示文稿。
  5. Redis 的操作为什么是的原子性的详解
  6. 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4]
  7. 微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
  8. 使用MVC2模式创建新闻网站
  9. [Luogu P2522] [HAOI2011]Problem b (莫比乌斯反演)
  10. SQL Server系统表sysobjects介绍