mybatis基础_resultMap

Posted l48x4264l46

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis基础_resultMap相关的知识,希望对你有一定的参考价值。

mybatis可以很方便的使用resultType进行查询结果映射,但是在实际开发中很有可能会遇到实体类的成员变量名和实际查询的字段名称不符。

这时就可以使用mybatis的另一种映射方式resultMap。

使用resultType进行开发

1、实体类 

  

public class Order implements Serializable 
    Integer id;
    Integer userId;
    Integer number;
    Date createtime;
    String note;

    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public Integer getUserId() 
        return userId;
    

    public void setUserId(Integer userId) 
        this.userId = userId;
    

    public Integer getNumber() 
        return number;
    

    public void setNumber(Integer number) 
        this.number = number;
    

    public Date getCreatetime() 
        return createtime;
    

    public void setCreatetime(Date createtime) 
        this.createtime = createtime;
    

    public String getNote() 
        return note;
    

    public void setNote(String note) 
        this.note = note;
    

    @Override
    public String toString() 
        return "Order" +
                "id=" + id +
                ", userId=" + userId +
                ", number=" + number +
                ", createtime=" + createtime +
                ", note=‘" + note + ‘\\‘‘ +
                ‘‘;
    

2、表结构

技术图片

 

 3、表数据

技术图片

 

4、xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liuxianglin.mybatis.study.mapper.OrderMapper">
    <select id="listAllOrder" resultType="order">
        SELECT * FROM `order`;
    </select>
</mapper>

5、测试类

public class MybatisTest 
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void getSqlSession() throws IOException 
        /*获得文件流*/
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        /*获取SQLSession工厂*/
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    

    @Test
    public void testGetAllOrder() 
        /*获得SQLSession*/
        SqlSession sqlSession = sqlSessionFactory.openSession();
        /*获得代理Mapper实现类*/
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        /*查询所有的数据*/
        List<Order> allOrders = orderMapper.listAllOrder();
        if (allOrders != null && allOrders.size() > 0) 
            for (Order order : allOrders) 
                System.out.println(order);
            
        
    

6、控制台打印结果

技术图片

 从表数据可以有一条数据 也就是user_id 没有映射出来 打印结果为null

 这就是因为数据库的表字段没有和实体类中成员变量名称相同,所以mybatis没法映射

  解决方式:

  1、使用别名

  2、使用resultMap

 推荐使用resultMap

使用resultMap的方式

 1、在xml中定义一个resultMap,resultMap 的属性有 id、type、autoMapping、extends

  1、id给这个resultMap一个名称

  2、type指定此resultMap的映射类

  3、是否自动映射字段,默认是true

  4、extends继承至某一resultMao(和java中的继承是同样的理解)

 2、resultMap子标签

  1、<id>标签 表示这个是主键

  2、<result> 表示是普通字段

  他们都有column、property、javaType、jdbcType四个属性

    1、column表示需要映射的字段

    2、property表示映射到实体类的成员变量

    3、javaType表示该成员变量的数据类型

    4、jdbcType表示字段的数据类型

  其中javaType和jdbcType不需要手动设定,mybatis会自动设置类型

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liuxianglin.mybatis.study.mapper.OrderMapper">
    <resultMap id="orderMap" type="order">
        <id column="id" property="id"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
    </resultMap>

    <select id="listAllOrder" resultMap="orderMap">
        SELECT * FROM `order`;
    </select>
</mapper>

 在编写的过程中发现只有一个字段需要手动映射,而mybatis默认是自动映射的所以可以将其他的字段映射去掉

   

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liuxianglin.mybatis.study.mapper.OrderMapper">
    <resultMap id="orderMap" type="order">
        <result column="user_id" property="userId"/>
    </resultMap>

    <select id="listAllOrder" resultMap="orderMap">
        SELECT * FROM `order`;
    </select>
</mapper>

执行测试方法 打印结果

技术图片

 

 userId被成功映射!

以上是关于mybatis基础_resultMap的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis基础入门《十五》ResultMap子元素(collection)

Mybatis动态SQL单一基础类型参数用if标签

MyBatis学习总结_13_Mybatis查询之resultMap和resultType区别

MyBatis基础入门《十四》ResultMap子元素

mybatis基础学习2---(resultType和resultMap的用法和区别)

MyBatis关联查询,表字段相同,resultMap映射问题的解决办法