mybatis系列笔记(4)---输入输出映射

输入输出映射

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

1输入映射

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

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

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

查询条件封装的类

 1 public class UserQueryVo {
 2
 3     //这里包装需要查询的条件
 4
 5     private UserCustomer userCustomer;
 6
 7     public UserCustomer getUserCustomer() {
 8         return userCustomer;
 9     }
10
11     public void setUserCustomer(UserCustomer userCustomer) {
12         this.userCustomer = userCustomer;
13     }

UserMapper.xml

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

UserMapper.java

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

测试代码

 1   @Test
 2     public void testFindUserList() throws Exception{
 3         SqlSession sqlSession =sqlSessionFactory.openSession();
 4         //创建UserMapper 对象    MyBatis自动生成代理对象
 5         UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
 6
 7         //创建包装对象 设置查询条件
 8         UserQueryVo userQueryVo =new UserQueryVo();
 9
10         UserCustomer userCustomer =new UserCustomer();
11         userCustomer.setSex("1");
12         userCustomer.setUsername("小明");
13         userQueryVo.setUserCustomer(userCustomer);
14
15         //完成查询
16         List<UserCustomer> list =userMapper.findUserList(userQueryVo);
17         System.out.println(list);
18
            }

2.输出映射

(1)resultType

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

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

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

举例:查询用户总人数

mapper.xml

1 <!-- 7综合查询 -->
2       <select id="findUserCount" parameterType="com.guigu.model.UserQueryVo" resultType="int">
3           select count(*) from user where user.sex=#{userCustomer.sex} and user.username like ‘%${userCustomer.username}%‘
4       </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属性之间做一个映射。

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

时间: 2024-10-06 10:35:45

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

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

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

mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进. 目前mybatis在github上托管.  git(分布式版本控制,当前比较流程) MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费

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

一.MyBatis配置文件概要 MyBatis核心配置文件在初始化时会被引用,在配置文件中定义了一些参数,当然可以完全不需要配置文件,全部通过编码实现,该配置文件主要是是起到解偶的作用.如第一讲中我们用到conf.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN&

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

SqlMapConfig.xml SqlMapConfig.xml是Mybatis的全局配置参数,关于他的具体用的有专门的MyBatis - API文档,这里面讲的非常清楚,所以我这里就挑几个讲下: 他的主要配置的属性有如下: 1.properties 属性 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递. 1 <!-- 加载属性文件 --> 2 <properties resource="db

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

mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下: (2)mapper.xml中namespace等于mapper接口的地址 (3)Usermapper.java接口中国的方法名和Usermapper.xml中statement的id一致 <!-- 7综

springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits springmvcmybatis学习笔记汇总 目录 联系作者 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,涉及概念介绍.环境搭建.编程细节.运行调试等方面. 这套笔记整体偏入门和应用,适合快速上手,对底层实现和机理并未做过多分析.我后续会研读spring源码,并把学习的收获写成博客

深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete[转]

上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置, 这是mybatis的核心之一,一定要学好.在mapper文件中,以mapper作为根节点,其下面可以配置的元素节点有: select, insert, update, delete, cache, cache-ref, resultMap, sql . 本篇文章将简单介绍 in

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select.resultMap的用法.select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射.下面就开始看看select 以及 resultMap的用法: 先看select的配置吧: <select <!-- 1. id (必须配置) id是命名空间中的

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select.resultMap的用法.select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射.下面就开始看看select 以及 resultMap的用法: 先看select的配置吧: <select <!-- 1. id (必须配置) id是命名空间中的