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
聯合元素用來處理“一對一”的關系。需要指定映射的Java實體類的屬性,屬性的javaType(通常MyBatis 自己會識別)。對應的數據庫表的列名稱。如果想覆寫的話返回結果的值,需要指定typeHandler。
不同情況需要告訴MyBatis 如何加載一個聯合。MyBatis 可以用兩種方式加載:
1. select: 執行一個其它映射的SQL 語句返回一個Java實體類型。較靈活;
2. resultsMap: 使用一個嵌套的結果映射來處理通過join查詢結果集,映射成Java實體類型。
聚集元素用來處理“一對多”的關系。需要指定映射的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>