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)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

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;
    }
}

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

使用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)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 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());
        }
}

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

 

另外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ù)即可

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

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());
        }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

 

不過(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é)果。

       

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

<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

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

   

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

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 <settings>
       
        <!--設(shè)置resultMap的自動(dòng)映射級(jí)別為Full(自動(dòng)匹配所有)-->
        <setting name="autoMappingBehavior" value="FULL" />   <!--FULL要大寫(xiě)··-->
     
    </settings>

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

設(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)系

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

        stuAge;

   。。。。。省略封裝

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 <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)匹配-->

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

<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;

 

 

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 <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>

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 


 <!--查詢(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