Sql映射文件
MyBatis真正的力量是在映射語(yǔ)句中。這里是奇跡發(fā)生的地方。對(duì)于所有的力量,SQL映射的XML文件是相當(dāng)?shù)暮?jiǎn)單。當(dāng)然如果你將它們和對(duì)等功能的JDBC代碼來(lái)比較,你會(huì)發(fā)現(xiàn)映射文件節(jié)省了大約95%的代 碼量。MyBatis的構(gòu)建就是聚焦于SQL的,使其遠(yuǎn)離于普通的方式。
SQL映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序):
>mapper:映射文件的根元素節(jié)點(diǎn),只有一個(gè)屬性namespace命名空間,用于區(qū)分不同的mapper,全局唯一 ,namespace綁定的DAO接口全名稱(chēng),即面向接口編程。這里的mapper就相當(dāng)于接口的實(shí)現(xiàn)類(lèi)。
cache - 配置給定命名空間的緩存。
cache-ref – 從其他命名空間引用緩存配置。
resultMap – 最復(fù)雜,也是最有力量的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載你的對(duì)象。
parameterMap – 已經(jīng)被廢棄了!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來(lái)被移除。這里不會(huì)記錄。
sql – 可以重用的SQL塊,也可以被其他語(yǔ)句引用。
insert – 映射插入語(yǔ)句
update – 映射更新語(yǔ)句
delete – 映射刪除語(yǔ)句
select – 映射查詢(xún)語(yǔ)句
一:使用select完成但條件查詢(xún)
使用工具idea和mysql數(shù)據(jù)庫(kù)
創(chuàng)建實(shí)體類(lèi)
public class student { private int stuId; private String stuName; private grade getGrade; private int stuAge; public grade getGetGrade() { return getGrade; } public void setGetGrade(grade getGrade) { this.getGrade = getGrade; } public int getStuAge() { return stuAge; } public student(int id,String name){ } public student(){} public void setStuAge(int stuAge) { this.stuAge = stuAge; } public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } }
使用select完成條件查詢(xún)
一:首先配置mapper使用resultType
<!--模糊查詢(xún) 使用resultType返回結(jié)果集--> <select id="getAllStudentByLike" parameterType="String" resultType="stu">* from student where stuName like CONCAT('%',#{stuName},'%'</select>
測(cè)試類(lèi)
public void Test() throws IOException { studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class); List<student> list = dao.getAllStudentByLike("z"); for (student item:list) { System.out.println("----------"+item.getStuName()); } }
另外parameterType支持的復(fù)雜類(lèi)型除了javaBean之外,還包括Map類(lèi)型
即修改Mapper
<!--模糊查詢(xún)--> <select id="getAllStudentByLike" parameterType="Map" resultType="stu"> select * from student where stuName like CONCAT('%',#{stuName},'%') </select>
然后再測(cè)試類(lèi)里創(chuàng)建一個(gè) HashMap集合直接作為方法參數(shù)即可
studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class); Map<String,String> userMap = new HashMap<String, String>(); userMap.put("stuName","z"); List<student> list = dao.getAllStudentByLike(userMap); for (student item:list) { System.out.println("----------"+item.getStuName()); }
不過(guò)map集合的key值必須和類(lèi)中的字段名相同。
二:使用resultMap完成兩表查詢(xún)
比如學(xué)生表里關(guān)聯(lián)班級(jí)表的主鍵id,如果使用resultType只能展示其id但在實(shí)際中往往關(guān)注的是班級(jí)名稱(chēng),所有需要使用resultMap映射自定義結(jié)果。
<resultMap id="studentMap" type="entity.student"> <id property="stuId" column="stuId"></id> <result property="stuName" column="stuName"></result> <result property="gradeName" column="gradeName"> </resultMap> //sql語(yǔ)句
select * from student,grade
resultType直接表示 返回 類(lèi)型 ,包括基礎(chǔ)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型
resultMap則是對(duì)外部resultMap的引用,對(duì)應(yīng)resultMap的id 表示返回結(jié)果映射到 哪一個(gè)resultMap。:他的應(yīng)用場(chǎng)景是:數(shù)據(jù)庫(kù)字段信息與對(duì)象屬性不一致或者需要做復(fù)雜的聯(lián)合查詢(xún)以便自由控制映射結(jié)果 。
另外在 MyBatis的select元素中,resultType和resultMap本質(zhì)上是一樣的,都是Map數(shù)據(jù)結(jié)構(gòu)。但是 二者不能同時(shí) 存在。
三:使用resultMap的自動(dòng)映射級(jí)別
MyBatis中分為三個(gè)映射級(jí)別
>NONE:禁止自動(dòng)匹配
>PARTIAL:(默認(rèn)):自動(dòng)匹配所有屬性有內(nèi)部嵌套(association,collection)的除外
>FULL:自動(dòng)匹配所有
在大配置里設(shè)置autoMappingBehavior
<settings> <!--設(shè)置resultMap的自動(dòng)映射級(jí)別為Full(自動(dòng)匹配所有)--> <setting name="autoMappingBehavior" value="FULL" /> <!--FULL要大寫(xiě)··--> </settings>
設(shè)置autoMappingBehavior的值為FULL時(shí)就不需要配置resultMap下的節(jié)點(diǎn),他會(huì)根據(jù)數(shù)據(jù)庫(kù)自動(dòng)匹配
四:使用update完成修改
<update id="update"> update student set stuName=#{0} where stuId=#{1} </update>
這里使用占位符比較簡(jiǎn)單的一種作為參數(shù),在測(cè)試類(lèi)中就直接填參就行了
五:使用映射復(fù)雜類(lèi)型的屬性association
前面的result只能映射到j(luò)avaBean的某個(gè)“簡(jiǎn)單類(lèi)型”屬性,基礎(chǔ)數(shù)據(jù)類(lèi)型和包裝類(lèi)等/
但要映射復(fù)雜類(lèi)型的屬性時(shí)需要用到assocoation 復(fù)雜類(lèi)xing:即一個(gè)javaBean里有另一個(gè)javaBean,但是association僅處理一對(duì)一的關(guān)聯(lián)關(guān)系
stuAge; 。。。。。省略封裝
<resultMap id="studentMap" type="entity.student"> <!-- <id property="stuId" column="stuId"></id> <result property="stuName" column="stuName"></result>--> <!--關(guān)聯(lián)另一個(gè) 屬性--> <association property="getGrade" javaType="grade"> <!-- <id property="gradeId" javaType="Integer" column="gradeId"></id> <result property="gradeName" javaType="String" column="gradeName"></result>--> </association> </resultMap> <!--這里使用了自動(dòng)匹配-->
<select id="getAllStudent" resultMap="studentMap"> SELECT * FROM student,grade WHERE student.stuGrade=grade.gradeId </select>
測(cè)試類(lèi)里直接調(diào)用即可
六:前面說(shuō)到association僅處理一對(duì)一的管理關(guān)系
如果要處理一對(duì)多的關(guān)系,則需要使用collection,它與 association元素差不多,但它映射的屬性是一個(gè)集合列表,即javaBean內(nèi)部嵌套一個(gè)復(fù)雜數(shù)據(jù)類(lèi)型屬性。
javaBean
private int gradeId; private String gradeName; private List<student> gatStudent;
<resultMap id="gradeMap" type="grade"> <!--<id property="gradeId" column="gradeId"></id> <result property="gradeName" column="gradeName"></result>--> <collection property="gatStudent" ofType="stu"> <!-- <id property="stuId" column="stuId"></id> <result property="stuName" column="stuName"></result>--> </collection> </resultMap>
<!--查詢(xún)對(duì)應(yīng)年級(jí)的student--> <select id="getAll" resultMap="gradeMap"> select * from student,grade where stuGrade = gradeId and gradeId=1 </select>
完:
http://www.cnblogs.com/zhangyu0217----/p/7112152.html