• Mybatis中输出映射resultType与resultMap的区别


    Mybatis中输出映射resultType与resultMap的区别




    (原文地址:http://blog.csdn.net/acmman/article/details/46509375



    一、resultType


    使用resultType进行输出映射,只有查询出来的列名和pojo(实体bean)中的属性名一致,该列才可以映射成功。

    如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
    只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

    1、输出简单类型


    1).需求

    用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

    2).mapper.xml

    [html] view plain copy
    1. <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">  
    2.       
    3.     <!-- 用户信息综合查询   
    4.     #{UserCustom.sex}取出包装对象中性别值  
    5.     ${UserCustom.username}取得pojo包装对象中用户名称  
    6.     -->  
    7.     <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"   
    8.                                 resultType="cn.edu.hpu.mybatis.PO.UserCustom">  
    9.         select * from user 
    10. where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'  
    11.     </select>  
    12.       
    13.     <!-- 用户信息综合查询总数 -->  
    14.     <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">  
    15.         select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'  
    16.     </select>  
    17.     ......  
    18. </mapper>  

    3).mapper.java

    [java] view plain copy
    1. //用户管理的Dao接口  
    2. public interface UserMapper {  
    3.       
    4.     //用户信息综合查询  
    5.     public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;  
    6.       
    7.     //用户信息综合查询总数  
    8.     public int findUserCount(UserQueryVo userQueryVo) throws Exception;  
    9.     ......  
    10. }  

    4).测试代码

    [java] view plain copy
    1. //用户信息综合查询总数  
    2.     @Test  
    3.     public void testFindUserCount() throws Exception{  
    4.           
    5.         SqlSession sqlSession=sqlSessionFactory.openSession();  
    6.           
    7.         //创建UserMapper代理对象  
    8.         UserMapper userMapper=sqlSession.getMapper(UserMapper.class);  
    9.           
    10.         //创建包装对象,设置查询条件  
    11.         UserQueryVo userQueryVo=new UserQueryVo();  
    12.         UserCustom userCustom=new UserCustom();  
    13.         userCustom.setSex("男");  
    14.         userCustom.setUsername("张三");  
    15.         userQueryVo.setUserCustom(userCustom);  
    16.           
    17.         //调用userMapper的方法  
    18.         int count=userMapper.findUserCount(userQueryVo);  
    19.           
    20.         System.out.println("总数为:"+count);  
    21.     }  

    测试结果:总数为:2

    输出日志:
    [plain] view plain copy
    1. DEBUG [main] - Opening JDBC Connection  
    2. DEBUG [main] - Created connection 7832149.  
    3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@778255]  
    4. DEBUG [main] - ==>  Preparing: select count(*) from user where user.sex=? and user.username like '%张三%'   
    5. DEBUG [main] - ==> Parameters: 男(String)  
    6. DEBUG [main] - <==      Total: 1  


    5).小结

    查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。(输出简单类型的要求)



    2、输出pojo对象和pojo列表


    不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。
    在mapper.java指定的方法返回值类型不一样:
    1).输出单个pojo对象,方法返回值是单个对象类型
    2).输出pojo对象list,方法返回值是List<Pojo>

    生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 ).

    3、输出HashMap

    输出pojo对象可以改用HashMap输出类型,将输出的字段名称作为map的key,value为字段值。如果是集合,那就是list里面套了HashMap。



    二、.resultMap


    mybatis中使用resultMap完成高级输出结果映射。


    1、resultMap使用方法

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

    2、下面来进行实验


    1).实验需求

    将下边的sql使用User完成映射
    SELECT id id_,username username_ FROM USER WHERE id=#{value}

    User类中属性名和上边查询列名不一致。

    resultMap使用方法:(以下属性均定义在Mapper.xml映射文件中)


    2).定义resultMap

    [html] view plain copy
    1. <!-- 定义resultType  
    2. 将select id id_,username _username from user和User类中的属性做一个映射关系  
    3.       
    4. type:resultMap最终所映射的Java对象类型,可以使用别名  
    5. id:对resultMap的唯一标识   
    6. -->  
    7. <resultMap type="user" id="userResultMap">  
    8.     <!-- id表示查询结果集中唯一标识   
    9.     column:查询出的列名  
    10.     property:type所指定的POJO中的属性名  
    11.     最终reslutMap对column和property做一个映射关系(对应关系)  
    12.     -->  
    13.     <id column="_id" property="id"/>  
    14.     <!-- 对普通列的映射定义 -->  
    15.     <result column="_username" property="username"/>  
    16. </resultMap>  

    3).使用resultMap作为statement的输出映射类型

    [html] view plain copy
    1. <!-- 使用resultMap进行输出映射   
    2.     resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前面需要加namespace  
    3.     -->  
    4. <select id="findUserByResultMap" parameterType="int" resultMap="userResultMap">  
    5.     select id _id,username _username from user where id=#{value}  
    6. </select>  

    4).mapper接口类中添加相应方法

    [java] view plain copy
    1. //用户管理的Dao接口  
    2. public interface UserMapper {  
    3.       
    4.     public User findUserByResultMap(int id) throws Exception;  
    5.     ......  
    6. }  

    测试:
    [java] view plain copy
    1. @Test  
    2. public void testFindUserByResultMap() throws Exception{  
    3.           
    4.     SqlSession sqlSession=sqlSessionFactory.openSession();  
    5.           
    6.     //创建UserMapper代理对象  
    7.     UserMapper userMapper=sqlSession.getMapper(UserMapper.class);  
    8.           
    9.     //调用userMapper的方法  
    10.     User user=userMapper.findUserByResultMap(1);  
    11.           
    12.     System.out.println(user.getUsername());  
    13. }  

    测试结果:张三

    输出日志:

    [plain] view plain copy
    1. EBUG [main] - Opening JDBC Connection  
    2. DEBUG [main] - Created connection 1465214.  
    3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@165b7e]  
    4. DEBUG [main] - ==>  Preparing: select id _id,username _username from user where id=?   
    5. DEBUG [main] - ==> Parameters: 1(Integer)  
    6. DEBUG [main] - <==      Total: 1  


    三、总结


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

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






    2018-3-27更新


    Mybatis使用resultType查出的字段一定要用驼峰法则重新命名成跟实体属性相同,否则接收不到
  • 相关阅读:
    SAP接口编程 之 JCo3.0系列(03) : Table参数
    SAP接口编程 之 JCo3.0系列(01):JCoDestination
    SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
    ORACLE SQL 分组
    Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决
    win10系统更新补丁时进度条一直卡在0%不动的解决方案
    SAP 批量查看凭证更改记录
    Oracle 中取当前日期的上个月最后天和第一天
    table 谷歌下不出现滚动条
    style.display table-row与block
  • 原文地址:https://www.cnblogs.com/jpfss/p/8657577.html
Copyright © 2020-2023  润新知