1.问题引出:
在做映射时候,之前,按照表DDL的字段名,设置java对象的属性。但是,在实际应用无法完全保证表字段名与java类属性完全一致,而且java类应该保持驼峰格式的规范风格。对于类似字段user_id等的情况,不能较好的处理。这时,需要使用resultMap标签来将,DDL的字段名和java类属性名一一对应起来。
下面实现一个使用resultMap做映射的实例,来阐述其使用方法:
2.resultMap使用,resultMap和resultType的不同使用场景:
在表的Mapper文件中可以使用<resultMap>来定义这种对应关系,并将信息注入给java对象。组装从数据表中查询出的实体。为了开发的规范,不管数据库表的字段名和java类属性是否能够对上,都要使用resultMap。
1. 表定义test_order_mm.sql:
CREATE TABLE `test_order_mm` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `order_address` varchar(10) DEFAULT NULL, `price` decimal(19,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
随便加2条数据,如下:
10001beijing8.90
20002chengdu100.87
2.表mapper配置文件TestOrderMm.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.vip.mapping.TestOrderMm"> <resultMap id="orderResultMap" type="com.vip.model.TestOrderMm"> <id property="id" column="id" /> <result property="orderId" column="order_id"/> <result property="orderAddress" column="order_address"/> <result property="price" column="price"/> </resultMap> <select id="selectOrder" parameterType="java.lang.Integer" resultMap="orderResultMap"> select * from test_order_mm where id = #{id} </select> <select id="selectCountOrder" resultType="java.lang.Integer"> select count(*) from test_order_mm </select> </mapper>
说明:
(1)resultMap标签:
resultMap标签定义resultMap;
id:是这个resultMap的唯一标识符,用来后边的select来通过resultMap标签引用;
type:指定这个resultMap对应的java类。
id、result:id和result都用来指定表列和java类属性的映射,但是只有第一个使用id,后边的字段都使用result。
property:要映射的java类的属性。
column:要映射的表的字段名。
(2)在select标签中,注意这里指定的是resultMap属性,而不是resultType属性了。
<select id="selectOrder" parameterType="java.lang.Integer" resultMap="orderResultMap">
select * from test_order_mm where id = #{id}
</select>
(3)既然,上边的规范要求:尽量为所有的表都指定resultMap,是不是resultType属性就无用武之地了呢?答案是否定的。我们可以看select id "selectCountOrder",对于这个select,我们清楚得看到返回的是一个数字"订单数"。很明显,一个数字并不需要我们将其映射到java对象中。所以,这个时候就可以使用resultType,并且,这里一定要注意resultType="java.lang.Integer",因为返回值是一个数字。
3. 注册表的配置文件,sqlMapConfig.xml:
<mapper resource="com/vip/mapping/TestOrderMm.xml"/>
4. 测试类:
/** * 测试resultmap,映射表字段名和java类属性名关系。 */ @Test public void testResultMap() { SqlSession sqlsession = sqlSessionFactory.openSession(); //第一个参数找到执行的SQL,命名空间.sqlid 第二个参数:是输入的参数。 TestOrderMm tom = sqlsession.selectOne("com.vip.mapping.TestOrderMm.selectOrder", 2); System.out.println(tom); //查询订单总数: Integer orderCount = sqlsession.selectOne("com.vip.mapping.TestOrderMm.selectCountOrder"); System.out.println("共有"+orderCount.toString()+"个订单!!"); sqlsession.close(); }
5. 执行结果:
DEBUG - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@7ce3cb8e] DEBUG - ==> Preparing: select * from test_order_mm where id = ? DEBUG - ==> Parameters: 2(Integer) TestOrderMm [id=2, orderId=0002, orderAddress=chengdu, price=100.87] DEBUG - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@7ce3cb8e] DEBUG - ==> Preparing: select count(*) from test_order_mm DEBUG - ==> Parameters: 共有2个订单!!
3.返回多条记录:
对于返回多条记录的需求,表mapper定义还是跟返回一条记录之前的一致的,只是在最后返回时,使用List保存,下面是一个返回多条记录的实例:
TestOrderMm.xml:
<select id="selectCountOrders" resultMap="orderResultMap"> select * from test_order_mm </select>
测试类AppTest.java
List<TestOrderMm> toms = sqlsession.selectList("com.vip.mapping.TestOrderMm.selectCountOrders"); for(TestOrderMm tom_si: toms) { System.out.println(tom_si); } sqlsession.close();
使用selectList方法,替代selectOne方法来获得多行记录。
运行结果:
DEBUG - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@7ce3cb8e] DEBUG - ==> Preparing: select * from test_order_mm DEBUG - ==> Parameters: TestOrderMm [id=1, orderId=0001, orderAddress=beijing, price=8.9] TestOrderMm [id=2, orderId=0002, orderAddress=chengdu, price=100.87]
本文出自 “雪花” 博客,请务必保留此出处http://6216083.blog.51cto.com/6206083/1839663
原文地址:http://6216083.blog.51cto.com/6206083/1839663