<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Mybatis返回Xml返回值有resultType和resultMap,我們一般都該如何選擇呢?
當使用resultType做SQL語句返回結果型別處理時,對於SQL語句查詢出的欄位在相應的pojo中必須有和它相同的欄位對應,而resultType中的內容就是pojo在本專案中的位置。
CREATE TABLE `t_user_test` ( `id` int(20) NOT NULL AUTO_INCREMENT, `user_name` varchar(60) DEFAULT NULL COMMENT '使用者名稱稱', `real_name` varchar(60) DEFAULT NULL COMMENT '真實名稱', `sex` tinyint(3) DEFAULT NULL COMMENT '姓名', `mobile` varchar(20) DEFAULT NULL COMMENT '電話', `email` varchar(60) DEFAULT NULL COMMENT '郵箱', `note` varchar(200) DEFAULT NULL COMMENT '備註', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=142 DEFAULT CHARSET=utf8;碼
package com.enjoylearning.mybatis.entity; import java.io.Serializable; import java.util.List; import org.apache.ibatis.annotations.Param; import com.mysql.jdbc.Blob; public class TUser implements Serializable{ private Integer id; private String userName; private String realName; private Byte sex; private String mobile; private String email; private String note; private TPosition position; private List<TJobHistory> jobs ; private List<HealthReport> healthReports; private List<TRole> roles; @Override public String toString() { String positionId= (position == null ? "" : String.valueOf(position.getId())); return "TUser [id=" + id + ", userName=" + userName + ", realName=" + realName + ", sex=" + sex + ", mobile=" + mobile + ", email=" + email + ", note=" + note + ", positionId=" + positionId + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public Byte getSex() { return sex; } public void setSex(Byte sex) { this.sex = sex; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public TPosition getPosition() { return position; } public void setPosition(TPosition position) { this.position = position; } public List<TJobHistory> getJobs() { return jobs; } public void setJobs(List<TJobHistory> jobs) { this.jobs = jobs; } public List<HealthReport> getHealthReports() { return healthReports; } public void setHealthReports(List<HealthReport> healthReports) { this.healthReports = healthReports; } public List<TRole> getRoles() { return roles; } public void setRoles(List<TRole> roles) { this.roles = roles; } }
public interface TUserTestMapper { TUser selectByPrimaryKey(Integer id); List<TUser> selectAll(); }
<?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.mybatis.mapper.TUserTestMapper"> <select id="selectByPrimaryKey" resultType="TUser"> select id, user_name, real_name, sex, mobile, email, note from t_user_test where id = #{id,jdbcType=INTEGER} </select> <select id="selectAll" resultType="TUser"> select id, user_name, real_name, sex, mobile, email, note from t_user_test </select> </mapper>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"/> <settings> <!-- 設定自動駝峰轉換 --> <setting name="mapUnderscoreToCamelCase" value="true" /> <!-- 開啟懶載入 --> <!-- 當啟用時,有延遲載入屬性的物件在被呼叫時將會完全載入任意屬性。否則,每種屬性將會按需要載入。預設:true --> <setting name="aggressiveLazyLoading" value="false" /> </settings> <!-- 別名定義 --> <typeAliases> <package name="com.enjoylearning.mybatis.entity" /> </typeAliases> <plugins> <plugin interceptor="com.enjoylearning.mybatis.Interceptors.ThresholdInterceptor"> <property name="threshold" value="10"/> </plugin> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="pageSizeZero" value="true" /> </plugin> </plugins> <!--設定environment環境 --> <environments default="development"> <!-- 環境設定1,每個SqlSessionFactory對應一個環境 --> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://ip:port/test?useUnicode=true" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!-- 對映檔案,mapper的組態檔 --> <mappers> <!--直接對映到相應的mapper檔案 --> <mapper resource="sqlmapper/TUserTestMapper.xml" /> </mappers> </configuration>
public class MybatisDemo2 { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { //--------------------第一階段--------------------------- // 1.讀取mybatis組態檔創SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 1.讀取mybatis組態檔創SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); inputStream.close(); } @Test //知識點:resultType public void testAutoMapping() throws IOException { // 2.獲取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 3.獲取對應mapper TUserTestMapper mapper = sqlSession.getMapper(TUserTestMapper.class); // 4.執行查詢語句並返回多條資料 List<TUser> users = mapper.selectAll(); for (TUser tUser : users) { System.out.println(tUser); } } }
sql語句:「com.mysql.jdbc.JDBC4PreparedStatement@654f0d9c: select id, user_name, real_name, sex, mobile, email, note from t_user_test」執行時間為:35毫秒,已經超過閾值! TUser [id=1, userName=zhangsan, realName=張三, sex=1, mobile=186995587411, email=zhangsan@qq.com, note=zhangsan的備註, positionId=] TUser [id=2, userName=lisi, realName=李四, sex=1, mobile=18677885200, email=lisi@qq.com, note=lisi的備註, positionId=] TUser [id=3, userName=wangwu, realName=王五, sex=2, mobile=18695988747, email=xxoo@163.com, note=wangwu's note, positionId=]
resultType當返基本型別的時候建議選擇,當返回POJO類的時候由於需要完全和資料庫欄位進行對應,存在不靈活、問題排查難等問題。
resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 資料提取程式碼中解放出來,在對複雜語句進行聯合對映的時候,它很可能可以代替數千行的同等功能的程式碼。ResultMap 的設計思想是,簡單的語句不需要明確的結果對映,而複雜一點的語句只需要描述它們的關係就行了。
屬性 | 描述 |
id | 當前名稱空間中的一個唯一標識,用於標識一個result map. |
type | 類的完全限定名, 或者一個型別別名. |
autoMapping | 如果設定這個屬性,MyBatis將會為這個ResultMap開啟或者關閉自動對映。這個屬性會覆蓋全域性的屬性 autoMappingBehavior。預設值為:unset。 |
實體類,組態檔同上
public interface TUserMapper { List<TUser> selectTestResultMap(); }
<?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.mybatis.mapper.TUserMapper"> <resultMap id="UserResultMap" type="TUser" autoMapping="true"> <id column="id" property="id" /> <result column="userName" property="userName"/> <result column="realName" property="realName" /> <result column="sex" property="sex" /> <result column="mobile" property="mobile" /> <result column="email" property="email" /> <result column="note" property="note" /> <association property="position" javaType="TPosition" columnPrefix="post_"> <id column="id" property="id"/> <result column="name" property="postName"/> <result column="note" property="note"/> </association> </resultMap> <select id="selectTestResultMap" resultMap="UserResultMap" > select a.id, userName, realName, sex, mobile, email, a.note, b.id post_id, b.post_name, b.note post_note from t_user a, t_position b where a.position_id = b.id </select> </mapper>
public class MybatisDemo2 { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { //--------------------第一階段--------------------------- // 1.讀取mybatis組態檔創SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 1.讀取mybatis組態檔創SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); inputStream.close(); } @Test public void testResultMap() throws IOException { //--------------------第二階段--------------------------- // 2.獲取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 3.獲取對應mapper TUserMapper mapper = sqlSession.getMapper(TUserMapper.class); //--------------------第三階段--------------------------- // 4.執行查詢語句並返回單條資料 List<TUser> users = mapper.selectTestResultMap(); for (TUser tUser : users) { System.out.println(tUser.getUserName()); System.out.println(tUser.getPosition().getPostName()); } } }
sql語句:“com.mysql.jdbc.JDBC4PreparedStatement@19bb07ed: select
a.id,
userName,
realName,
sex,
mobile,
email,
a.note,
b.id post_id,
b.post_name,
b.note post_note
from t_user a,
t_position b
where a.position_id = b.id”執行時間為:52毫秒,已經超過閾值!
zhangsan
總經理
lisi
零時工
wangwu
總經理
當返回物件為基礎型別時建議走resultType,當返回物件為POJO時,強制走resultMap。同時可以參考阿里巴巴JAVA開發手冊中的5.4.3節,返回要解耦,不訥訥更直接使用resultClass。
到此這篇關於Mybatis開發要點-resultType和resultMap有什麼區別詳解的文章就介紹到這了,更多相關Mybatis -resultType resultMap內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45