《MyBatis高级特性(理论).ppt》由会员分享,可在线阅读,更多相关《MyBatis高级特性(理论).ppt(23页珍藏版)》请在金锄头文库上搜索。
1、第第5章章MyBatis高级特性高级特性本章内容本章内容uMybatis缓存缓存u使用存储过程使用存储过程u注解注解本章目标本章目标u理解理解Mybatis缓存原理缓存原理u掌握掌握Mybatis调用存储过程调用存储过程u了解了解Mybatis中的注解配置中的注解配置Mybatis的缓存机制的缓存机制u缓存技术是一种缓存技术是一种“以空间换时间以空间换时间”的设计理念,是利用内存空间资源来的设计理念,是利用内存空间资源来提高数据检索速度的有效手段之一。提高数据检索速度的有效手段之一。uMyBatis包含一个非常强大的查询缓存特性,可以非常方便地配置和包含一个非常强大的查询缓存特性,可以非常方便
2、地配置和定制。定制。nMyBatis默认没有开启缓存,除了局部的session缓存。要开启二级缓存,需要在SQL映射文件中添加。n缓存作用缓存作用n映射语句文件中的所有select语句将会被缓存。n映射语句文件中的所有insert、update和delete语句会刷新缓存。n缓存会使用LeastRecentlyUsed(LRU,最近最少使用的)算法收回。n根据时间表(如noFlushInterval,没有刷新间隔),缓存不会以任何时间顺序来刷新。n缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。n缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,
3、而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改Mybatis的缓存机制的缓存机制n添加缓存n在mybatis-config.xml中配置全局缓存nn/默认为falsenn在SQL映射文件中添加nn该代码创建了一个该代码创建了一个FIFO缓存,并每隔缓存,并每隔60秒刷新,存放结果对象或列表的秒刷新,存放结果对象或列表的512个引用,且返个引用,且返回的对象被认为是只读的,因此,在不同线程中的调用者之间修改它们会导致冲突。回的对象被认为是只读的,因此,在不同线程中的调用者之间修改它们会导致冲突。属性名称属性名称描述描述eviction可用资源的回收策略,主要包括以下几种:LR
4、U:较少使用的、移除最长时间不被使用的对象。FIFO(先进先出):按对象进入缓存的顺序将其移除。SOFT(软引用):移除基于垃圾回收器状态和软引用规则的对象。WEAK(弱引用):积极地移除基于垃圾收集器状态和弱引用规则的对象。默认为LRUflushInterval刷新间隔,可以被设置为任意的正整数,它们代表一个合理的毫秒形式的时间段。默认情况下不设置,即没有刷新间隔,缓存仅在调用语句时刷新size引用数目,可以被设置为任意正整数,要牢记缓存的对象数目和运行环境的可用内存资源数目。默认值为1024readOnly只读属性可以被设置为true或false。只读的缓存设置会给所有调用者返回缓存对象的
5、相同实例。因此这些对象不能被修改。此处提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这样较为缓慢,但比较安全,因此默认为false存储过程的使用存储过程的使用u存储过程的优点:存储过程的优点:(1)存储过程只在创造时进行编译,以后每次执行存储过程都无须重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。(2)当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query和Delete时),可将此复杂操作用存储过程封装起来,还可与数据库提供的事务处理一同使用。(3)存储过程可以重复使用,可减少数据库开发人员的工作量。(4
6、)安全性高,可设定只有某些用户才具有对指定存储过程的使用权。在在Mybatis中使用存储过程中使用存储过程u在配置中添加如下语法格式:在配置中添加如下语法格式:/该方法的参数为该方法的参数为map集合集合在在Mybatis中使用存储过程中使用存储过程u接口中调用方法:npublicvoidgetBlogCountByName(HashMapmap);u调用的方法:nHashMapmap=newHashMap();/声明一个nmap.put(name,襄);/第一个参数,由于第二个参数是输出型,所以不设置ncm.callProc(map);/调用时传参nStringout=map.get(cou
7、ntnum).toString();/countnum为select中配置的名字,而不是存储过程的输出参数属性名u注意调用输出型存储过程的方法不能使用缓存,如果你在mapper中设置的有全局缓存,可以在节点中设置useCache=false表示此查询不使用缓存。在在Mybatis中使用存储过程中使用存储过程(1)在)在SQLSERVER中创建如下存储过程:中创建如下存储过程:createprocedureproc_getBlogCountByAuthor(usernamevarchar(50),blogCountintoutput)asbegindeclareauthor_idint;sele
8、ctauthor_id=IDfromauthorwhereusername=username;selectblogCount=COUNT(ID)fromblogwhereauthor_id=author_id;end;在在Mybatis中使用存储过程中使用存储过程(2)在在BlogMapper.xml文件中添加如下配置信息:文件中添加如下配置信息:在在Mybatis中使用存储过程中使用存储过程u在在Mybatis中编写中编写Java代码调用存储过程,代码如下:代码调用存储过程,代码如下:publicstaticvoidmain(Stringargs)SqlSessionsqlSession=M
9、yBatisUtil.getSqlSessionFactory().openSession();/创建map类型参数Mapparams=newHashMap();params.put(username,张伟杰);/调用存储过程sqlSession.selectOne(getBlogCountByName,params);intcount=(Integer)params.get(blogCount);System.out.println(count);注解配置注解配置uMyBatis3构建在基于全面且强大的构建在基于全面且强大的Java配置配置API上。该配置上。该配置API是是基于基于XML的
10、的MyBatis配置的基础,也是新的基于注解配置的基础。配置的基础,也是新的基于注解配置的基础。u注解提供了一种简单的方式来实现简单映射语句,而不会引入大量注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。的开销。umybatis注解注解:注解注解目标目标对应的对应的XML标签标签CacheNamespace类CacheNamespaceRef类Results方法Result方法One方法Many方法InsertUpdateDelete方法注解配置注解配置uMybatis中常用的注解中常用的注解注解注解目标目标对应的对应的XML标签标签InsertProviderUpdateP
11、roviderDeleteProviderSelectProvider方法允许创建动态SQLParam参数N/AOptions方法映射语句的属性在在MyBatis中使用注解中使用注解uCacheNamespace(size=512):定义在该命名空间内允许使用内置缓:定义在该命名空间内允许使用内置缓存存uOptions(useCache=true,flushCache=false,timeout=10000):一些查询的选项开关一些查询的选项开关uParam(id):全局限定别名,定义查询参数在:全局限定别名,定义查询参数在sql语句中的位置不再是语句中的位置不再是顺序下标顺序下标0,1,2,
12、3.的形式,而是对应名称,该名称在此处定义。的形式,而是对应名称,该名称在此处定义。uResults是以是以Result为元素的数组,为元素的数组,Result表示单条属性表示单条属性字段字段的映射关系,的映射关系,id=true表示该表示该id字段是主键,查询时字段是主键,查询时mybatis会给予必要会给予必要的优化。数组中所有的的优化。数组中所有的Result组成了单个记录的映射关系,而组成了单个记录的映射关系,而Results则是单个记录的集合。另外,还有一个非常重要的注解则是单个记录的集合。另外,还有一个非常重要的注解ResultMap,其与,其与Results类似类似uSelect
13、(查询语句查询语句)、Insert(增加语句增加语句)、Update(更新语句更新语句)和和Delete(删除语句删除语句)表示对数据进行查询、添加、更新和删除的操作。表示对数据进行查询、添加、更新和删除的操作。在在MyBatis中使用注解中使用注解/添加作者Insert(InsertintoAuthor(username,password,email,address,phone)+values(#username,#password,#email,#address,#phone)Options(useGeneratedKeys=true,flushCache=false,timeout=10
14、000)publicvoidaddAuthor(Authorauthor);/删除作者Delete(deletefromauthorwhereid=#id)Options(flushCache=false,timeout=10000)publicvoiddeleteAuthor(Param(id)intid);常规注解使用常规注解使用(不需要自定义不需要自定义map的操作的操作):调用方法前需要注册映射器:sessionFactory.getConfiguration().addMapper(TestInteger.class);或者在mapper.xml中配置注册之后再获取mapper接口正
15、常调用在在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(prop
16、erty=address,column=address),Result(property=phone,column=phone)publicListfindAuthors();有需要自定义有需要自定义map的情况可以使用的情况可以使用Results注解注解:在在MyBatis中使用注解中使用注解/查询某作者信息Select(select*fromauthorwhereid=#id)Options(flushCache=false,timeout=10000,useCache=true)Results(value=Result(id=true,column=id,property=id),Res
17、ult(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中使用注解中使用注解如果多个查询返回的结果集结构都一样,可以使用如果多个查询返回的结果集结构都一样,可以使用Re
18、sultMap定义返回结构,定义返回结构,使用该注解,你将不得不在你的映射文件中配置你的使用该注解,你将不得不在你的映射文件中配置你的resultMap,而,而ResultMap(value=名名)即为映射文件中的即为映射文件中的resultMapID如此一来,你需要在如此一来,你需要在中注册你的配置文件,在接口中使用中注册你的配置文件,在接口中使用ResultMap来引用配置文件中的来引用配置文件中的resultMapID如下如下:SelfMapper.xml.SelfMapper.java:Select(selecta.id,b.name,c.statefrom.)ResultMap(va
19、lue=selfMap)publicListsel();/注意,返回的是List集合在在MyBatis中使用注解中使用注解使用注解时,如何动态构建SQL语句?在在MyBatis中使用注解中使用注解使用注解构造动态SQL需要借助一个继承了SqlBuilder自定义类,在类中自定义方法,但要求方法返回String类型,返回的是构造之后的完整SQL语句:例如:publicclassAuthorSqlBuilderextendsSqlBuilder/返回修改的sql语句publicStringupdateAuthorSql()BEGIN();UPDATE(author);SET(username=#u
20、sername);/#中的还是参数的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(),
21、set()这些内置的方法不熟悉,完全可以自定义这些内置的方法不熟悉,完全可以自定义SQL语句,例如语句,例如Stringsql=update.;returnsql测试注解使用测试注解使用/获取SqlSession工厂SqlSessionFactoryfactory=MyBatisUtil.getSqlSessionFactory();/注册映射器接口注册映射器接口factory.getConfiguration().addMapper(AuthorMapper.class);/获取SqlSession对象SqlSessionsqlSession=factory.openSession();/获
22、取映射器AuthorMapperauthorMapper=sqlSession.getMapper(AuthorMapper.class);Authorauthor=newAuthor();author.setId(7);author.setUsername(李星星);author.setPassword(abcdefg);author.setEmail();author.setAddress(中国台湾);author.setPhone(13988881111);authorMapper.updateAuthor(author);sqlSmit();总结总结uMybatis使用使用标签来设置缓
23、存,通过设置缓存可以提高数据标签来设置缓存,通过设置缓存可以提高数据操作的效率,该标签有如下属性:操作的效率,该标签有如下属性:(1)eviction:设置可用资源的回收策略。(2)flushInterval:刷新间隔。(3)size:引用数目。(4)readOnly:引用对象是否只读。uMybatis能很方便地调用存储过程,调用的配置语法格式为:能很方便地调用存储过程,调用的配置语法格式为:返回参数=Call存储过程名称(参数1,参数2.)u在在Mybatis中使用注解配置时,无须创建中使用注解配置时,无须创建SQL映射配置文件就可以实映射配置文件就可以实现对数据的操作。在使用时要先注册映射器。现对数据的操作。在使用时要先注册映射器。