输入输出映射

通过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框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  2. Mybatis框架的输出映射类型

    Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. resultType(输出类型) 1.输出简单类型 (1)我们在UserM ...

  3. MyBatis框架的使用及源码分析(四) 解析Mapper接口映射xml文件

    在<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 一文中,我们知道mybat ...

  4. MyBatis框架的使用及源码分析(八) MapperMethod

    从 <MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory> 文中,我们知道Mapper,通过MapperProxy ...

  5. MyBatis框架的使用及源码分析(七) MapperProxy,MapperProxyFactory

    从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过Ma ...

  6. MyBatis框架的使用及源码分析(六) MapperRegistry

    我们先Mapper接口的调用方式,见<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用>的示例: public void findUserById() { Sql ...

  7. MyBatis框架的使用及源码分析(五) DefaultSqlSessionFactory和DefaultSqlSession

    我们回顾<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 一文的示例 private static SqlSessionFactory getSessionF ...

  8. MyBatis框架的使用及源码分析(三) 配置篇 Configuration

    从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConf ...

  9. MyBatis框架的使用及源码分析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder

    在 <MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 的demo中看到了SessionFactory的创建过程: SqlSessionFactory sess ...

随机推荐

  1. keepalived高可用简介与配置

    keepalived简介 keepalived介绍 Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP ...

  2. System.Web.Caching.Cache缓存帮助类

    /// <summary> /// 缓存帮助类 /// </summary> public class CacheHelper { /// <summary> // ...

  3. 【信号与线性系统】为什么求解零输入响应时转移算子H(p)不能约分,但计算单位冲激响应时却可以约分?

    为什么求零输入响应rZI时转移算子H(p)不能约分? . . . 我们知道,求零输入响应rZI的实质其实是求解微分方程 D(p)r(t) = N(p)e(t) 的解.由于这里 e(t)=0 ,所以这是 ...

  4. 企业微信自建应用移动端动态获取li并给其事件问题总结

    前段时间一个项目增加企业微信移动端应用,其中几个小功能用到ul-li列表点击并获得相应数据: 开始用var lis=$('#ul li'); for(var=i;i<lis.length;i++ ...

  5. 配置Tomcat时遇到的问题

    今天准备开始JavaWeb的学习,先配置tomcat,前期一切顺利,可当我打开startup.bat,访问localhost:8080时,却显示localhost 拒绝了我们的连接请求. 于是我开始在 ...

  6. iOS模拟器:Undefined symbols for architecture x86_64

    描述:为了适配iPhone 5s的64位处理器,在编译选项中加入了arm64架构.但是发现工程在真机上可以编译通过但是在模拟器上却未编过. 问题解决:经研究在编译选项中再加入x86_64架构,重新编译 ...

  7. vue公共

    1 需求:在做项目的过程中发现,有一些功能是公共的,于是就想把这些公共的功能抽出来,做成独立的模块,别的项目需要用到,直接引用这个模块 2 问题: 前端:1 是用vue做的,vue的跳转是通过rout ...

  8. VS2017 带参数启动调式程序

    有些程序,比如FFPlay,需要传递命令行参数才能运行想要的功能,比如字幕, ffplay -vf subtitles=mv.mkv mv.mkv 参数是 -vf subtitles=mv.mkv m ...

  9. [f]智能获取浏览器版本UA信息的方法

    var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { ...

  10. 特征选择 (feature_selection)

    目录 特征选择 (feature_selection) Filter 1. 移除低方差的特征 (Removing features with low variance) 2. 单变量特征选择 (Uni ...