资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 MyBatis高级特性,本章内容,Mybatis缓存 使用存储过程 注解,本章目标,理解Mybatis缓存原理 掌握Mybatis调用存储过程 了解Mybatis中的注解配置,Mybatis的缓存机制,缓存技术是一种“以空间换时间”的设计理念,是利用内存空间资源来提高数据检索速度的有效手段之一。 MyBatis包含一个非常强大的查询缓存特性,可以非常方便地配置和定制。 MyBatis默认没有开启缓存,除了局部的session缓存。要开启二级缓存,需要在SQL映射文件中添加 。 缓存作用 映射语句文件中的所有select 语句将会被缓存。 映射语句文件中的所有insert、update和delete语句会刷新缓存。 缓存会使用Least Recently Used(LRU,最近最少使用的)算法收回。 根据时间表(如no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。 缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改,Mybatis的缓存机制,添加缓存 在mybatis-config.xml中配置全局缓存 /默认为false 在SQL映射文件中添加 该代码创建了一个FIFO缓存,并每隔60秒刷新,存放结果对象或列表的512个引用,且返回的对象被认为是只读的,因此,在不同线程中的调用者之间修改它们会导致冲突。,存储过程的使用,存储过程的优点: (1)存储过程只在创造时进行编译,以后每次执行存储过程都无须重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 (2)当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query和Delete时),可将此复杂操作用存储过程封装起来,还可与数据库提供的事务处理一同使用。 (3)存储过程可以重复使用,可减少数据库开发人员的工作量。 (4)安全性高,可设定只有某些用户才具有对指定存储过程的使用权。,在Mybatis中使用存储过程,在配置中添加如下语法格式: /该方法的参数为map集合 ,在Mybatis中使用存储过程,接口中调用方法: public void getBlogCountByName(HashMap map); 调用的方法: HashMap map=new HashMap();/声明一个 map.put(“name“, “襄“);/第一个参数,由于第二个参数是输出型,所以不设置 cm.callProc(map);/调用时传参 String out=map.get(“countnum“).toString();/countnum为select中配置的名字,而不是存储过程的输出参数属性名 注意调用输出型存储过程的方法不能使用缓存,如果你在mapper中设置的有全局缓存,可以在节点中设置useCache=“false“表示此查询不使用缓存。,在Mybatis中使用存储过程,(1)在SQL SERVER中创建如下存储过程: create procedure proc_getBlogCountByAuthor(username varchar(50), blogCount int output) as begin declare author_id int; select author_id = ID from author where username = username; select blogCount = COUNT(ID) from blog where author_id = author_id; end;,在Mybatis中使用存储过程,(2) 在BlogMapper.xml文件中添加如下配置信息: ,在Mybatis中使用存储过程,在Mybatis中编写Java代码调用存储过程,代码如下: public static void main(String args) SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); /创建map类型参数 Map params = new HashMap(); params.put(“username“, “张伟杰“); /调用存储过程 sqlSession.selectOne(“getBlogCountByName“,params); int count = (Integer)params.get(“blogCount“); System.out.println(count); ,注解配置,MyBatis 3构建在基于全面且强大的Java配置API上。该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础。 注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。 mybatis注解:,注解配置,Mybatis中常用的注解,在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(“Insert into Author(username,password,email,address,phone) “ + “values(#username,#password,#email,#address,#phone)“) Options(useGeneratedKeys=true,flushCache = false, timeout = 10000) public void addAuthor(Author author);,/删除作者 Delete(“delete from author where id = #id“) Options(flushCache = false, timeout = 10000) public void deleteAuthor(Param(“id“) int id);,常规注解使用(不需要自定义map的操作):,调用方法前需要注册映射器:sessionFactory.getConfiguration().addMapper(TestInteger.class); 或者在mapper.xml中配置 注册之后再获取mapper接口正常调用,在MyBatis中使用注解,/查询所有作者信息 Select(“select * from author“) 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“) ) public List findAuthors();,有需要自定义map的情况可以使用Results注解:,在MyBatis中使用注解,/查询某作者信息 Select(“select * from author where id = #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“) ) public Author findAuthorById(Param(“id“) int id);,在MyBatis中使用注解,如果多个查询返回的结果集结构都一样,可以使用ResultMap定义返回结构,使用该注解,你将不得不在你的映射文件中配置你的resultMap,而ResultMap(value = “名“)即为映射文件中的resultMap ID 如此一来,你需要在中注册你的配置文件,在接口中使用ResultMap来引用配置文件中的resultMap ID 如下: SelfMapper.xml . SelfMapper.java: Select(“select a.id,b.name,c.state from .“) ResultMap(value=“selfMap“) public List sel();/注意,返回的是List集合,在MyBatis中使用注解,使用注解时,如何动态构建SQL语句?,在MyBatis中使用注解,使用注解构造动态SQL需要借助一个继承了SqlBuilder 自定义类,在类中自定义方法,但要求方法返回String类型,返回的是构造之后的完整SQL语句:例如:public class AuthorSqlBuilder extends SqlBuilder /返回修改的sql语句 public String updateAuthorSql( ) BEGIN(); UPDATE(“author“); SET(“username = #username“); /#中的还是参数的key或则属性 SET(“password = #password“); SET(“email = #email“); SET(“address = #address“); SET(“phone = #phone“); WHERE(“id = #id“); return SQL( ); 定义之后在接口方法上用UpdateProvider注解引用: UpdateProvider(type=AuthorSqlBuilder.class,method=“updateAuthorSql“) 其实在自定类中
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号