输入输出映射

通过parameterType制定输入参数类型 类型可以是简单类型(int String)也可以是POJO本身 或者包装类

1输入映射

关于输入简单类型和pojo本身的我就不写了,因为比较简单,下面我主要举一个包装类的例子:

使用包装类POJO 将复杂的查询条件封装到POJO中

 //当你继承user属性后,你就可以在user的基础上添加自己的属性了
public class UserCustomer extends User { //用户的基本信息
//可以扩展用户的信息
//其他信息
}

查询条件封装的类

 public class UserQueryVo {

     //这里包装需要查询的条件

     private UserCustomer userCustomer;

     public UserCustomer getUserCustomer() {
return userCustomer;
} public void setUserCustomer(UserCustomer userCustomer) {
this.userCustomer = userCustomer;
}

UserMapper.xml

      <!--
#{userCustomer.sex} 取出pojo对象 中性别的属性值
${userCustomer.username}取出pojo中 用户的名称
-->
<select id="findUserList" parameterType="com.study.model.UserQueryVo" resultType="com.study.model.UserCustomer">
select * from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select

UserMapper.java

  //用户综合信息查询
public List<UserCustomer> findUserList(UserQueryVo userQueryVo) throws Exception;

测试代码

   @Test
public void testFindUserList() throws Exception{
SqlSession sqlSession =sqlSessionFactory.openSession();
//创建UserMapper 对象 MyBatis自动生成代理对象
UserMapper userMapper =sqlSession.getMapper(UserMapper.class); //创建包装对象 设置查询条件
UserQueryVo userQueryVo =new UserQueryVo(); UserCustomer userCustomer =new UserCustomer();
userCustomer.setSex("1");
userCustomer.setUsername("小明");
userQueryVo.setUserCustomer(userCustomer); //完成查询
List<UserCustomer> list =userMapper.findUserList(userQueryVo);
System.out.println(list); }

2.输出映射

(1)resultType

使用resultType进行输出映射的时候 只有查询出来的列名和pojo 对应的属性名完全一致 才可以映射

如果查询出来的列名和pojo中的属性完全不一致 没有创建pojo对象

如果查询出来的列名和pojo中的属性只有部分一致 ,就会创建pojo对象 ,不一致的属性值为null

举例:查询用户总人数

mapper.xml

 <!-- 7综合查询 -->
<select id="findUserCount" parameterType="com.guigu.model.UserQueryVo" resultType="int">
select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select>

mapper.java

public int findUserCount(UserQueryVo userQueryVo);

测试代码

@Test
public void testFindUserCount() throws Exception{
SqlSession sqlSession =sqlSessionFactory.openSession();
//创建UserMapper 对象 MyBatis自动生成代理对象
UserMapper userMapper =sqlSession.getMapper(UserMapper.class); //创建包装对象 设置查询条件
UserQueryVo userQueryVo =new UserQueryVo(); UserCustomer userCustomer =new UserCustomer();
userCustomer.setSex("1");
userCustomer.setUsername("小明");
userQueryVo.setUserCustomer(userCustomer); int count =userMapper.findUserCount(userQueryVo);
System.out.println(count);
}

在输出参数中,不论你返回的是单个对象还是对象的集合,在resulttype中都只需要写该对象的全名称就可以了

 (2)resultMap

resultMap到底做什么用的呢?下面我来举个例子:

比如有下面的mapper.xml配置

<!-- mapper执行语句 -->
<!--
#{userCustomer.sex} 取出pojo对象 中性别的属性值
${userCustomer.username}取出pojo中 用户的名称
-->
<select id="findUserList" parameterType="com.guigu.model.UserQueryVo" resultType="com.guigu.model.UserCustomer">
select id id_,username username_,birthday birthday_,address from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select>

那么运行的输出结果:会发现只有地址能够完成赋值,而其它因为采用别名无法赋值:

得出结论:

如果查询出来的列名和pojo中的属性完全不一致 没有创建pojo对象

如果查询出来的列名和pojo中的属性只有部分一致 ,就会创建pojo对象 ,不一致的属性值为null

上面的问题那如何解决,其实也很简单就是配置resultMap:

     <!--
type resultMap最终映射的java对象类型 可以使用别名,因为本来是要写类的全名称,这里输入的就是别名
id 对resultMap唯一的标识符,这里的id要和下面的resultMap中的内容一致
-->
<resultMap type="user" id="userResultMap">
<!--
id表示查询结果集中唯一的标识 主键
column 查询出来的列名
property type pojo中对应的属性名
-->
<id column="id_" property="id"/>
<!--
result对普通名的映射
column 查询出来的列名
property type pojo中对应的属性名
-->
<result column="username_" property="username"/>
<result column="birthday_" property="birthday"/> </resultMap> <!-- 配置结果集类型 -->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id_,username username_,birthday birthday_,address from user where id=#{value}
</select>

总结:

使用resultType 进行输出映射 只有查询出来的列名 和pojo中的属性名一致的时候才可以映射成功 。

如果查询出来的列名和pojo属性名不一致 可以通过定义一个resultMap对列名和pojo属性之间做一个映射。

本文就讲到这里,欢迎大家多多指点,哪里需要修正或者补充,欢迎留言,谢谢!

mybatis系列笔记(4)---输入输出映射的更多相关文章

  1. MyBatis 系列五 之 关联映射

    MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultM ...

  2. mybatis学习笔记(7)-输出映射

    mybatis学习笔记(7)-输出映射 标签: mybatis mybatis学习笔记7-输出映射 resultType 输出简单类型 输出pojo对象和pojo列表 resultMap result ...

  3. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...

  4. Mybatis系列(四)映射文件

    转自:https://blog.csdn.net/chris_mao/article/details/48811507 Mybatis的真正强大,在于她对SQL的映射,这也是她吸引人的地方.实现相同的 ...

  5. mybatis系列笔记(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  6. 1.4(Mybatis学习笔记)关联映射

    一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...

  7. mybatis系列笔记(2)---mapper代理方法

    mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...

  8. mybatis系列笔记(3)---SqlMapConfig.xml解析

    SqlMapConfig.xml SqlMapConfig.xml是Mybatis的全局配置参数,关于他的具体用的有专门的MyBatis - API文档,这里面讲的非常清楚,所以我这里就挑几个讲下: ...

  9. 转:Mybatis系列之集合映射

    转:Mybatis系列之集合映射 上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联.本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系. 实现销售与客户多对多关系 本文中仍延用<M ...

随机推荐

  1. margin的简单应用

    今晚学了盒模型的marg部分,简单仿下京东的官网首页部分 第一次制作,尽管看来实在惨不忍睹,毕竟娘不嫌儿丑,之后多加努力吧,这几天尽量加快学习进度,能单独制作一张精美的网页最好 附上代码 <!D ...

  2. 1.3. 创建 Grocery Dude 项目(Core Data 应用程序实践指南)

    该程序功能如下: 分类显示家里各个位置的东西,以此提示该购买哪些生活用品 在超市购买时,告诉某个货品摆在哪条过道旁的货架上 将待买物品按过道编组,这样每个过道只需走一遍,就可以拿完所需货品 通过iCl ...

  3. 【Android】Activity

    一.Android四大组件 Activity.Service.BroadCastReceiver.ContentProvider. 二.Activity的继承关系 三.建立.配置和使用Activity ...

  4. Angular - - $resource 更高端的数据交互

    $resource 创建一个resource对象的工厂函数,可以让你安全的和RESFUL服务端进行数据交互. 需要注入 ngResource 模块.angular-resource[.min].js ...

  5. javascript设计模式之解释器模式详解

    http://www.jb51.net/article/50680.htm 神马是“解释器模式”? 先翻开<GOF>看看Definition:给定一个语言,定义它的文法的一种表示,并定义一 ...

  6. NSArray和NSSet的区别

    NSSet到底什么类型? 其实它和NSArray功能性质一样,用于存储对象,属于集合: NSSet  , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的 像NSAr ...

  7. JWPlayer支持SD/HD

    First, we have to render two versions of our video: an SD (standard definition) and HD (high definit ...

  8. OGG学习笔记04-OGG复制部署快速参考

    OGG学习笔记04-OGG复制部署快速参考 源端:Oracle 10.2.0.5 RAC + ASM 节点1 Public IP地址:192.168.1.27 目标端:Oracle 10.2.0.5 ...

  9. linux驱动的多种init函数及其调用顺序

    在驱动设计时可以选用多种驱动初始化函数达到控制驱动初始化顺序控制,其中level(__define_initcall的第一个参数即优先级)越小优先级越高, #define pure_initcall( ...

  10. java实现简单的单点登录_转

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...