MyBatis中关于resultType和resultMap的区别介绍
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
下面给出一个例子说明两者的使用差别:
packagecom.clark.model; importjava.util.Date; publicclassGoods{ privateIntegerid; privateIntegercateId; privateStringname; privatedoubleprice; privateStringdescription; privateIntegerorderNo; privateDateupdateTime; publicGoods(){ } publicGoods(Integerid,IntegercateId,Stringname,doubleprice, Stringdescription,IntegerorderNo,DateupdateTime){ super(); this.id=id; this.cateId=cateId; this.name=name; this.price=price; this.description=description; this.orderNo=orderNo; this.updateTime=updateTime; } publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicIntegergetCateId(){ returncateId; } publicvoidsetCateId(IntegercateId){ this.cateId=cateId; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicdoublegetPrice(){ returnprice; } publicvoidsetPrice(doubleprice){ this.price=price; } publicStringgetDescription(){ returndescription; } publicvoidsetDescription(Stringdescription){ this.description=description; } publicIntegergetOrderNo(){ returnorderNo; } publicvoidsetOrderNo(IntegerorderNo){ this.orderNo=orderNo; } publicDategetTimeStamp(){ returnupdateTime; } publicvoidsetTimeStamp(DateupdateTime){ this.updateTime=updateTime; } @Override publicStringtoString(){ return"[goodsinclude:Id="+this.getId()+",name="+this.getName()+ ",orderNo="+this.getOrderNo()+",cateId="+this.getCateId()+ ",updateTime="+this.getTimeStamp()+"]"; } }
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <!--giveaaliasformodel--> <typeAliasalias="goods"type="com.clark.model.Goods"></typeAlias> </typeAliases> <environmentsdefault="development"> <environmentid="development"> <transactionManagertype="JDBC"/> <dataSourcetype="POOLED"> <propertyname="driver"value="oracle.jdbc.driver.OracleDriver"/> <propertyname="url"value="jdbc:oracle:thin:@172.30.0.125:1521:oradb01"/> <propertyname="username"value="settlement"/> <propertyname="password"value="settlement"/> </dataSource> </environment> </environments> <mappers> <mapperresource="com/clark/model/goodsMapper.xml"/> </mappers> </configuration></span>
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mappernamespace="clark"> <resultMaptype="com.clark.model.Goods"id="t_good"> <idcolumn="id"property="id"/> <resultcolumn="cate_id"property="cateId"/> <resultcolumn="name"property="name"/> <resultcolumn="price"property="price"/> <resultcolumn="description"property="description"/> <resultcolumn="order_no"property="orderNo"/> <resultcolumn="update_time"property="updateTime"/> </resultMap> <!--resultMap和resultType的使用区别--> <selectid="selectGoodById"parameterType="int"resultType="goods"> selectid,cate_id,name,price,description,order_no,update_time fromgoodswhereid=#{id} </select> <selectid="selectAllGoods"resultMap="t_good"> selectid,cate_id,name,price,description,order_no,update_timefromgoods </select> <insertid="insertGood"parameterType="goods"> insertintogoods(id,cate_id,name,price,description,order_no,update_time) values(#{id},#{cateId},#{name},#{price},#{description},#{orderNo},#{updateTime}) </insert> </mapper>
packagecom.clark.mybatis; importjava.io.IOException; importjava.io.Reader; importjava.util.List; importorg.apache.ibatis.io.Resources; importorg.apache.ibatis.session.SqlSession; importorg.apache.ibatis.session.SqlSessionFactory; importorg.apache.ibatis.session.SqlSessionFactoryBuilder; importcom.clark.model.Goods; publicclassTestGoods{ publicstaticvoidmain(String[]args){ Stringresource="configuration.xml"; try{ Readerreader=Resources.getResourceAsReader(resource); SqlSessionFactorysessionFactory=newSqlSessionFactoryBuilder().build(reader); SqlSessionsession=sessionFactory.openSession();</span>
<spanstyle="font-size:18px;"><spanstyle="white-space:pre"></span>//使用resultType的情况 Goodsgoods=(Goods)session.selectOne("clark.selectGoodById",4); System.out.println(goods.toString());</span> [html]viewplaincopy在CODE上查看代码片派生到我的代码片 <spanstyle="font-size:18px;"><spanstyle="white-space:pre"></span>//使用resultMap的情况 List<Goods>gs=session.selectList("clark.selectAllGoods"); for(Goodsgoods2:gs){ System.out.println(goods2.toString()); } //Goodsgoods=newGoods(4,12,"clark",12.30,"testisok",5,newDate()); //session.insert("clark.insertGood",goods); //session.commit(); }catch(IOExceptione){ e.printStackTrace(); } } }
结果输出为:
<spanstyle="color:#cc0000;">[goodsinclude:Id=4,name=clark,orderNo=null,cateId=null,updateTime=null]---使用resultType的结果</span> <spanstyle="color:#33ff33;">-------使用resultMap的结果-----------------</span>
以上所述是小编给大家介绍的MyBatis中关于resultType和resultMap的区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!