MyBatis中的resultMap扼要概述。本站提示廣大學習愛好者:(MyBatis中的resultMap扼要概述)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis中的resultMap扼要概述正文
Mybatis簡介
MyBatis是一個支撐通俗SQL查詢,存儲進程和高等映照的優良耐久層框架。MyBatis清除了簡直一切的JDBC代碼和參數的手工設置和對成果集的檢索封裝。MyBatis可使用簡略的XML或注解用於設置裝備擺設和原始映照,將接口和Java的POJO(Plain Old Java Objects,通俗的Java對象)映照成數據庫中的記載。
Mybatis的功效架構分為三層(圖片借用了百度百科):
1) API接口層:供給給內部應用的接口API,開辟人員經由過程這些當地API來把持數據庫。接口層一吸收到挪用要求就會挪用數據處置層來完成詳細的數據處置。
2) 數據處置層:擔任詳細的SQL查找、SQL解析、SQL履行和履行成果映照處置等。它重要的目標是依據挪用的要求完成一次數據庫操作。
3) 基本支持層:擔任最基本的功效支持,包含銜接治理、事務治理、設置裝備擺設加載懈弛存處置,這些都是共用的器械,將他們抽掏出來作為最基本的組件。為下層的數據處置層供給最基本的支持。
MyBatis中在查詢停止select映照的時刻,前往類型可以用resultType,也能夠用resultMap,resultType是直接表現前往類型的,而resultMap則是對內部ResultMap的援用,然則resultType跟resultMap不克不及同時存在。在MyBatis停止查詢映照的時刻,其實查詢出來的每個屬性都是放在一個對應的Map外面的,個中鍵是屬性名,值則是其對應的值。當供給的前往類型屬性是resultType的時刻,MyBatis會將Map外面的鍵值對掏出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每個查詢映照的前往類型都是ResultMap,只是當我們供給的前往類型屬性是resultType的時刻,MyBatis對主動的給我們把對應的值賦給resultType所指定對象的屬性,而當我們供給的前往類型是resultMap的時刻,由於Map不克不及很好表現范疇模子,我們就須要本身再進一步的把它轉化為對應的對象,這經常在龐雜查詢中很有感化。
有如許一個Blog.java文件
import java.util.List; public class Blog { private int id; private String title; private String content; private String owner; private List<Comment> comments; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public List<Comment> getComments() { return comments; } public void setComments(List<Comment> comments) { this.comments = comments; } @Override public String toString() { return " ----------------博客-----------------\n id: " + id + "\n title: " + title + "\n content: " + content + "\n owner: " + owner; } }
其所對應的數據庫表中存儲有id,title,Content,Owner屬性,那末當我們停止上面如許一個查詢映照的時刻
<typeAlias alias="Blog" type="com.tiantian.mybatis.model.Blog"/><!--來自MyBatis的設置裝備擺設文件mybatis_config.xml--> <select id="selectBlog" parameterType="int" resultType="Blog"> select * from t_blog where id = #{id} </select><!--來自SQL映照文件BlogMapper.xml-->
MyBatis會主動創立一個ResultMap對象,然後基於查找出來的屬性名停止鍵值對封裝,然後再看到前往類型是Blog對象,再從ResultMap中掏出與Blog對象對應的鍵值對停止賦值。
當前往類型直接是一個ResultMap的時刻也長短常有效的,這重要用在停止龐雜結合查詢上,由於停止簡略查詢是沒有甚麼需要的。我們先看看一個前往類型為ResultMap的簡略查詢,再看看龐雜查詢的用法。
簡略查詢的寫法
<resultMap type="Blog" id="BlogResult"> <id column="id" property="id"/> <result column="title" property="title"/> <result column="content" property="content"/> <result column="owner" property="owner"/> </resultMap> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> select * from t_blog where id = #{id} </select>
select映照中resultMap的值是一個內部resultMap的id,表現前往成果映照到哪個resultMap上,內部resultMap的type屬性表現該resultMap的成果是一個甚麼樣的類型,這裡是Blog類型,那末MyBatis就會把它看成一個Blog對象掏出。resultMap節點的子節點id是用於標識該對象的id的,而result子節點則是用於標識一些簡略屬性的,個中的Column屬性表現從數據庫中查詢的屬性,Property則表現查詢出來的屬性對應的值賦給實體對象的哪一個屬性。簡略查詢的resultMap的寫法就是如許的。接上去看一個龐雜一點的查詢。
有一個Comment類,個中有一個Blog的援用,表現是對哪一個Blog的Comment,那末我們在查詢Comment的時刻把其對應的Blog也要查出來賦給其blog屬性。
import java.util.Date; public class Comment { private int id; private String content; private Date commentDate = new Date(); private Blog blog; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getCommentDate() { return commentDate; } public void setCommentDate(Date commentDate) { this.commentDate = commentDate; } public Blog getBlog() { return blog; } public void setBlog(Blog blog) { this.blog = blog; } public String toString() { return blog + "\n ----------------評論-----------------\n id: " + id + "\n content: " + content + "\n commentDate: " + commentDate; } }
其寫法是如許的
<!--來自CommentMapper.xml文件 --> <resultMap type="Comment" id="CommentResult"> <association property="blog" select="selectBlog" column="blog" javaType="Blog"/> </resultMap> <select id="selectComment" parameterType="int" resultMap="CommentResult"> select * from t_Comment where id = #{id} </select> <select id="selectBlog" parameterType="int" resultType="Blog"> select * from t_Blog where id = #{id} </select>
其拜訪情形是如許的,先是要求id為selectComment的select映照,然後獲得一個id為CommentResult的ResultMap對象,我們可以看到在對應的resultMap的前往類型是一個Comment對象,個中只要一個association節點,而沒有像後面說的簡略查詢所對應的id,result子節點,然則其仍會把對應的id等屬性賦給Comment對象,這就是後面所說的MyBatis具有主動封裝功效,只需你供給了前往類型,MyBatis會依據本身的斷定來應用查詢成果封裝對應的對象,所之前面的簡略查詢中,假如你不在resultMap中明白的指出id對應哪一個字段,title對應哪一個字段,MyBatis也會依據本身的斷定來幫你封裝,MyBatis的本身斷定是把查詢的field或其對應的別號與前往對象的屬性停止比擬,假如相婚配且類型也相婚配,MyBatis則會對其停止賦值。在下面對應的resultMap中聯系關系了一個blog屬性,其對應的JAVA類型為Blog,在上述的寫法中,聯系關系對象是經由過程子查詢來停止聯系關系的,固然也能夠直接經由過程聯系關系查詢來停止聯系關系。下面的association子節點中,Property屬性表現是resultMap前往類型的哪一個聯系關系屬性,關於下面的例子就是Comment治理的blog屬性;select表現停止哪一個select映照來映照對應的聯系關系屬性,即會去要求id為select所對應的值的select映照 來查詢出其所聯系關系的屬性對象;Column表現以後聯系關系對象在id為CommentResult的resultMap中所對應的鍵值對,該鍵值對將作為對聯系關系對象子查詢的參數,行將把在selectComment中查詢出來的blog屬性的值作為參數傳給停止聯系關系對象blog的子查詢selectBlog的參數;javaType表現以後聯系關系對象在JAVA中是甚麼類型。
上述引見的是一對一或一對多的情形下,對一的一方的聯系關系的查詢。在現實運用中還有一個用的比擬多的運用是經由過程一的一方查出對應的多的一方,在拿出多的一方的時刻也異樣要把一的一方聯系關系上,即在上述例子中,在拿出Blog對象的時刻,就把其對應的Comment全體拿出來,在拿出Comment的時刻也照樣須要把其對應的Blog拿出來,這是在JAVA中經由過程一次要求就拿出來的。寫法以下:
<!-- 來自BlogMapper.xml文件 --> <resultMap type="Blog" id="BlogResult"> <id column="id" property="id"/> <collection property="comments" select="selectCommentsByBlog" column="id" ofType="Comment"></collection> </resultMap> <resultMap type="Comment" id="CommentResult"> <association property="blog" javaType="Blog" column="blog" select="selectBlog"/> </resultMap> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> select * from t_blog where id = #{id} </select> <!-- 經由過程Blog來查找Comment --> <select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult"> select * from t_Comment where blog = #{blogId} </select>
上述要求的進口是id為selectBlog的select映照,前往成果為id為BlogResult的resultMap,id為BlogResult的類型為Blog,個中指定了id的屬性和字段,指定id將對MyBatis外部的結構感化異常年夜。個中聯系關系了一個comments對象,由於一個Blog可以有許多Comment,該comments為一個聚集,所以用聚集collection停止映照,個中的select照樣表現停止哪一個子查詢來查詢對應的comments,column表現把上述查出來的哪一個字段值看成參數傳給子查詢,ofType也是表現前往類型,這裡的前往類型是聚集外部的類型,之所以用ofType而不是用type是MyBatis外部為了和聯系關系association停止差別。
測試代碼:
@Test public void selectCommentsByBlogTest() { SqlSession session = Util.getSqlSessionFactory().openSession(); CommentMapper commentMapper = session.getMapper(CommentMapper.class); List<Comment> comments = commentMapper.selectCommentsByBlog(6); for (Comment comment : comments) System.out.println(comment); session.close(); } /** * 查詢單筆記錄 */ @Test public void testSelectOne() { SqlSession session = Util.getSqlSessionFactory().openSession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); Blog blog = blogMapper.selectBlog(6); List<Comment> comments = blog.getComments(); if (comments != null) { System.out.println("--------------Comments Size------------" + comments.size()); for (Comment comment : comments) System.out.println(comment); } session.close(); }
以上所述是小編給年夜家引見的MyBatis中的resultMap扼要概述,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!