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被成功映射!