详解Java的MyBatis框架中SQL语句映射部分的编写
1.resultMap
SQL映射XML文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:
<mappers> <mapperresource="com/liming/manager/data/mappers/UserMapper.xml"/> <mapperresource="com/liming/manager/data/mappers/StudentMapper.xml"/> <mapperresource="com/liming/manager/data/mappers/ClassMapper.xml"/> <mapperresource="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.1resultMap
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)nestedresultmappings–几resultMap自身嵌套关联,也可以引用到一个其它上
(5).collection–复杂类型集合acollectionofcomplextypes
(6).nestedresultmappings–resultMap的集合,也可以引用到一个其它上
(7).discriminator–使用一个结果值以决定使用哪个resultMap
a)case–基本一些值的结果映射的case情形
i.nestedresultmappings–一个case情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。
1.1.1id、result
id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。
最简单的例子:
<resultMaptype="liming.student.manager.data.model.StudentEntity"id="studentResultMap"> <idproperty="studentId"column="STUDENT_ID"javaType="String"jdbcType="VARCHAR"/> <resultproperty="studentName"column="STUDENT_NAME"javaType="String"jdbcType="VARCHAR"/> <resultproperty="studentSex"column="STUDENT_SEX"javaType="int"jdbcType="INTEGER"/> <resultproperty="studentBirthday"column="STUDENT_BIRTHDAY"javaType="Date"jdbcType="DATE"/> <resultproperty="studentPhoto"column="STUDENT_PHOTO"javaType="byte[]"jdbcType="BLOB"typeHandler="org.apache.ibatis.type.BlobTypeHandler"/> </resultMap>
id、result语句属性配置细节:
支持的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.2constructor
我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。使用construcotr功能有限(例如使用collection级联查询)。上面使用id、result实现的功能就可以改为:
<resultMaptype="StudentEntity"id="studentResultMap"> <constructor> <idArgjavaType="String"column="STUDENT_ID"/> <argjavaType="String"column="STUDENT_NAME"/> <argjavaType="String"column="STUDENT_SEX"/> <argjavaType="Date"column="STUDENT_BIRTHDAY"/> </constructor> </resultMap>
当然,我们需要定义StudentEntity实体类的构造方法:
publicStudentEntity(StringstudentID,StringstudentName,StringstudentSex,DatestudentBirthday){ this.studentID=studentID; this.studentName=studentName; this.studentSex=studentSex; this.studentBirthday=studentBirthday; }
1.1.3association联合
联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis如何加载一个联合。MyBatis可以用两种方式加载:
(1).select:执行一个其它映射的SQL语句返回一个Java实体类型。较灵活;
(2).resultsMap:使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级对应一个班主任。
首先定义好班级中的班主任属性:
privateTeacherEntityteacherEntity;
1.1.3.1使用select实现联合
例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。
这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。
ClassMapper.xml文件部分内容:
<resultMaptype="ClassEntity"id="classResultMap"> <idproperty="classID"column="CLASS_ID"/> <resultproperty="className"column="CLASS_NAME"/> <resultproperty="classYear"column="CLASS_YEAR"/> <associationproperty="teacherEntity"column="TEACHER_ID"select="getTeacher"/> </resultMap> <selectid="getClassByID"parameterType="String"resultMap="classResultMap"> SELECT*FROMCLASS_TBLCT WHERECT.CLASS_ID=#{classID}; </select>
TeacherMapper.xml文件部分内容:
<resultMaptype="TeacherEntity"id="teacherResultMap"> <idproperty="teacherID"column="TEACHER_ID"/> <resultproperty="teacherName"column="TEACHER_NAME"/> <resultproperty="teacherSex"column="TEACHER_SEX"/> <resultproperty="teacherBirthday"column="TEACHER_BIRTHDAY"/> <resultproperty="workDate"column="WORK_DATE"/> <resultproperty="professional"column="PROFESSIONAL"/> </resultMap> <selectid="getTeacher"parameterType="String"resultMap="teacherResultMap"> SELECT* FROMTEACHER_TBLTT WHERETT.TEACHER_ID=#{teacherID} </select>
1.1.3.2使用resultMap实现联合
与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表leftjoin教师表),不需要teacher的select。
修改ClassMapper.xml文件部分内容:
<resultMaptype="ClassEntity"id="classResultMap"> <idproperty="classID"column="CLASS_ID"/> <resultproperty="className"column="CLASS_NAME"/> <resultproperty="classYear"column="CLASS_YEAR"/> <associationproperty="teacherEntity"column="TEACHER_ID"resultMap="teacherResultMap"/> </resultMap> <selectid="getClassAndTeacher"parameterType="String"resultMap="classResultMap"> SELECT* FROMCLASS_TBLCTLEFTJOINTEACHER_TBLTTONCT.TEACHER_ID=TT.TEACHER_ID WHERECT.CLASS_ID=#{classID}; </select>
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。
1.1.4collection聚集
聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis如何加载一个聚集。MyBatis可以用两种方式加载:
(1).select:执行一个其它映射的SQL语句返回一个Java实体类型。较灵活;
(2).resultsMap:使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级有多个学生。
首先定义班级中的学生列表属性:
privateList<StudentEntity>studentList;
1.1.4.1使用select实现聚集
用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。
ClassMapper.xml文件部分内容:
<resultMaptype="ClassEntity"id="classResultMap"> <idproperty="classID"column="CLASS_ID"/> <resultproperty="className"column="CLASS_NAME"/> <resultproperty="classYear"column="CLASS_YEAR"/> <associationproperty="teacherEntity"column="TEACHER_ID"select="getTeacher"/> <collectionproperty="studentList"column="CLASS_ID"javaType="ArrayList"ofType="StudentEntity"select="getStudentByClassID"/> </resultMap> <selectid="getClassByID"parameterType="String"resultMap="classResultMap"> SELECT*FROMCLASS_TBLCT WHERECT.CLASS_ID=#{classID}; </select>
StudentMapper.xml文件部分内容:
<!--java属性,数据库表字段之间的映射定义--> <resultMaptype="StudentEntity"id="studentResultMap"> <idproperty="studentID"column="STUDENT_ID"/> <resultproperty="studentName"column="STUDENT_NAME"/> <resultproperty="studentSex"column="STUDENT_SEX"/> <resultproperty="studentBirthday"column="STUDENT_BIRTHDAY"/> </resultMap> <!--查询学生list,根据班级id--> <selectid="getStudentByClassID"parameterType="String"resultMap="studentResultMap"> <includerefid="selectStudentAll"/> WHEREST.CLASS_ID=#{classID} </select>
1.1.4.2使用resultMap实现聚集
使用resultMap,就需要重写一个sql,leftjoin学生表。
<resultMaptype="ClassEntity"id="classResultMap"> <idproperty="classID"column="CLASS_ID"/> <resultproperty="className"column="CLASS_NAME"/> <resultproperty="classYear"column="CLASS_YEAR"/> <associationproperty="teacherEntity"column="TEACHER_ID"resultMap="teacherResultMap"/> <collectionproperty="studentList"column="CLASS_ID"javaType="ArrayList"ofType="StudentEntity"resultMap="studentResultMap"/> </resultMap> <selectid="getClassAndTeacherStudent"parameterType="String"resultMap="classResultMap"> SELECT* FROMCLASS_TBLCT LEFTJOINSTUDENT_TBLST ONCT.CLASS_ID=ST.CLASS_ID LEFTJOINTEACHER_TBLTT ONCT.TEACHER_ID=TT.TEACHER_ID WHERECT.CLASS_ID=#{classID}; </select>
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。
1.1.5discriminator鉴别器
有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。
定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。
下面这个例子为,当classId为20000001时,才映射classId属性。
<resultMaptype="liming.student.manager.data.model.StudentEntity"id="resultMap_studentEntity_discriminator"> <idproperty="studentId"column="STUDENT_ID"javaType="String"jdbcType="VARCHAR"/> <resultproperty="studentName"column="STUDENT_NAME"javaType="String"jdbcType="VARCHAR"/> <resultproperty="studentSex"column="STUDENT_SEX"javaType="int"jdbcType="INTEGER"/> <resultproperty="studentBirthday"column="STUDENT_BIRTHDAY"javaType="Date"jdbcType="DATE"/> <resultproperty="studentPhoto"column="STUDENT_PHOTO"javaType="byte[]"jdbcType="BLOB"typeHandler="org.apache.ibatis.type.BlobTypeHandler"/> <resultproperty="placeId"column="PLACE_ID"javaType="String"jdbcType="VARCHAR"/> <discriminatorcolumn="CLASS_ID"javaType="String"jdbcType="VARCHAR"> <casevalue="20000001"resultType="liming.student.manager.data.model.StudentEntity"> <resultproperty="classId"column="CLASS_ID"javaType="String"jdbcType="VARCHAR"/> </case> </discriminator> </resultMap>
2.增删改查、参数、缓存
2.1select
一个select元素非常简单。例如:
<!--查询学生,根据id--> <selectid="getStudent"parameterType="String"resultMap="studentResultMap"> SELECTST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.CLASS_ID FROMSTUDENT_TBLST WHEREST.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语句默认设为falsetrue|falsefalse
timeout设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定true|false
false
timeout
设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
正整数
未设置
fetchSize
设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定
正整数
驱动器决定
statementType
statement,preparedstatement,callablestatement。
预准备语句、可调用语句STATEMENT
PREPARED
CALLABLEPREPARED
resultSetType
forward_only,scroll_sensitive,scroll_insensitive
只转发,滚动敏感,不区分大小写的滚动FORWARD_ONLY
SCROLL_SENSITIVE
SCROLL_INSENSITIVE驱动器决定
2.2insert
一个简单的insert语句:
<!--插入学生--> <insertid="insertStudent"parameterType="StudentEntity"> INSERTINTOSTUDENT_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。
<!--插入学生自动主键--> <insertid="insertStudentAutoKey"parameterType="StudentEntity"> <selectKeykeyProperty="studentID"resultType="String"order="BEFORE"> selectnextval('student') </selectKey> INSERTINTOSTUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, CLASS_ID) VALUES(#{studentID}, #{studentName}, #{studentSex}, #{studentBirthday}, #{classEntity.classID}) </insert>
insert语句属性配置细节:
timeout设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
预准备语句、可调用语句
PREPARED
CALLABLE
告诉MyBatis使用JDBC的getGeneratedKeys方法来获取数据库自己生成的主键(MySQL、SQLSERVER等
关系型数据库会有自动生成的字段)。默认:false
标识一个将要被MyBatis设置进getGeneratedKeys的key所返回的值,或者为insert语句使用一个selectKey
子元素。
selectKey语句属性配置细节:
AFTER
PREPARED
CALLABLE
2.3update、delete
一个简单的update:
<!--更新学生信息--> <updateid="updateStudent"parameterType="StudentEntity"> UPDATESTUDENT_TBL SETSTUDENT_TBL.STUDENT_NAME=#{studentName}, STUDENT_TBL.STUDENT_SEX=#{studentSex}, STUDENT_TBL.STUDENT_BIRTHDAY=#{studentBirthday}, STUDENT_TBL.CLASS_ID=#{classEntity.classID} WHERESTUDENT_TBL.STUDENT_ID=#{studentID}; </update>
一个简单的delete:
<!--删除学生--> <deleteid="deleteStudent"parameterType="StudentEntity"> DELETEFROMSTUDENT_TBLWHERESTUDENT_ID=#{studentID} </delete>
update、delete语句属性配置细节:
属性
描述
取值
默认
id
在这个模式下唯一的标识符,可被其它语句引用
parameterType
传给此语句的参数的完整类名或别名
flushCache
如果设为true,则会在每次语句调用的时候就会清空缓存。select语句默认设为false
true|false
false
useCache
如果设为true,则语句的结果集将被缓存。select语句默认设为falsetrue|falsefalse
timeout设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定true|false
false
timeout
设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
正整数
未设置
fetchSize
设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定
正整数
驱动器决定
statementType
statement,preparedstatement,callablestatement。
预准备语句、可调用语句STATEMENT
PREPARED
CALLABLEPREPARED
2.4sql
Sql元素用来定义一个可以复用的SQL语句段,供其它语句调用。比如:
<!--复用sql语句查询student表所有字段--> <sqlid="selectStudentAll"> SELECTST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.CLASS_ID FROMSTUDENT_TBLST </sql>
这样,在select的语句中就可以直接引用使用了,将上面select语句改成:
<!--查询学生,根据id--> <selectid="getStudent"parameterType="String"resultMap="studentResultMap"> <includerefid="selectStudentAll"/> WHEREST.STUDENT_ID=#{studentID} </select>
2.5parameters
上面很多地方已经用到了参数,比如查询、修改、删除的条件,插入,修改的数据等,MyBatis可以使用的基本数据类型和Java的复杂数据类型。
基本数据类型,String,int,date等。
但是使用基本数据类型,只能提供一个参数,所以需要使用Java实体类,或Map类型做参数类型。通过#{}可以直接得到其属性。
2.5.1基本类型参数
根据入学时间,检索学生列表:
<!--查询学生list,根据入学时间--> <selectid="getStudentListByDate"parameterType="Date"resultMap="studentResultMap"> SELECT* FROMSTUDENT_TBLSTLEFTJOINCLASS_TBLCTONST.CLASS_ID=CT.CLASS_ID WHERECT.CLASS_YEAR=#{classYear}; </select>
List<StudentEntity>studentList=studentMapper.getStudentListByClassYear(StringUtil.parse("2007-9-1")); for(StudentEntityentityTemp:studentList){ System.out.println(entityTemp.toString()); }
2.5.2Java实体类型参数
根据姓名和性别,检索学生列表。使用实体类做参数:
<!--查询学生list,like姓名、=性别,参数entity类型--> <selectid="getStudentListWhereEntity"parameterType="StudentEntity"resultMap="studentResultMap"> SELECT*fromSTUDENT_TBLST WHEREST.STUDENT_NAMELIKECONCAT(CONCAT('%',#{studentName}),'%') ANDST.STUDENT_SEX=#{studentSex} </select>
StudentEntityentity=newStudentEntity(); entity.setStudentName("李"); entity.setStudentSex("男"); List<StudentEntity>studentList=studentMapper.getStudentListWhereEntity(entity); for(StudentEntityentityTemp:studentList){ System.out.println(entityTemp.toString()); }
2.5.3Map参数
根据姓名和性别,检索学生列表。使用Map做参数:
<!--查询学生list,=性别,参数map类型--> <selectid="getStudentListWhereMap"parameterType="Map"resultMap="studentResultMap"> SELECT*fromSTUDENT_TBLST WHEREST.STUDENT_SEX=#{sex} ANDST.STUDENT_SEX=#{sex} </select>
Map<String,String>map=newHashMap<String,String>(); map.put("sex","女"); map.put("name","李"); List<StudentEntity>studentList=studentMapper.getStudentListWhereMap(map); for(StudentEntityentityTemp:studentList){ System.out.println(entityTemp.toString()); }
2.5.4多参数的实现
如果想传入多个参数,则需要在接口的参数上添加@Param注解。给出一个实例:
接口写法:
publicList<StudentEntity>getStudentListWhereParam(@Param(value="name")Stringname,@Param(value="sex")Stringsex,@Param(value="birthday")Datebirthdar,@Param(value="classEntity")ClassEntityclassEntity);
SQL写法:
<!--查询学生list,like姓名、=性别、=生日、=班级,多参数方式--> <selectid="getStudentListWhereParam"resultMap="studentResultMap"> SELECT*fromSTUDENT_TBLST <where> <iftest="name!=nullandname!=''"> ST.STUDENT_NAMELIKECONCAT(CONCAT('%',#{name}),'%') </if> <iftest="sex!=nullandsex!=''"> ANDST.STUDENT_SEX=#{sex} </if> <iftest="birthday!=null"> ANDST.STUDENT_BIRTHDAY=#{birthday} </if> <iftest="classEntity!=nullandclassEntity.classID!=nullandclassEntity.classID!=''"> ANDST.CLASS_ID=#{classEntity.classID} </if> </where> </select>
进行查询:
List<StudentEntity>studentList=studentMapper.getStudentListWhereParam("","",StringUtil.parse("1985-05-28"),classMapper.getClassByID("20000002")); for(StudentEntityentityTemp:studentList){ System.out.println(entityTemp.toString()); }
2.5.5字符串代入法
默认的情况下,使用#{}语法会促使MyBatis生成PreparedStatement属性并且使用PreparedStatement的参数(=?)来安全的设置值。尽量这些是快捷安全,也是经常使用的。但有时候你可能想直接未更改的字符串代入到SQL语句中。比如说,对于ORDERBY,你可能会这样使用:ORDERBY${columnName}但MyBatis不会修改和规避掉这个字符串。
注意:这样地接收和应用一个用户输入到未更改的语句中,是非常不安全的。这会让用户能植入破坏代码,所以,要么要求字段不要允许客户输入,要么你直接来检测他的合法性。
2.6cache缓存
MyBatis包含一个强在的、可配置、可定制的缓存机制。MyBatis3的缓存实现有了许多改进,既强劲也更容易配置。默认的情况,缓存是没有开启,除了会话缓存以外,它可以提高性能,且能解决全局依赖。开启二级缓存,你只需要在SQL映射文件中加入简单的一行:<cache/>
这句简单的语句的作用如下:
(1).所有在映射文件里的select语句都将被缓存。
(2).所有在映射文件里insert,update和delete语句会清空缓存。
(3).缓存使用“最近很少使用”算法来回收
(4).缓存不会被设定的时间所清空。
(5).每个缓存可以存储1024个列表或对象的引用(不管查询出来的结果是什么)。
(6).缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用
(7).者或线程潜在修改。
例如,创建一个FIFO缓存让60秒就清空一次,存储512个对象结果或列表引用,并且返回的结果是只读。因为在不用的线程里的两个调用者修改它们可能会导致引用冲突。
<cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true"> </cache>
还可以在不同的命名空间里共享同一个缓存配置或者实例。在这种情况下,你就可以使用cache-ref来引用另外一个缓存。
<cache-refnamespace="com.liming.manager.data.StudentMapper"/>
Cache语句属性配置细节: 不设置 只读缓存将对所有调用者返回同一个实例。因此都不能被修改,这可以极大的提高性能。可写的缓存将通过序列 化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是false。
属性
说明
取值
默认值
eviction
缓存策略:
LRU-最近最少使用法:移出最近较长周期内都没有被使用的对象。
FIFI-先进先出:移出队列里较早的对象
SOFT-软引用:基于软引用规则,使用垃圾回收机制来移出对象
WEAK-弱引用:基于弱引用规则,使用垃圾回收机制来强制性地移出对象LRU
FIFI
SOFT
WEAKLRU
flushInterval
代表一个合理的毫秒总计时间。默认是不设置,因此使用无间隔清空即只能调用语句来清空。
正整数
size
缓存的对象的大小
正整数
1024
readOnly
true|false
false