程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java的MyBatis框架中SQL語句映照部門的編寫

詳解Java的MyBatis框架中SQL語句映照部門的編寫

編輯:關於JAVA

詳解Java的MyBatis框架中SQL語句映照部門的編寫。本站提示廣大學習愛好者:(詳解Java的MyBatis框架中SQL語句映照部門的編寫)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java的MyBatis框架中SQL語句映照部門的編寫正文


1.resultMap
SQL 映照XML 文件是一切sql語句放置的處所。須要界說一個workspace,普通界說為對應的接口類的途徑。寫好SQL語句映照文件後,須要在MyBAtis設置裝備擺設文件mappers標簽中援用,例如:

<mappers> 
  <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> 
  <mapper resource="com/liming/manager/data/mappers/StudentMapper.xml" /> 
  <mapper resource="com/liming/manager/data/mappers/ClassMapper.xml" /> 
  <mapper resource="com/liming/manager/data/mappers/TeacherMapper.xml" /> 
</mappers> 

 
當Java接口與XML文件在一個絕對途徑下時,可以不在myBatis設置裝備擺設文件的mappers中聲明。

SQL 映照XML 文件一些低級的元素:

(1). cache – 設置裝備擺設給定形式的緩存
(2). cache-ref – 從其余形式中援用一個緩存
(3). resultMap – 這是最龐雜而卻壯大的一個元素了,它描寫若何從成果集中加載對象
(4). sql – 一個可以被其他語句復用的SQL 塊
(5). insert – 映照INSERT 語句
(6). update – 映照UPDATE 語句
(7). delete – 映照DELEETE 語句
(8). select  -  映照SELECT語句

1.1 resultMap
resultMap 是MyBatis 中最主要最壯大的元素了。你可讓你比應用JDBC 挪用成果集免卻90%的代碼,也能夠讓你做很多JDBC 不支撐的事。實際上,要寫一個同等相似於交互的映照如許的龐雜語句,能夠要上千行的代碼。ResultMaps的目標,就是如許簡略的語句而不須要過剩的成果映照,更多龐雜的語句,除只需一些相對必需的語句描寫關系之外,不再須要其它的。
resultMap屬性:type為java實體類;id為此resultMap的標識。
 
resultMap可以設置的映照:

(1). constructor – 用來將成果反射給一個實例化好的類的結構器
a) idArg – ID 參數;將成果集標志為ID,以便利全局挪用
b) arg –反射到結構器的平日成果

(2). id – ID 成果,將成果集標志為ID,以便利全局挪用

(3). result – 反射到JavaBean 屬性的通俗成果

(4). association – 龐雜類型的聯合;多個成果分解的類型
a) nested result mappings – 幾resultMap 本身嵌套聯系關系,也能夠援用到一個其它上

(5). collection –龐雜類型聚集a collection of complex types

(6). nested result mappings – resultMap 的聚集,也能夠援用到一個其它上

(7). discriminator – 應用一個成果值以決議應用哪一個resultMap
a) case – 根本一些值的成果映照的case 情況
i. nested result mappings –一個case 情況自己就是一個成果映照,是以也能夠包含一些雷同的元素,也能夠援用一個內部resultMap。
 
1.1.1 id、result
id、result是最簡略的映照,id為主鍵映照;result其他根本數據庫表字段到實體類屬性的映照。
最簡略的例子:

<resultMap type="liming.student.manager.data.model.StudentEntity" id="studentResultMap"> 
  <id property="studentId"    column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/> 
  <result property="studentName"    column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/> 
  <result property="studentSex"    column="STUDENT_SEX" javaType="int" jdbcType="INTEGER"/> 
  <result property="studentBirthday"  column="STUDENT_BIRTHDAY" javaType="Date" jdbcType="DATE"/> 
  <result property="studentPhoto" column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" /> 
</resultMap> 

 
id、result語句屬性設置裝備擺設細節:

屬性

描寫

property

須要映照到JavaBean 的屬性稱號。

column

數據表的列名或許標簽別號。

javaType

一個完全的類名,或許是一個類型別號。假如你婚配的是一個JavaBean,那MyBatis 平日會自行檢測到。然後,假如你是要映照到一個HashMap,那你須要指定javaType 要到達的目標。

jdbcType

數據表支撐的類型列表。這個屬性只在insert,update 或delete 的時刻針對許可空的列有效。JDBC 須要這項,但MyBatis 不須要。假如你是直接針對JDBC 編碼,且有許可空的列,而你要指定這項。

typeHandler

應用這個屬性可以覆寫類型處置器。這項值可所以一個完全的類名,也能夠是一個類型別號。


支撐的JDBC類型
       為了未來的援用,MyBatis 支撐以下JDBC 類型,經由過程JdbcType 列舉:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR
 
1.1.2 constructor
我們應用id、result時刻,須要界說java實體類的屬性映照到數據庫表的字段上。這個時刻是應用JavaBean完成的。固然我們也能夠應用實體類的結構辦法來完成值的映照,這個時刻是經由過程結構辦法參數的書寫的次序來停止賦值的。應用construcotr功效無限(例如應用collection級聯查詢)。下面應用id、result完成的功效便可以改成:

<resultMap type="StudentEntity" id="studentResultMap" > 
  <constructor> 
    <idArg javaType="String" column="STUDENT_ID"/> 
    <arg javaType="String" column="STUDENT_NAME"/> 
    <arg javaType="String" column="STUDENT_SEX"/> 
    <arg javaType="Date" column="STUDENT_BIRTHDAY"/> 
  </constructor> 
</resultMap> 

 
固然,我們須要界說StudentEntity實體類的結構辦法:

public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){ 
  this.studentID = studentID; 
  this.studentName = studentName; 
  this.studentSex = studentSex; 
  this.studentBirthday = studentBirthday; 
} 

1.1.3 association結合
結合元素用來處置“一對一”的關系。須要指定映照的Java實體類的屬性,屬性的javaType(平日MyBatis 本身會辨認)。對應的數據庫表的列稱號。假如想覆寫的話前往成果的值,須要指定typeHandler。
分歧情形須要告知MyBatis 若何加載一個結合。MyBatis 可以用兩種方法加載:
(1). select: 履行一個其它映照的SQL 語句前往一個Java實體類型。較靈巧;
(2). resultsMap: 應用一個嵌套的成果映照來處置經由過程join查詢成果集,映照成Java實體類型。
 
例如,一個班級對應一個班主任。
 起首界說好班級中的班主任屬性:

private TeacherEntity teacherEntity; 

 
1.1.3.1應用select完成結合
 例:班級實體類中有班主任的屬性,經由過程結合在獲得一個班級實體時,同時映照出班主任實體。
 如許可以直接復用在TeacherMapper.xml文件中界說好的查詢teacher依據其ID的select語句。並且不須要修正寫好的SQL語句,只須要直接修正resultMap便可。

 ClassMapper.xml文件部門內容:

<resultMap type="ClassEntity" id="classResultMap"> 
  <id property="classID" column="CLASS_ID" /> 
  <result property="className" column="CLASS_NAME" /> 
  <result property="classYear" column="CLASS_YEAR" /> 
  <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> 
</resultMap> 
 
<select id="getClassByID" parameterType="String" resultMap="classResultMap"> 
  SELECT * FROM CLASS_TBL CT 
  WHERE CT.CLASS_ID = #{classID}; 
</select> 

 TeacherMapper.xml文件部門內容:

<resultMap type="TeacherEntity" id="teacherResultMap"> 
  <id property="teacherID" column="TEACHER_ID" /> 
  <result property="teacherName" column="TEACHER_NAME" /> 
  <result property="teacherSex" column="TEACHER_SEX" /> 
  <result property="teacherBirthday" column="TEACHER_BIRTHDAY"/> 
  <result property="workDate" column="WORK_DATE"/> 
  <result property="professional" column="PROFESSIONAL"/> 
</resultMap> 
 
<select id="getTeacher" parameterType="String" resultMap="teacherResultMap"> 
  SELECT * 
   FROM TEACHER_TBL TT 
   WHERE TT.TEACHER_ID = #{teacherID} 
</select> 

1.1.3.2應用resultMap完成結合
 與下面異樣的功效,查詢班級,同時查詢器班主任。需在association中添加resultMap(在teacher的xml文件中界說好的),新寫sql(查詢班級表left join教員表),不須要teacher的select。

 修正ClassMapper.xml文件部門內容:

<resultMap type="ClassEntity" id="classResultMap"> 
  <id property="classID" column="CLASS_ID" /> 
  <result property="className" column="CLASS_NAME" /> 
  <result property="classYear" column="CLASS_YEAR" /> 
  <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> 
</resultMap> 
 
<select id="getClassAndTeacher" parameterType="String" resultMap="classResultMap"> 
  SELECT * 
   FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID 
   WHERE CT.CLASS_ID = #{classID}; 
</select> 

個中的teacherResultMap請見下面TeacherMapper.xml文件部門內容中。

1.1.4 collection集合
集合元素用來處置“一對多”的關系。須要指定映照的Java實體類的屬性,屬性的javaType(普通為ArrayList);列表中對象的類型ofType(Java實體類);對應的數據庫表的列稱號;
分歧情形須要告知MyBatis 若何加載一個集合。MyBatis 可以用兩種方法加載:
(1). select: 履行一個其它映照的SQL 語句前往一個Java實體類型。較靈巧;
(2). resultsMap: 應用一個嵌套的成果映照來處置經由過程join查詢成果集,映照成Java實體類型。
例如,一個班級有多個先生。
起首界說班級中的先生列表屬性:
private List<StudentEntity> studentList; 
1.1.4.1應用select完成集合
 用法和結合很相似,差別在於,這是一對多,所以普通映照過去的都是列表。所以這裡須要界說javaType為ArrayList,還須要界說列表中對象的類型ofType,和必需設置的select的語句稱號(須要留意的是,這裡的查詢student的select語句前提必需是外鍵classID)。
ClassMapper.xml文件部門內容:

<resultMap type="ClassEntity" id="classResultMap"> 
  <id property="classID" column="CLASS_ID" /> 
  <result property="className" column="CLASS_NAME" /> 
  <result property="classYear" column="CLASS_YEAR" /> 
  <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> 
  <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/> 
</resultMap> 
 
<select id="getClassByID" parameterType="String" resultMap="classResultMap"> 
  SELECT * FROM CLASS_TBL CT 
  WHERE CT.CLASS_ID = #{classID}; 
</select> 

StudentMapper.xml文件部門內容:

<!-- java屬性,數據庫表字段之間的映照界說 --> 
<resultMap type="StudentEntity" id="studentResultMap"> 
  <id property="studentID" column="STUDENT_ID" /> 
  <result property="studentName" column="STUDENT_NAME" /> 
  <result property="studentSex" column="STUDENT_SEX" /> 
  <result property="studentBirthday" column="STUDENT_BIRTHDAY" /> 
</resultMap> 
 
<!-- 查詢先生list,依據班級id --> 
<select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap"> 
  <include refid="selectStudentAll" /> 
  WHERE ST.CLASS_ID = #{classID} 
</select> 

1.1.4.2應用resultMap完成集合
 應用resultMap,就須要重寫一個sql,left join先生表。

<resultMap type="ClassEntity" id="classResultMap"> 
  <id property="classID" column="CLASS_ID" /> 
  <result property="className" column="CLASS_NAME" /> 
  <result property="classYear" column="CLASS_YEAR" /> 
  <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> 
  <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/> 
</resultMap> 
 
<select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap"> 
  SELECT * 
   FROM CLASS_TBL CT 
      LEFT JOIN STUDENT_TBL ST 
       ON CT.CLASS_ID = ST.CLASS_ID 
      LEFT JOIN TEACHER_TBL TT 
       ON CT.TEACHER_ID = TT.TEACHER_ID 
   WHERE CT.CLASS_ID = #{classID}; 
</select> 

 
個中的teacherResultMap請見下面TeacherMapper.xml文件部門內容中。studentResultMap請見下面StudentMapper.xml文件部門內容中。
1.1.5discriminator辨別器
有時一個零丁的數據庫查詢或許前往許多分歧(然則願望有些聯系關系)數據類型的成果集。辨別器元素就是被設計來處置這個情形的,還有包含類的繼續條理構造。辨別器異常輕易懂得,由於它的表示很像Java說話中的switch語句。
界說辨別器指定了column和javaType屬性。列是MyBatis查找比擬值的處所。JavaType是須要被用來包管等價測試的適合類型(雖然字符串在許多情況下都邑有效)。
上面這個例子為,當classId為20000001時,才映照classId屬性。

<resultMap type="liming.student.manager.data.model.StudentEntity" id="resultMap_studentEntity_discriminator"> 
  <id property="studentId"    column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/> 
  <result property="studentName"    column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/> 
  <result property="studentSex"    column="STUDENT_SEX" javaType="int" jdbcType="INTEGER"/> 
  <result property="studentBirthday"  column="STUDENT_BIRTHDAY" javaType="Date" jdbcType="DATE"/> 
  <result property="studentPhoto" column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" /> 
  <result property="placeId"      column="PLACE_ID" javaType="String" jdbcType="VARCHAR"/> 
  <discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR"> 
    <case value="20000001" resultType="liming.student.manager.data.model.StudentEntity" > 
      <result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/> 
    </case> 
  </discriminator> 
</resultMap> 

2.增刪改查、參數、緩存

2.1 select
一個select 元素異常簡略。例如:

<!-- 查詢先生,依據id --> 
<select id="getStudent" parameterType="String" resultMap="studentResultMap"> 
  SELECT ST.STUDENT_ID, 
        ST.STUDENT_NAME, 
        ST.STUDENT_SEX, 
        ST.STUDENT_BIRTHDAY, 
        ST.CLASS_ID 
     FROM STUDENT_TBL ST 
     WHERE ST.STUDENT_ID = #{studentID} 
</select> 

這條語句就叫做‘getStudent,有一個String參數,並前往一個StudentEntity類型的對象。
留意參數的標識是:#{studentID}。
 
select 語句屬性設置裝備擺設細節:
屬性 描寫 取值 默許 id 在這個形式下獨一的標識符,可被其它語句援用 parameterType 傳給此語句的參數的完全類名或別號 resultType 語句前往值類型的整類名或別號。留意,假如是聚集,那末這裡填寫的是聚集的項的整類名或別號,而不是聚集自己的類名。(resultType 與resultMap 不克不及並用) resultMap 援用的內部resultMap 名。成果集映照是MyBatis 中最壯大的特征。很多龐雜的映照都可以輕松處理。(resultType 與resultMap 不克不及並用) flushCache 假如設為true,則會在每次語句挪用的時刻就會清空緩存。select 語句默許設為false true|false false useCache 假如設為true,則語句的成果集將被緩存。select 語句默許設為false true|false false
timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 true|false false timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 正整數 未設置 fetchSize 設置一個值後,驅動器會在成果集數量到達此數值後,激起前往,默許為不設值,由驅動器本身決議 正整數 驅動器決議 statementType statement,preparedstatement,callablestatement。
預預備語句、可挪用語句 STATEMENT
PREPARED
CALLABLE PREPARED resultSetType forward_only,scroll_sensitive,scroll_insensitive
只轉發,轉動敏感,不辨別年夜小寫的轉動 FORWARD_ONLY
SCROLL_SENSITIVE
SCROLL_INSENSITIVE 驅動器決議

2.2 insert
 一個簡略的insert語句:

<!-- 拔出先生 --> 
<insert id="insertStudent" parameterType="StudentEntity"> 
    INSERT INTO STUDENT_TBL (STUDENT_ID, 
                     STUDENT_NAME, 
                     STUDENT_SEX, 
                     STUDENT_BIRTHDAY, 
                     CLASS_ID) 
       VALUES  (#{studentID}, 
             #{studentName}, 
             #{studentSex}, 
             #{studentBirthday}, 
             #{classEntity.classID}) 
</insert> 

insert可使用數據庫支撐的主動生成主鍵戰略,設置useGeneratedKeys=”true”,然後把keyProperty 設成對應的列,就弄定了。好比說下面的StudentEntity 應用auto-generated 為id 列生成主鍵.還可使用selectKey元素。上面例子,應用mysql數據庫nextval('student')為自界說函數,用來生成一個key。

<!-- 拔出先生 主動主鍵--> 
<insert id="insertStudentAutoKey" parameterType="StudentEntity"> 
  <selectKey keyProperty="studentID" resultType="String" order="BEFORE"> 
      select nextval('student') 
  </selectKey> 
    INSERT INTO STUDENT_TBL (STUDENT_ID, 
                 STUDENT_NAME, 
                 STUDENT_SEX, 
                 STUDENT_BIRTHDAY, 
                 CLASS_ID) 
       VALUES  (#{studentID}, 
            #{studentName}, 
            #{studentSex}, 
            #{studentBirthday}, 
            #{classEntity.classID})   
</insert> 

insert語句屬性設置裝備擺設細節:
屬性 描寫 取值 默許 id 在這個形式下獨一的標識符,可被其它語句援用 parameterType 傳給此語句的參數的完全類名或別號 flushCache 假如設為true,則會在每次語句挪用的時刻就會清空緩存。select 語句默許設為false true|false false useCache 假如設為true,則語句的成果集將被緩存。select 語句默許設為false true|false false
timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 true|false false timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 正整數 未設置 fetchSize 設置一個值後,驅動器會在成果集數量到達此數值後,激起前往,默許為不設值,由驅動器本身決議 正整數 驅動器決議 statementType statement,preparedstatement,callablestatement。
預預備語句、可挪用語句 STATEMENT
PREPARED
CALLABLE PREPARED useGeneratedKeys

告知MyBatis 應用JDBC 的getGeneratedKeys 辦法來獲得數據庫本身生成的主鍵(MySQL、SQLSERVER 等

關系型數據庫會有主動生成的字段)。默許:false

true|false false keyProperty

標識一個將要被MyBatis 設置進getGeneratedKeys 的key 所前往的值,或許為insert 語句應用一個selectKey

子元素。


selectKey語句屬性設置裝備擺設細節:
屬性 描寫 取值 keyProperty selectKey 語句生成成果須要設置的屬性。 resultType 生成成果類型,MyBatis 許可應用根本的數據類型,包含String 、int類型。 order 可以設成BEFORE 或許AFTER,假如設為BEFORE,那它會先選擇主鍵,然後設置keyProperty,再履行insert語句;假如設為AFTER,它就先運轉insert 語句再運轉selectKey 語句,平日是insert 語句中外部挪用數據庫(像Oracle)內嵌的序列機制。 BEFORE
AFTER statementType 像下面的那樣, MyBatis 支撐STATEMENT,PREPARED和CALLABLE 的語句情勢, 對應Statement ,PreparedStatement 和CallableStatement 呼應 STATEMENT
PREPARED
CALLABLE

2.3 update、delete
一個簡略的update:

<!-- 更新先生信息 --> 
<update id="updateStudent" parameterType="StudentEntity"> 
    UPDATE STUDENT_TBL 
      SET STUDENT_TBL.STUDENT_NAME = #{studentName},  
        STUDENT_TBL.STUDENT_SEX = #{studentSex}, 
        STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, 
        STUDENT_TBL.CLASS_ID = #{classEntity.classID} 
     WHERE STUDENT_TBL.STUDENT_ID = #{studentID};   
</update> 

 一個簡略的delete:

<!-- 刪除先生 --> 
<delete id="deleteStudent" parameterType="StudentEntity"> 
    DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID} 
</delete> 

 
update、delete語句屬性設置裝備擺設細節:
屬性 描寫 取值 默許 id 在這個形式下獨一的標識符,可被其它語句援用 parameterType 傳給此語句的參數的完全類名或別號 flushCache 假如設為true,則會在每次語句挪用的時刻就會清空緩存。select 語句默許設為false true|false false useCache 假如設為true,則語句的成果集將被緩存。select 語句默許設為false true|false false
timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 true|false false timeout 設置驅動器在拋出異常前期待回應的最長時光,默許為不設值,由驅動器本身決議 正整數 未設置 fetchSize 設置一個值後,驅動器會在成果集數量到達此數值後,激起前往,默許為不設值,由驅動器本身決議 正整數 驅動器決議 statementType statement,preparedstatement,callablestatement。
預預備語句、可挪用語句 STATEMENT
PREPARED
CALLABLE PREPARED
 
2.4 sql
Sql元素用來界說一個可以復用的SQL 語句段,供其它語句挪用。好比:

<!-- 復用sql語句 查詢student表一切字段 --> 
<sql id="selectStudentAll"> 
    SELECT ST.STUDENT_ID, 
          ST.STUDENT_NAME, 
          ST.STUDENT_SEX, 
          ST.STUDENT_BIRTHDAY, 
          ST.CLASS_ID 
       FROM STUDENT_TBL ST 
</sql> 

如許,在select的語句中便可以直接援用應用了,將下面select語句改成:

<!-- 查詢先生,依據id --> 
<select id="getStudent" parameterType="String" resultMap="studentResultMap"> 
  <include refid="selectStudentAll"/> 
      WHERE ST.STUDENT_ID = #{studentID}  
</select> 

 2.5 parameters
        下面許多處所曾經用到了參數,好比查詢、修正、刪除的前提,拔出,修正的數據等,MyBatis可使用的根本數據類型和Java的龐雜數據類型。
        根本數據類型,String,int,date等。
        然則應用根本數據類型,只能供給一個參數,所以須要應用Java實體類,或Map類型做參數類型。經由過程#{}可以直接獲得其屬性。
2.5.1 根本類型參數
 依據退學時光,檢索先生列表:

<!-- 查詢先生list,依據退學時光 --> 
<select id="getStudentListByDate" parameterType="Date" resultMap="studentResultMap"> 
  SELECT * 
   FROM STUDENT_TBL ST LEFT JOIN CLASS_TBL CT ON ST.CLASS_ID = CT.CLASS_ID 
   WHERE CT.CLASS_YEAR = #{classYear};   
</select> 

List<StudentEntity> studentList = studentMapper.getStudentListByClassYear(StringUtil.parse("2007-9-1")); 
for (StudentEntity entityTemp : studentList) { 
  System.out.println(entityTemp.toString()); 
} 

 

2.5.2 Java實體類型參數
 依據姓名和性別,檢索先生列表。應用實體類做參數:

<!-- 查詢先生list,like姓名、=性別,參數entity類型 --> 
<select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap"> 
  SELECT * from STUDENT_TBL ST 
    WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') 
     AND ST.STUDENT_SEX = #{studentSex} 
</select> 

StudentEntity entity = new StudentEntity(); 
entity.setStudentName("李"); 
entity.setStudentSex("男"); 
List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity); 
for (StudentEntity entityTemp : studentList) { 
  System.out.println(entityTemp.toString()); 
} 

2.5.3Map參數
依據姓名和性別,檢索先生列表。應用Map做參數:

<!-- 查詢先生list,=性別,參數map類型 --> 
<select id="getStudentListWhereMap" parameterType="Map" resultMap="studentResultMap"> 
  SELECT * from STUDENT_TBL ST 
   WHERE ST.STUDENT_SEX = #{sex} 
     AND ST.STUDENT_SEX = #{sex} 
</select> 

Map<String, String> map = new HashMap<String, String>(); 
map.put("sex", "女"); 
map.put("name", "李"); 
List<StudentEntity> studentList = studentMapper.getStudentListWhereMap(map); 
for (StudentEntity entityTemp : studentList) { 
  System.out.println(entityTemp.toString()); 
} 

2.5.4多參數的完成
假如想傳入多個參數,則須要在接口的參數上添加@Param注解。給出一個實例:
接口寫法:

public List<StudentEntity> getStudentListWhereParam(@Param(value = "name") String name, @Param(value = "sex") String sex, @Param(value = "birthday") Date birthdar, @Param(value = "classEntity") ClassEntity classEntity); 

 
SQL寫法:

<!-- 查詢先生list,like姓名、=性別、=誕辰、=班級,多參數方法 --> 
<select id="getStudentListWhereParam" resultMap="studentResultMap"> 
  SELECT * from STUDENT_TBL ST 
  <where> 
    <if test="name!=null and name!='' "> 
      ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{name}),'%') 
    </if> 
    <if test="sex!= null and sex!= '' "> 
      AND ST.STUDENT_SEX = #{sex} 
    </if> 
    <if test="birthday!=null"> 
      AND ST.STUDENT_BIRTHDAY = #{birthday} 
    </if> 
    <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> 
      AND ST.CLASS_ID = #{classEntity.classID} 
    </if> 
  </where> 
</select>

停止查詢:

List<StudentEntity> studentList = studentMapper.getStudentListWhereParam("", "",StringUtil.parse("1985-05-28"), classMapper.getClassByID("20000002")); 
for (StudentEntity entityTemp : studentList) { 
  System.out.println(entityTemp.toString()); 
} 

2.5.5字符串代入法
        默許的情形下,應用#{}語法會促使MyBatis 生成PreparedStatement 屬性而且應用PreparedStatement 的參數(=?)來平安的設置值。盡可能這些是快捷平安,也是常常應用的。但有時刻你能夠想直接未更改的字符串代入到SQL 語句中。好比說,關於ORDER BY,你能夠會如許應用:ORDER BY ${columnName}但MyBatis 不會修正和躲避失落這個字符串。
        留意:如許地吸收和運用一個用戶輸出到未更改的語句中,長短常不平安的。這會讓用戶能植入損壞代碼,所以,要末請求字段不要許可客戶輸出,要末你直接來檢測他的正當性 。
2.6 cache緩存

        MyBatis 包括一個強在的、可設置裝備擺設、可定制的緩存機制。MyBatis 3 的緩存完成有了很多改良,既微弱也更輕易設置裝備擺設。默許的情形,緩存是沒有開啟,除會話緩存之外,它可以進步機能,且能處理全局依附。開啟二級緩存,你只須要在SQL 映照文件中參加簡略的一行:<cache/>

這句簡略的語句的感化以下:
(1). 一切在映照文件裡的select 語句都將被緩存。
(2). 一切在映照文件裡insert,update 和delete 語句會清空緩存。
(3). 緩存應用“比來很少應用”算法往返收
(4). 緩存不會被設定的時光所清空。
(5). 每一個緩存可以存儲1024 個列表或對象的援用(不論查詢出來的成果是甚麼)。
(6). 緩存將作為“讀/寫”緩存,意味著獲得的對象不是同享的且對換用者是平安的。不會有其它的挪用
(7). 者或線程潛伏修正。
 
例如,創立一個FIFO 緩存讓60 秒就清空一次,存儲512 個對象成果或列表援用,而且前往的成果是只讀。由於在不消的線程裡的兩個挪用者修正它們能夠會招致援用抵觸。

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"> 
</cache> 

 
還可以在分歧的定名空間裡同享統一個緩存設置裝備擺設或許實例。在這類情形下,你便可以應用cache-ref 來援用別的一個緩存。
<cache-ref namespace="com.liming.manager.data.StudentMapper"/> 

Cache 語句屬性設置裝備擺設細節:
屬性 解釋 取值 默許值 eviction 緩存戰略:
LRU - 比來起碼應用法:移出比來較長周期內都沒有被應用的對象。
FIFI- 先輩先出:移出隊列裡較早的對象
SOFT - 軟援用:基於軟援用規矩,應用渣滓收受接管機制來移出對象
WEAK - 弱援用:基於弱援用規矩,應用渣滓收受接管機制來強迫性地移出對象 LRU
FIFI
SOFT
WEAK LRU flushInterval 代表一個公道的毫秒總計時光。默許是不設置,是以應用無距離清空即只能挪用語句來清空。 正整數

不設置

size 緩存的對象的年夜小 正整數 1024 readOnly

只讀緩存將對一切挪用者前往統一個實例。是以都不克不及被修正,這可以極年夜的進步機能。可寫的緩存將經由過程序列

化來前往一個緩存對象的拷貝。這會比擬慢,然則比擬平安。所以默許值是false。

true|false false

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