• 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属性之间做一个映射。

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

  • 相关阅读:
    1Z0-053 争议题目解析
    Vertica 高可用性测试
    Vertica 导出数据测试用例
    Oracle安装部署,版本升级,应用补丁快速参考
    记录一则数据库连接故障ORA-12560,ORA-12518
    记录一则RMAN备份策略修正案例
    oracle 存储过程 变量的声明和赋值的3种方式
    tomcat 如何查看tomcat版本及位数
    64位Ubuntu 14.04 安装wps
    图表中怎样实现动态变更分类轴与系列值
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6498642.html
Copyright © 2020-2023  润新知