詳解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
應用這個屬性可以覆寫類型處置器。這項值可所以一個完全的類名,也能夠是一個類型別號。
<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>
告知MyBatis 應用JDBC 的getGeneratedKeys 辦法來獲得數據庫本身生成的主鍵(MySQL、SQLSERVER 等
關系型數據庫會有主動生成的字段)。默許:false
true|false false keyProperty標識一個將要被MyBatis 設置進getGeneratedKeys 的key 所前往的值,或許為insert 語句應用一個selectKey
子元素。
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