博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【MyBatis学习06】输入映射和输出映射
阅读量:6295 次
发布时间:2019-06-22

本文共 3492 字,大约阅读时间需要 11 分钟。

在前面几篇博文的例子中也可以看到mybatis中输入映射和输出映射的身影,但是没有系统的总结一下,这篇博客主要对这两个东东做一个总结。我们知道mybatis中输入映射和输出映射可以是基本数据类型、hashmap或者pojo的包装类型,这里主要来总结一下pojo包装类型的使用,因为这个在开发中比较常用。

1. 输入映射

输入映射,是在映射文件中通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。假设现在有个比较复杂的查询需求:完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的),那么我们单纯的传入一个User就不行了,所以首先我们得根据查询条件,自定义一个新的pojo,在这个pojo中包含所有的查询条件。

1.1 定义包装类型pojo

  定义一个UserQueryVo类,将要查询的条件包装进去。这里为了简单起见,就不添加其他的查询条件了,UserQueryVo中就包含一个User,假设复杂的查询条件在User中都已经包含了。

 

public class UserQueryVo {    //在这里添加所需要的查询条件    //用户查询条件,这里假设一个User就已经够了    private User user;    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }       //可以包装其他的查询条件,比如订单、商品等    //......    }

 

1.2 配置UserMapper.xml映射文件

  定义好了我们自己的pojo后,需要在UserMap.xml映射文件中配置查询的statement,如下:

 

 

我们看到,输入的parameterType的值是我们自己定义的pojo,输出的是User,当然这里的User也可以换成另一个用户自定义的pojo,包含用户所需要的条件,都行,不仅仅局限为User。然后查询条件使用OGNL表达式,取出UserQueryVo中User的相应属性即可。 

  然后别忘了在SqlMapperConfig.xml中配置好这个UserMapper.xml映射文件。

 

public interface UserMapper {    //省去无关代码    //用户信息综合查询    public List
findUserList(UserQueryVo userQueryVo) throws Exception;}

 

到此为止,我们就做好了自定义的pojo输入映射了,其实并不是很难,下面测试一下这个程序是否正确:

 

@Testpublic void testFindUserList() throws Exception {    SqlSession sqlSession = sqlSessionFactory.openSession();    //创建UserMapper对象,mybatis自动生成mapper代理对象    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);    //创建包装对象,设置查询条件    UserQueryVo userQueryVo = new UserQueryVo();    User user = new User();    user.setSex("男");    user.setUsername("山河2016.9.7");    userQueryVo.setUser(user);    //调用userMapper的方法    List
list = userMapper.findUserList(userQueryVo); System.out.println(list);}

 

输入映射比较简单,没有那么多歪门邪道的东东~下面来总结一下输出映射相关的东东。

2.输出映射

输出映射中同样有很多中对象类型,这里也主要总结一下输出pojo对象。mybatis中的与输出映射有关的resultType就不再睡熟了,下面博文都已经提到过了,这里主要总结一下另一个resultMap的使用方法。 

  我们知道,通过resultType输出映射的时候,查询出来的列名和pojo中对应的属性名要一致才可以做正确的映射,如果不一致就会映射错误。但是如果不一致呢?该如何解决这个问题呢?这就要使用resultMap来映射了。 
  假设现在映射文件中有个sql语句:SELECT id id_,username username_ FROM USER WHERE id=#{id},从这个sql语句中可以看出,查询出了id和username两列,但是都起了别名了,也就是说,如果我们现在用resultType去映射到User中的话,肯定会出问题,所以我们现在要定义一个resultMap来做查询结果列与User的属性之间的一个映射。

2.1 定义resultMap

首先我们要定义一个resultMap,如下:

关于resultMap中的几个属性,简单介绍一下它们的作用:

中的type属性表示 resultMap最终映射的Java对象类型。上面用的是别名,如果没有定义别名,需要使用完全限定名
中的id属性是对这个resultMap的唯一标识。
的子标签
表示查询结果集中的唯一标识,因为id是主键。
的子标签
表示对查询结果集中普通名映射的定义。 子标签中的column属性:表示查询出来的列名 子标签中的property属性:表示上面type指定的pojo类型中的属性名

2.2 配置UserMapper.xml映射文件

2.3 定义Mapper接口

public interface UserMapper {    //省去无关代码    //根据id查询用户信息,使用resultMap输出    public User findUserByIdResultMap(int id) throws Exception;}

对resultMap的配置和接口处理完之后,我们来写一个测试程序测试一下:

@Testpublic void testFindUserByIdResultMap() throws Exception {    SqlSession sqlSession = sqlSessionFactory.openSession();    //创建UserMapper对象,mybatis自动生成mapper代理对象    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);    User user = userMapper.findUserByIdResultMap(1);    System.out.println(user);}

在最后的结果中可以看出,打印出的user中只有sex和username是有值的,其他都是null,因为我们在sql中只要了这两个属性,所以是正常的。 

  最后总结一下:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。 

 

转载地址:http://sfvta.baihongyu.com/

你可能感兴趣的文章
域控制器建立教程
查看>>
RHCE 学习笔记(20) ACL
查看>>
Django 和 Ajax 简介
查看>>
Qt的一个颜色选取按钮QColorButton
查看>>
perl 散列数组
查看>>
puppet之service管理
查看>>
Exchange2010server证书申请及分配服务
查看>>
Cassandra 处理客户端请求
查看>>
[WinApi]邮槽通信C/S实例
查看>>
linux NFS配置:NFS相关概念及其配置与查看
查看>>
需求转化到文档维护
查看>>
《互联网运营智慧》第7章“简单cdn”正式版下载
查看>>
如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!
查看>>
基于Xcode原型驱动的iOS应用设计
查看>>
SOA标准之----SCA架构思想
查看>>
9.VMware View 4.6安装与部署-connection server(View Replica Server)
查看>>
项目管理和产品管理绉议
查看>>
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
查看>>
编程之基础:数据类型(二)
查看>>
倒排索引PForDelta压缩算法——基本假设和霍夫曼压缩同
查看>>