第5章MyBatis高级特性(理论)_第1页
第5章MyBatis高级特性(理论)_第2页
第5章MyBatis高级特性(理论)_第3页
第5章MyBatis高级特性(理论)_第4页
第5章MyBatis高级特性(理论)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

MyBatis高级特性本章内容Mybatis缓存使用存储过程注解本章目标理解Mybatis缓存原理掌握Mybatis调用存储过程了解Mybatis中的注解配置Mybatis的缓存机制缓存技术是一种“以空间换时间”的设计理念,是利用内存空间资源来提高数据检索速度的有效手段之一。MyBatis包含一个非常强大的查询缓存特性,可以非常方便地配置和定制。MyBatis默认没有开启缓存,除了局部的session缓存。要开启二级缓存,需要在SQL映射文件中添加<cache/>。缓存作用映射语句文件中的所有select语句将会被缓存。映射语句文件中的所有insert、update和delete语句会刷新缓存。

缓存会使用LeastRecentlyUsed(LRU,最近最少使用的)算法收回。根据时间表(如noFlushInterval,没有刷新间隔),缓存不会以任何时间顺序来刷新。缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改Mybatis的缓存机制添加缓存在mybatis-config.xml中配置全局缓存<settings><settingname="cacheEnabled"value="true"/>//默认为false</settings>在SQL映射文件中添加

<cache

eviction="FIFO"

flushInterval="60000"

size="512"

readOnly="true"/>该代码创建了一个FIFO缓存,并每隔60秒刷新,存放结果对象或列表的512个引用,且返回的对象被认为是只读的,因此,在不同线程中的调用者之间修改它们会导致冲突。属性名称描述eviction可用资源的回收策略,主要包括以下几种:LRU:较少使用的、移除最长时间不被使用的对象。

FIFO(先进先出):按对象进入缓存的顺序将其移除。

SOFT(软引用):移除基于垃圾回收器状态和软引用规则的对象。

WEAK(弱引用):积极地移除基于垃圾收集器状态和弱引用规则的对象。默认为LRUflushInterval刷新间隔,可以被设置为任意的正整数,它们代表一个合理的毫秒形式的时间段。默认情况下不设置,即没有刷新间隔,缓存仅在调用语句时刷新size引用数目,可以被设置为任意正整数,要牢记缓存的对象数目和运行环境的可用内存资源数目。默认值为1024readOnly只读属性可以被设置为true或false。只读的缓存设置会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。此处提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这样较为缓慢,但比较安全,因此默认为false存储过程的使用存储过程的优点:(1)存储过程只在创造时进行编译,以后每次执行存储过程都无须重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。(2)当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query和Delete时),可将此复杂操作用存储过程封装起来,还可与数据库提供的事务处理一同使用。(3)存储过程可以重复使用,可减少数据库开发人员的工作量。(4)安全性高,可设定只有某些用户才具有对指定存储过程的使用权。在Mybatis中使用存储过程在配置中添加如下语法格式:<selectid="getBlogCountByName"statementType="CALLABLE"parameterType="java.util.HashMap">

//该方法的参数为map集合 <![CDATA[ {callproc_getBlogCountByAuthor( #{username,//与传递到后台的集合中的key同名 mode=IN,

//注意:mode和jdbcType的值为大写 jdbcType=VARCHAR }, #{blogCount,//输出型参数名称可以随意些,但顺序要一致 mode=OUT,//表示输出型参数 jdbcType=INTEGER} )} ]]> </select>在Mybatis中使用存储过程接口中调用方法:publicvoidgetBlogCountByName(HashMapmap);调用的方法:HashMapmap=newHashMap();//声明一个 map.put("name","襄");//第一个参数,由于第二个参数是输出型,所以不设置 cm.callProc(map);//调用时传参

Stringout=map.get("countnum").toString();//countnum为select中配置的名字,而不是存储过程的输出参数属性名注意调用输出型存储过程的方法不能使用缓存,如果你在mapper中设置的有全局缓存,可以在<select>节点中设置useCache="false"表示此查询不使用缓存。在Mybatis中使用存储过程(1)在SQLSERVER中创建如下存储过程:createprocedureproc_getBlogCountByAuthor(@usernamevarchar(50),@blogCountintoutput)asbegin declare@author_idint; select@author_id=IDfromauthorwhereusername=@username; select@blogCount=COUNT(ID)fromblogwhereauthor_id=@author_id;end;在Mybatis中使用存储过程(2)在BlogMapper.xml文件中添加如下配置信息: <selectid="getBlogCountByName"statementType="CALLABLE"parameterType="java.util.HashMap"> <![CDATA[ {callproc_getBlogCountByAuthor( #{username, mode=IN, jdbcType=VARCHAR }, #{blogCount, mode=OUT, jdbcType=INTEGER} )} ]]> </select>在Mybatis中使用存储过程在Mybatis中编写Java代码调用存储过程,代码如下: publicstaticvoidmain(String[]args){ SqlSessionsqlSession=MyBatisUtil.getSqlSessionFactory().openSession(); //创建map类型参数 Map<String,Object>params=newHashMap<String,Object>(); params.put("username","张伟杰"); //调用存储过程 sqlSession.selectOne("getBlogCountByName",params); intcount=(Integer)params.get("blogCount"); System.out.println(count);}注解配置MyBatis3构建在基于全面且强大的Java配置API上。该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。mybatis注解:注解目标对应的XML标签@CacheNamespace类<cache>@CacheNamespaceRef类<cacheRef>@Results方法<resultMap>@Result方法<result><id>@One方法<association>@Many方法<collection>@Insert@Update@Delete方法<insert><update><delete>注解配置Mybatis中常用的注解注解目标对应的XML标签@InsertProvider@UpdateProvider@DeleteProvider@SelectProvider方法<insert><update><delete><select>允许创建动态SQL@Param参数N/A@Options方法映射语句的属性在MyBatis中使用注解@CacheNamespace(size=512):定义在该命名空间内允许使用内置缓存@Options(useCache=true,flushCache=false,timeout=10000):一些查询的选项开关@Param("id"):全局限定别名,定义查询参数在sql语句中的位置不再是顺序下标0,1,2,3......的形式,而是对应名称,该名称在此处定义。

@Results是以@Result为元素的数组,@Result表示单条属性——字段的映射关系,id=true表示该id字段是主键,查询时mybatis会给予必要的优化。数组中所有的@Result组成了单个记录的映射关系,而@Results则是单个记录的集合。另外,还有一个非常重要的注解@ResultMap,其与@Results类似@Select("查询语句")、@Insert("增加语句")、@Update("更新语句")和@Delete("删除语句")表示对数据进行查询、添加、更新和删除的操作。在MyBatis中使用注解//添加作者@Insert("InsertintoAuthor(username,password,email,address,phone)"+"values(#{username},#{password},#{email},#{address},#{phone})")@Options(useGeneratedKeys=true,flushCache=false,timeout=10000)publicvoidaddAuthor(Authorauthor);

//删除作者@Delete("deletefromauthorwhereid=#{id}")@Options(flushCache=false,timeout=10000)publicvoiddeleteAuthor(@Param("id")intid);

常规注解使用(不需要自定义map的操作):调用方法前需要注册映射器:sessionFactory.getConfiguration().addMapper(TestInteger.class);或者在mapper.xml中配置<mapperclass="映射器接口路径"></mapper>注册之后再获取mapper接口正常调用

在MyBatis中使用注解//查询所有作者信息@Select("select*fromauthor")@Options(flushCache=false,timeout=10000,useCache=true)@Results( value={ @Result(id=true,column="id",property="id"), @Result(property="username",column="username"), @Result(property="password",column="password"), @Result(property="email",column="email"), @Result(property="address",column="address"), @Result(property="phone",column="phone") })publicList<Author>findAuthors();

有需要自定义map的情况可以使用Results注解:在MyBatis中使用注解//查询某作者信息@Select("select*fromauthorwhereid=#{id}")@Options(flushCache=false,timeout=10000,useCache=true)@Results( value={ @Result(id=true,column="id",property="id"), @Result(property="username",column="username"), @Result(property="password",column="password"), @Result(property="email",column="email"), @Result(property="address",column="address"), @Result(property="phone",column="phone") })publicAuthorfindAuthorById(@Param("id")intid);

在MyBatis中使用注解如果多个查询返回的结果集结构都一样,可以使用@ResultMap定义返回结构,使用该注解,你将不得不在你的映射文件中配置你的resultMap,而@ResultMap(value="名")即为映射文件中的resultMapID如此一来,你需要在<mapper>中注册你的配置文件,在接口中使用@ResultMap来引用配置文件中的resultMapID如下:SelfMapper.xml<resultMaptype="java.util.HashMap"//每行记录是一个hashmap id="selfMap"> <resultproperty="n"column="city_name"/>...............</resultMap>SelfMapper.java:@Select("selecta.id,,c.statefrom...........") @ResultMap(value="selfMap") publicList<HashMap>sel();//注意,返回的是List集合在MyBatis中使用注解使用注解时,如何动态构建SQL语句?在MyBatis中使用注解使用注解构造动态SQL需要借助一个继承了SqlBuilder自定义类,在类中自定义方法,但要求方法返回String类型,返回的是构造之后的完整SQL语句:例如:publicclassAuthorSqlBuilderextendsSqlBuilder{ //返回修改的sql语句 publicStringupdateAuthorSql(){

BEGIN();

UPDATE("author");

SET("username=#{username}");//#{}中的还是参数的key或则属性

SET("password=#{password}");

SET("email=#{email}");

SET("address=#{address}");

SET("phone=#{phone}");

WHERE("id=#{id}"); returnSQL(); }}定义之后在接口方法上用UpdateProvider注解引用:@UpdateProvider(type=AuthorSqlBuilder.class,method="updateAuthorSql")其实在自定类中无非是定义一个字符串传递到后台执行,那么如果对update(),set()这些内置的方法不熟悉,完全可以自定义SQL语句,例如Stringsql="update........";returnsql测试注解使用//获取SqlSession工厂SqlSessi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论