mybatis框架(4)---输入输出映射

输入输出映射

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值