程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> mybatis學習

mybatis學習

編輯:DB2教程

mybatis學習




Mybatis 的應用程序都以一個sqlSessionFactory 對象的實例為核心。SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象來獲得。SqlSessionFactoryBuilder對象可以從XML配置文件或從Configuration類的習慣准備的實例中構建SqlSessionFactory對象。

 

SQL映射文件的幾個頂級元素(按照它們應該被定義的順序):

cache配置給定命名空間的引用緩存的配置

cache-ref 從其他命名空間引用緩存配置

resultMap用來描述數據庫結果集和對象的對應關系

sql可以重用的SQL塊,也可以被其他語句引用

insert映射插入語句

update映射更新語句

delete映射刪除語句

select映射查詢語句

 

Select屬性描述

Id在命名空間中唯一的標識符,可以被用來引用的語句。

parameterType將會傳入這條語句的參數類的完全限定名或別名

resultType從這條語句中返回的期望類型的類的完全限定名或別名。注意集合情形,那 應 該是集合可以包含的類型,而不能是集合本身,使用resultType或resultMap,但不 能同時使用

resultMap命名引用外部的resultMap

flushCache將其設置為true,不論語句什麼時候被調用,都會導致緩存被清空,默認值 為false

useCache將其設置為true,將會導致語句的結果被緩存。默認值為true

timeOut這個設置驅動程序等待數據庫返回請求結果,並拋出異常事件的最大等待值

默認不設置(驅動自行處理)

fetchSize這個暗示驅動程序每次批量返回的結果數

statementType:STATEMENT.PREPARED或CALLABLE的一種。讓mybatis 選擇使用

Stetament,PreparedStatement或CallableStatement。默認值PREPARED.

resultSetType:FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一 種,默認是不設置(驅動自行處理)

 

Insert特有屬性

useGeneratedKeys這會告訴Mybatis使用JDBC的getGeneratedKeys方法來取出由數據 內部生成的主鍵。默認值false

keyProperty標記一個屬性,MyBatis會通過getGeneratedKeys或者通過insert語句的selectKey子元素設置它的值。默認不設置

 

 

MyBatis的動態SQL是基於OGNL表達式的。實現動態SQL的主要元素有:if,choose(when,otherwise),trim,where,set,foreach

 

if就是簡單的條件判斷,利用if語句我們可以實現某些簡單的條件選擇

 

choose元素的作用就相當於JAVA中的switch語句,基本上跟JSTL中的choose的作用和用法是一樣的,通常都是與when和otherwise搭配的

 

trim元素的主要功能是可以在自己包含的內容前加上某些前綴,也可以在其後加上某些後綴,與之對應的屬性是prefix和suffix;可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為trim有這樣的功能,所以我們也可以非常簡單的利用trim來代替where元素的功能

set元素主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語句前輸出一個set,然後如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的字段

foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號作為分隔符,close表示以什麼結束,在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:

1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list

2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array

3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis裡面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裡面的key

 

association級聯查詢

聯合元素用來處理“一對一”的關系。需要指定映射的Java實體類的屬性,屬性的javaType(通常MyBatis 自己會識別)。對應的數據庫表的列名稱。如果想覆寫的話返回結果的值,需要指定typeHandler。
不同情況需要告訴MyBatis 如何加載一個聯合。MyBatis 可以用兩種方式加載:

1. select: 執行一個其它映射的SQL 語句返回一個Java實體類型。較靈活;
2. resultsMap: 使用一個嵌套的結果映射來處理通過join查詢結果集,映射成Java實體類型。

collection聚集

聚集元素用來處理“一對多”的關系。需要指定映射的Java實體類的屬性,屬性的javaType(一般為ArrayList);列表中對象的類型ofType(Java實體類);對應的數據庫表的列名稱;
不同情況需要告訴MyBatis 如何加載一個聚集。MyBatis 可以用兩種方式加載:

1. select: 執行一個其它映射的SQL 語句返回一個Java實體類型。較靈活;
2. resultsMap: 使用一個嵌套的結果映射來處理通過join查詢結果集,映射成Java實體類型。

 

 

 

resultMap的元素

·constructor–實例化的時候通過構造器將結果集注入到類中

oidArg– ID 參數; 將結果集標記為ID,以方便全局調用

oarg–注入構造器的結果集

·id–結果集ID,將結果集標記為ID,以方便全局調用

·result–注入一個字段或者javabean屬性的結果

·association–復雜類型聯合;許多查詢結果合成這個類型

o嵌套結果映射– associations能引用自身,或者從其它地方引用

·collection–復雜類型集合

o嵌套結果映射– collections能引用自身,或者從其它地方引用

·discriminator–使用一個結果值以決定使用哪個resultMap

ocase–基於不同值的結果映射

§嵌套結果映射–case也能引用它自身, 所以也能包含這些同樣的元素。它也可以從外部引用resultMap

 

Id、result屬性如下:

 

Attribute

Description

property

映射數據庫列的字段或屬性。如果JavaBean 的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis 將搜索給定名稱的字段。兩種情況下您都可以使用逗點的屬性形式。比如,您可以映射到“username”,也可以映射到“address.street.number”。

column

數據庫的列名或者列標簽別名。與傳遞給resultSet.getString(columnName)的參數名稱相同。

javaType

完整java類名或別名(參考上面的內置別名列表)。如果映射到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果映射到一個HashMap,那您應該明確指定javaType 來確保所需行為。

jdbcType

這張表下面支持的JDBC類型列表列出的JDBC類型。這個屬性只在insert,update或delete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC代碼,在允許為空值的情況下需要指定這個類型。

typeHandler

我們已經在文檔中討論過默認類型處理器。使用這個屬性可以重寫默認類型處理器。它的值可以是一個TypeHandler實現的完整類名,也可以是一個類型別名。

<?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.study.mybatis.StudyMybatis">  
    <!--  
    取別名  
    com.study.mybatis.model.StudyMybatis為表的模型類  
    column 表字段名  
    property 映射表字段的名稱  
    -->  
    <typeAlias type="com.study.mybatis.model.StudyMybatis" alias="StudyMybatisMap"/>  
    <resultMap type="StudyMybatisMap" id="selectStudyMybatis">  
        <id property="id" column="studymybatis_id"/>  
        <result property="name" column="studymybatis_name"/>  
        <result property="password" column="studymybatis_password"/>  
        <result property="phone" column="studymybatis_phone"/>  
        <result property="classid" column="studymybatis_classid"/>  
        <result/>  
    </resultMap>  
    <!--  
    Id在命名空間中唯一的標識符,可以被用來引用的語句  
    parameterType將會傳入這條語句的參數類的完全限定名或別名  
    resultMap命名引用外部的resultMap  
    -->  
    <select id="selectByid" resultMap="selectStudyMybatis" parameterType="int">  
        select studymybatis_id,studymybatis_name,studymybatis_password,studymybatis_phone  
        from studymybatis where id=#{id}  
    </select>  
    <!-- 
    trim例子 
    -->  
    <select id="selectByExample" resultMap="selectStudyMybatis" parameterType="java.util.Map">  
        select studymybatis_id,studymybatis_name,studymybatis_password,studymybatis_phone  
        from studymybatis sm  
        <trim prefix="where" prefixOverrides="AND | OR">  
            <if test="studymybatis_name !=null and studymybatis_name=''">  
                and sm.studymybatis_name = #{name}  
            </if>  
            <if test="classid != null and classid != ''">  
                and sm.studymybatis_classid=#{classid}  
            </if>  
        </trim>  
    </select>  
      
    <resultMap type="StudyMybatisMap" id="StudyMybatisAndStudyClass" extends="com.study.mybatis.StudyClass.studyClassMap">  
        <result property="name" column="studymybatis_name"/>  
        <result property="password" column="studymybatis_password"/>  
        <result property="phone" column="studymybatis_phone"/>  
        <result property="classid" column="studymybatis_classid"/>  
    </resultMap>  
    <select id="selectStudentClass" parameterType="java.math.BigDecimal" resultMap="StudyMybatisMap">  
        select studymybatis_name,studymybatis_password,<include refid="studyclass_list"/>  
        from studymybatis st left outer join studyclass sc on st.studymybatis_classid=sc.classid  
        where sc.studymybatis_id=#{id}  
    </select>  
    <!-- 
    動態語句 if例子 
    -->  
    <select id="ifSelect" parameterType="java.util.Map" resultType="StudyMybatisMap">  
        select * from studymybatis where 1=1  
        <if test="name !=null and name!=''">  
            and studymybatis_name=#{name}  
        </if>  
        <if test="phone !=null and phone !=''">  
            and studymybatis_phone=#{phone}  
        </if>  
    </select>  
    <!-- 
    choose例子 
    -->  
    <select id="chooseSelect" parameterType="java.util.Map" resultType="StudyMybatisMap">  
        select * from studymybatis where 1=1  
        <choose>  
            <when test="name !=null and name!=''">  
                and studymybatis_name=#{name}  
            </when>  
            <when test="phone !=null and phone !=''">  
                and studymybatis_phone=#{phone}  
            </when>  
            <otherwise>  
                and studymybatis_classid="1"  
            </otherwise>  
        </choose>  
    </select>  
    <!-- 
        where例子 
    -->  
    <select id="whereSelect" parameterType="java.util.Map" resultType="StudyMybatisMap">  
        select * from studymybatis   
        <where>  
            <if test="name !=null and name!=''">  
                and studymybatis_name=#{name}  
            </if>  
            <if test="phone !=null and phone !=''">  
                and studymybatis_phone=#{phone}  
            </if>  
        </where>  
    </select>  
    <!-- 
        set例子 
    -->  
    <select id="setSelect" parameterType="java.util.Map" resultType="StudyMybatisMap">  
        update studymybatis   
        <set>  
            <if test="name !=null and name!=''">  
                and studymybatis_name=#{name}  
            </if>  
            <if test="phone !=null and phone !=''">  
                and studymybatis_phone=#{phone}  
            </if>  
        </set>  
        where studymybatis_id=#{id}  
    </select>  
      
    <!-- 
        where例子 
    -->  
    <select id="whereSelect" parameterType="java.util.Map" resultType="StudyMybatisMap">  
        select * from studymybatis where studymybatis_classid in  
        <foreach collection="array" index="index" item="item" open="(" separator="," close=")">  
            #{item}  
        </foreach>  
    </select>  
    <!-- 
    級聯查詢     
    -->  
    <resultMap type="com.study.mybatis.model.StudyMybatis" id="studySelect">  
        <id property="id" column="studymybatis_id"/>  
        <result property="name" column="studymybatis_name"/>  
        <association property="cid" column="classid" javaType="com.study.mybatis.StudyClass" select="classSelect"/>  
    </resultMap>  
    <select id="selectStudy" resultMap="studySelect" parameterType="java.math.BigDecimal">  
        select * from studymybatis where studymybatis_id=#{id}  
    </select>  
    <select id="selectClass" resultMap="classSelect" parameterType="java.math.BigDecimal">  
        select * from studyclass where classid=#{cid}  
    </select>  
    <!-- 
    或 
    -->  
    <resultMap type="com.study.mybatis.model.StudyMybatis" id="studySelect">  
        <id property="id" column="studymybatis_id"/>  
        <result property="name" column="studymybatis_name"/>  
        <association property="cid" column="classid" javaType="com.study.mybatis.StudyClass" select="classSelect"/>  
    </resultMap>  
    <select id="selectStudy" resultMap="studySelect" parameterType="java.math.BigDecimal">  
        select * from studymybatis sm left outer join studyclass sc on sm.studymybatis_id=sc.classid where studymybatis_id=#{id}  
    </select>  
    <!-- 
    聚合例子在studyclass.xml      
    -->  
</mapper>  
<?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.study.mybatis.StudyClass">  
    <resultMap type="com.study.mybatis.model.StudyClass" id="studyClassMap">  
        <id property="id" column="classid"/>  
        <result property="classage" column="classage"/>  
        <result property="banji" column="banji"/>  
    </resultMap>  
    <!-- 
    sql可以被用來定義可重用的SQL代碼段,可以包含在其他語句中 
    -->  
    <sql id="studyclass_list">id,classage,banji</sql>  
    <!-- 
    聚集   
    -->  
    <resultMap type="com.study.mybatis.model.StudyClass" id="classResultMap">  
        <id property="id" column="classid"/>  
        <result property="classage" column="classage"/>  
        <result property="banji" column="banji"/>  
        <association property="studymybatisid" column="studymybatis_id" resultMap="com.study.mybatis.model.StudyMybatis" />  
        <collection property="studymybatisList" column="classid" javaType="ArrayList" ofType="StudyMybatis" resultMap="com.study.mybatis.model.StudyMybatis"></collection>  
    </resultMap>  
    <select id="classandmybatis" parameterType="int" resultMap="classResultMap">  
        select * from studyclass sc left outer join studymybatis sm on sc.classid=sm.studymybatis_classid  
        where sc.banji=${banji}  
    </select>  
</mapper>  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved