一、创建数据库

1.1、建立数据库

/*
SQLyog Enterprise v12.09 (64 bit)
MySQL - 5.7.9-log : Database - mybatis
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `mybatis`;/*Table structure for table `author` */DROP TABLE IF EXISTS `author`;CREATE TABLE `author` (`author_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '作者ID主键',`author_username` varchar(30) NOT NULL COMMENT '作者用户名',`author_password` varchar(32) NOT NULL COMMENT '作者密码',`author_email` varchar(50) NOT NULL COMMENT '作者邮箱',`author_bio` varchar(1000) DEFAULT '这家伙很赖,什么也没留下' COMMENT '作者简介',`register_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',PRIMARY KEY (`author_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;/*Data for the table `author` */insert  into `author`(`author_id`,`author_username`,`author_password`,`author_email`,`author_bio`,`register_time`) values (1,'张三','123456','123@qq.com','张三是个新手,刚开始注册','2015-10-29 10:23:59'),(2,'李四','123asf','lisi@163.com','魂牵梦萦 ','2015-10-29 10:24:29'),(3,'王五','dfsd342','ww@sina.com','康熙王朝','2015-10-29 10:25:23'),(4,'赵六','123098sdfa','zhaoliu@qq.com','花午骨','2015-10-29 10:26:09'),(5,'钱七','zxasqw','qianqi@qq.com','这家伙很赖,什么也没留下','2015-10-29 10:27:04'),(6,'张三丰','123456','zhangsf@qq.com','这家伙很赖,什么也没留下','2015-10-29 11:48:00'),(7,'张无忌','qwertyuiop','wuji@163.com','这家伙很赖,什么也没留下','2015-10-29 11:48:24'),(8,'fdsf','ffff','fdsfds',NULL,NULL),(9,'fdsf','ffff','fdsfds',NULL,NULL),(10,'aaaa','bbbb','ddd@qq.com','这家伙很赖,什么也没留下','2015-10-29 22:07:45');/*Table structure for table `blog` */DROP TABLE IF EXISTS `blog`;CREATE TABLE `blog` (`blog_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'BlogId主键',`blog_title` varchar(255) NOT NULL COMMENT 'blog标题',`author_id` int(11) unsigned NOT NULL COMMENT '作者ID外键',PRIMARY KEY (`blog_id`),KEY `fk_author_id` (`author_id`),CONSTRAINT `fk_author_id` FOREIGN KEY (`author_id`) REFERENCES `author` (`author_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `blog` */insert  into `blog`(`blog_id`,`blog_title`,`author_id`) values (1,'小张的Blog',1),(2,'小李',2),(3,'王五不是人',3),(4,'赵地人',4),(5,'钱钱钱',5);/*Table structure for table `posts` */DROP TABLE IF EXISTS `posts`;CREATE TABLE `posts` (`post_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章主键ID',`post_subject` varchar(255) NOT NULL COMMENT '文章主题,标题',`post_body` text NOT NULL COMMENT '文章内容最大3000个字符',`blog_id` int(11) unsigned NOT NULL COMMENT 'Blog主键做外键',`createtime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '文章创建时间',PRIMARY KEY (`post_id`),KEY `fk_blog_id` (`blog_id`),CONSTRAINT `fk_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `blog` (`blog_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;/*Data for the table `posts` */insert  into `posts`(`post_id`,`post_subject`,`post_body`,`blog_id`,`createtime`) values (1,'Mybatis入门一','什么是 MyBatis ?\r\nMyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。',1,'2015-10-29 10:32:21'),(2,'Mybatis入门二','要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。',1,'2015-10-29 10:32:52'),(3,'Oracle学习','Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统',2,'2015-10-29 10:33:26'),(4,'JAVA学习一','Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称',3,'2015-10-29 10:34:17'),(5,'PL/SQL','PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展',4,'2015-10-29 10:37:52'),(6,'CSS标签选择器','标签选择器\r\nID选择器\r\n类选择器\r\n特殊选择器',5,'2015-10-29 10:39:44'),(7,'javascript','js:是前端脚本语言',2,'2015-10-29 10:40:18');/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

数据表和数据

二、创建项目

2.1、创建项目

三、建立实体类与Mapper接口

3.1、3个实体类

package com.pb.mybatis.po;import java.util.Date;/*** * @ClassName: Author* @Description: TODO(作者)* @author 刘楠* @date 2015-10-31 下午12:39:33**/
public class Author {//作者idprivate Integer authorId;//作者姓名private String authorUserName;//作者密码private String authorPassword;//作者邮箱private String authorEmail;//作者介绍private String authroBio;//注册时间private Date registerTime;public Integer getAuthorId() {return authorId;}public void setAuthorId(Integer authorId) {this.authorId = authorId;}public String getAuthorUserName() {return authorUserName;}public void setAuthorUserName(String authorUserName) {this.authorUserName = authorUserName;}public String getAuthorPassword() {return authorPassword;}public void setAuthorPassword(String authorPassword) {this.authorPassword = authorPassword;}public String getAuthorEmail() {return authorEmail;}public void setAuthorEmail(String authorEmail) {this.authorEmail = authorEmail;}public String getAuthroBio() {return authroBio;}public void setAuthroBio(String authroBio) {this.authroBio = authroBio;}public Date getRegisterTime() {return registerTime;}public void setRegisterTime(Date registerTime) {this.registerTime = registerTime;}@Overridepublic String toString() {return "Author [authorId=" + authorId + ", authorUserName="+ authorUserName + ", authorPassword=" + authorPassword+ ", authorEmail=" + authorEmail + ", authroBio=" + authroBio+ ", registerTime=" + registerTime + "]";}}

package com.pb.mybatis.po;import java.util.List;public class Blog {//Blog,IDprivate Integer blogId;//Blog 名称标题private String blogTitle;//外键authorId//作者private Author author;//文章 列表private Integer authorId;//文章列表private List<Posts> postsList;public Integer getBlogId() {return blogId;}public void setBlogId(Integer blogId) {this.blogId = blogId;}public String getBlogTitle() {return blogTitle;}public void setBlogTitle(String blogTitle) {this.blogTitle = blogTitle;}public Author getAuthor() {return author;}public void setAuthor(Author author) {this.author = author;}public Integer getAuthorId() {return authorId;}public void setAuthorId(Integer authorId) {this.authorId = authorId;}public List<Posts> getPostsList() {return postsList;}public void setPostsList(List<Posts> postsList) {this.postsList = postsList;}@Overridepublic String toString() {return "Blog [blogId=" + blogId + ", blogTitle=" + blogTitle+  ", authorId=" + authorId + "]";}}

package com.pb.mybatis.po;import java.util.Date;public class Posts {//文章IDprivate Integer postId;//文章标题private String postTitle;//文章主体内容private String postBody;//外键private Integer blogId;//建立时间private Date createTime;public Integer getPostId() {return postId;}public void setPostId(Integer postId) {this.postId = postId;}public String getPostTitle() {return postTitle;}public void setPostTitle(String postTitle) {this.postTitle = postTitle;}public String getPostBody() {return postBody;}public void setPostBody(String postBody) {this.postBody = postBody;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Integer getBlogId() {return blogId;}public void setBlogId(Integer blogId) {this.blogId = blogId;}@Overridepublic String toString() {return "Posts [postId=" + postId + ", postTitle=" + postTitle+ ", postBody=" + postBody + ", createTime=" + createTime+ ", blogId=" + blogId + "]";}}

3.2、3个接口

package com.pb.mybatis.mapper;import com.pb.mybatis.po.Author;public interface AuthorMapper {/*** * @Title: findAuthorById* @Description: TODO(根据id查找)* @param @param id* @param @return    设定文件* @return Author    返回类型* @throws*/public Author findAuthorById(int id);
}

package com.pb.mybatis.mapper;import com.pb.mybatis.po.Blog;public interface BlogMapper {/*** * @Title: findBlogById* @Description: TODO(根据BLOGID查找BLOG,并关联author,与posts实现延时加载)* @param @param id* @param @return    设定文件* @return Blog    返回类型* @throws*/public Blog findBlogById(int blogId);}

package com.pb.mybatis.mapper;import java.util.List;import com.pb.mybatis.po.Posts;public interface PostsMapper {/*** * @Title: findPostsByBlogId* @Description: TODO(根据BLOGID查找文章列表)* @param @param blogId* @param @return    设定文件* @return List<Posts>    返回类型* @throws*/public List<Posts> findPostsByBlogId(int blogId);
}

四、建立mapper.xml与confinguration.xml

4.1、相对应的mapper.xml

AuthorMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pb.mybatis.mapper.AuthorMapper">
<!--映射作者Author  -->
<resultMap type="Author" id="authorResultMap">
<id property="authorId" column="author_id"/>
<result property="authorUserName" column="author_username"/>
<result property="authorPassword" column="author_password"/>
<result property="authorEmail" column="author_email"/>
<result property="authroBio" column="author_bio"/>
<result property="registerTime" column="register_time"/>
</resultMap>
<!-- 根据ID查找 -->
<select id="findAuthorById" parameterType="int" resultMap="authorResultMap">
select * from author
where author_id=#{id}
</select>
</mapper>

BlogMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pb.mybatis.mapper.BlogMapper">
<!--Blog映射  -->
<resultMap type="Blog" id="blogResultMap">
<!--Blog映射  -->
<id property="blogId" column="blog_id"/>
<result property="blogTitle" column="blog_title"/>
<result property="authorId" column="author_id"/><!--一对一  -->
<association property="author" javaType="Author" column="author_id" select="com.pb.mybatis.mapper.AuthorMapper.findAuthorById"/>
<!--关联作者
外键
column:外键
select:引用Authro的namespace.方法
--><!--一对多  ofType属性指定集合中元素的对象类型。-->
<collection property="postsList"  ofType="Posts" javaType="ArrayList"  column="blog_id" select="com.pb.mybatis.mapper.PostsMapper.findPostsByBlogId"/>
</resultMap><!-- 根据ID查找 -->
<select id="findBlogById" parameterType="int" resultMap="blogResultMap">
SELECT * FROM blog
WHERE blog_id=#{blogId}
</select>
</mapper>

PostsMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pb.mybatis.mapper.PostsMapper">
<!--映射作者文章  -->
<resultMap type="Posts" id="postsResultMap">
<id property="postId" column="post_id"/>
<result property="postTitle" column="post_subject"/>
<result property="postBody" column="post_body"/>
<result property="blogId" column="blog_id"/>
<result property="createTime" column="createtime"/>
</resultMap>
<!-- 根据ID查找 -->
<select id="findPostsByBlogId" parameterType="int" resultMap="postsResultMap">
select * from posts
where blog_id=#{blogId}
</select>
</mapper>

4.2、configuration.xml

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?character=utf8
username=root
password=root

开启延时加载,同时关闭立即加载

<settings>
<!--开启延时加载  -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭立即加载  -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--资源文件  -->
<properties resource="db.properties"/><settings>
<!--开启延时加载  -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭立即加载  -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- 别名  -->
<typeAliases>
<!-- <typeAlias type="com.pb.mybatis.po.User" alias="User"/> -->
<package name="com.pb.mybatis.po"/>
</typeAliases>
<!--配置  --><environments default="development">
<environment id="development"><!--事务  --><transactionManager type="JDBC"/><!--数据源  --><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource>
</environment>
</environments>
<mappers><package name="com.pb.mybatis.mapper"/>
</mappers>
</configuration>

五、测试

5.1、JUNIT

package com.pb.mybatis.mapper;import java.io.InputStream;
import java.util.List;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import com.pb.mybatis.po.Blog;
import com.pb.mybatis.po.Posts;public class BlogMapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {String config="configuration.xml";InputStream resource=Resources.getResourceAsStream(config);sqlSessionFactory=new SqlSessionFactoryBuilder().build(resource);}/*** * @Title: testFindBlogs* @Description: TODO(延时加载)* @param     设定文件* @return void    返回类型* @throws*/@Testpublic void testFindBlogById() {//建立会话SqlSession sqlSession=sqlSessionFactory.openSession();//获取Mapper接口对象BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);//调用Mapper方法 Blog blog=blogMapper.findBlogById(1);System.out.println(blog.getBlogId()+"..."+blog.getBlogTitle());System.out.println("===========开始延时加载作者Author===========");System.out.println(blog.getAuthor());System.out.println("===========开始延时加载文章===========");List<Posts> list=blog.getPostsList();/*int count=0;for(Posts p:list){System.out.println("count+"+count++);System.out.println(p.getPostId());System.out.println(p.getPostTitle());System.out.println(p.getPostBody());System.out.println(p.getCreateTime());System.out.println(p.getBlogId());}*/}}

结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM blog WHERE blog_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
1...小张的Blog
===========开始延时加载作者Author===========
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
Author [authorId=1, authorUserName=张三, authorPassword=123456, authorEmail=123@qq.com, authroBio=张三是个新手,刚开始注册, registerTime=Thu Oct 29 10:23:59 CST 2015]
===========开始延时加载文章===========
DEBUG [main] - ==>  Preparing: select * from posts where blog_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 2

六、一级缓存

6.1、mybatis一级缓存

mybatis,默认开启了一级缓存,sqlSession中默认有一个hashMap

当查询时,先去hashMap中查找,

如果有就直接,取出,不再操作数据库

如果没有就去数据库查找,并放在haspMap中

当做事物时,如添加,删除,修改,后有commit时会清空一级缓存

sqlSession是互不影响的,一级缓存

6.2、还是上级的例子

测试:查询用户

package com.pb.mybatis.mapper;import static org.junit.Assert.*;import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import com.pb.mybatis.po.Author;public class AuthorMapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {String config="configuration.xml";InputStream resource=Resources.getResourceAsStream(config);sqlSessionFactory=new SqlSessionFactoryBuilder().build(resource);}@Testpublic void testFindAuthorById() {//获取会话工厂SqlSession sqlSession=sqlSessionFactory.openSession();AuthorMapper authorMapper=sqlSession.getMapper(AuthorMapper.class);//第一次查询Author author1=authorMapper.findAuthorById(2);System.out.println(author1);//再次查询同样的Author author2=authorMapper.findAuthorById(2);System.out.println(author2);//再次查询不的同样的Author author3=authorMapper.findAuthorById(4);System.out.println(author3);}}

结果:

DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
Author [authorId=2, authorUserName=李四, authorPassword=123asf, authorEmail=lisi@163.com, authroBio=魂牵梦萦 , registerTime=Thu Oct 29 10:24:29 CST 2015]
Author [authorId=2, authorUserName=李四, authorPassword=123asf, authorEmail=lisi@163.com, authroBio=魂牵梦萦 , registerTime=Thu Oct 29 10:24:29 CST 2015]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 4(Integer)
DEBUG [main] - <==      Total: 1
Author [authorId=4, authorUserName=赵六, authorPassword=123098sdfa, authorEmail=zhaoliu@qq.com, authroBio=花午骨, registerTime=Thu Oct 29 10:26:09 CST 2015]

6.3、当查询后,做事务,再查询第一次的

接口中做添加方法

/*** * @Title: addAuthor* @Description: TODO(添加)* @param @param author* @param @return    设定文件* @return int    返回类型* @throws*/public int addAuthor(Author author);

mapper.xml中做同样的select

<!--添加  -->
<insert id="addAuthor" parameterType="Author" useGeneratedKeys="true" keyProperty="authorId">
INSERT INTO author(author_username,author_password,author_email,author_bio)
VALUES(#{authorUserName},#{authorPassword},#{authorEmail},#{authroBio})
</insert>

测试

package com.pb.mybatis.mapper;import static org.junit.Assert.*;import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import com.pb.mybatis.po.Author;public class AuthorMapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {String config="configuration.xml";InputStream resource=Resources.getResourceAsStream(config);sqlSessionFactory=new SqlSessionFactoryBuilder().build(resource);}@Testpublic void testFindAuthorById() {//获取会话工厂SqlSession sqlSession=sqlSessionFactory.openSession();AuthorMapper authorMapper=sqlSession.getMapper(AuthorMapper.class);//第一次查询Author author1=authorMapper.findAuthorById(2);System.out.println(author1);System.out.println("=======下面有事务处理========");Author newAuthor=new Author();newAuthor.setAuthorEmail("qq.com@qq.com");newAuthor.setAuthorPassword("fdsfds");newAuthor.setAuthorUserName("郭靖");newAuthor.setAuthroBio("射雕英雄传");int num=authorMapper.addAuthor(newAuthor);sqlSession.commit();System.out.println(newAuthor.getAuthorId());System.out.println("num="+num);System.out.println("再次查询");//再次查询同样的Author author2=authorMapper.findAuthorById(2);System.out.println(author2);}}

结果:

DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
Author [authorId=2, authorUserName=李四, authorPassword=123asf, authorEmail=lisi@163.com, authroBio=魂牵梦萦 , registerTime=Thu Oct 29 10:24:29 CST 2015]
=======下面有事务处理========
DEBUG [main] - ==>  Preparing: INSERT INTO author(author_username,author_password,author_email,author_bio) VALUES(?,?,?,?)
DEBUG [main] - ==> Parameters: 郭靖(String), fdsfds(String), qq.com@qq.com(String), 射雕英雄传(String)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42bb0406]
11
num=1
再次查询
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
Author [authorId=2, authorUserName=李四, authorPassword=123asf, authorEmail=lisi@163.com, authroBio=魂牵梦萦 , registerTime=Thu Oct 29 10:24:29 CST 2015]

七、二级缓存

7.1、mybatis二级缓存与一级缓存

sqlSession是互不影响的,一级缓存

Mapper(namespace)是二级缓存

多个sqlSession可以共享一个Mapper的二级缓存区域

二级缓存按namespace分,其它的mapper也有自己的二级缓存区域namespace

第一个namespace的mapper都有一个二级缓存区域,2个mapper的namespace如果相同,这2个mapper执行sql查询数据将存在相同的二级缓存区域中.

 

7.2、开启二级缓存

1.二级缓存是mapper范围级别的,除了在configuration.xml设置二级缓存的总开关,还在在个体的mapper.xml中开启二级缓存

<settings>
<!--开启延时加载  -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭立即加载  -->
<setting name="aggressiveLazyLoading" value="false"/>
<!--开启二级缓存  -->
<setting name="cacheEnabled" value="true" />
</settings>

2.mapper对就的pojo类,实现序列化

3.在authorMapper中开启二级缓存

<!--开启本mapper下的二级缓冲  -->
<cache />

7.3、测试

@Testpublic void testCache() {// 获取会话工厂SqlSession sqlSession1 = sqlSessionFactory.openSession();AuthorMapper authorMapper1 = sqlSession1.getMapper(AuthorMapper.class);// 第一次查询Author author1 = authorMapper1.findAuthorById(2);//必须关闭不数据无法写到缓存区域
        sqlSession1.close();// 获取会话工厂/*SqlSession sqlSession2 = sqlSessionFactory.openSession();AuthorMapper authorMapper2 = sqlSession2.getMapper(AuthorMapper.class);sqlSession2.close();*/// 获取会话工厂SqlSession sqlSession3 = sqlSessionFactory.openSession();AuthorMapper authorMapper3 = sqlSession3.getMapper(AuthorMapper.class);// 第一次查询Author author3 = authorMapper3.findAuthorById(2);sqlSession3.close();}

DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 873769339.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Returned connection 873769339 to pool.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.5

中间增加commit操作

@Testpublic void testCache() {// 获取会话工厂SqlSession sqlSession1 = sqlSessionFactory.openSession();AuthorMapper authorMapper1 = sqlSession1.getMapper(AuthorMapper.class);// 第一次查询Author author1 = authorMapper1.findAuthorById(2);//必须关闭不数据无法写到缓存区域
        sqlSession1.close();// 获取会话工厂SqlSession sqlSession2 = sqlSessionFactory.openSession();AuthorMapper authorMapper2 = sqlSession2.getMapper(AuthorMapper.class);Author author2 = authorMapper2.findAuthorById(2);//更新author2.setAuthorUserName("董事长");author2.setAuthroBio("公司");authorMapper2.updateAuthor(author2);//commit会清空缓存区域
        sqlSession2.commit();sqlSession2.close();// 获取会话工厂SqlSession sqlSession3 = sqlSessionFactory.openSession();AuthorMapper authorMapper3 = sqlSession3.getMapper(AuthorMapper.class);// 第一次查询Author author3 = authorMapper3.findAuthorById(2);sqlSession3.close();}

结果:

DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 873769339.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Returned connection 873769339 to pool.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.5
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 873769339 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - ==>  Preparing: update author SET author_username=?, author_password=?, author_email=?, author_bio=?, register_time=? where author_id=?
DEBUG [main] - ==> Parameters: 董事长(String), 123asf(String), lisi@163.com(String), 公司(String), 2015-10-29 10:24:29.0(Timestamp), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Returned connection 873769339 to pool.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.3333333333333333
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 873769339 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3414a97b]
DEBUG [main] - Returned connection 873769339 to pool.

八、Mybatis与ehcache整合

8.1、把jar包导入项目

8.2、建立ehcache.xml

ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:\develop\ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache>
</ehcache>

8.3、在mapper的cache中指定type

<!--开启本mapper下的二级缓冲
type指定为ehcachecache类开
在ehcache和mybatis的整合包中-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

8.4、测试

@Testpublic void testCache() {// 获取会话工厂SqlSession sqlSession1 = sqlSessionFactory.openSession();AuthorMapper authorMapper1 = sqlSession1.getMapper(AuthorMapper.class);// 第一次查询Author author1 = authorMapper1.findAuthorById(2);//必须关闭不数据无法写到缓存区域
        sqlSession1.close();// 获取会话工厂SqlSession sqlSession2 = sqlSessionFactory.openSession();AuthorMapper authorMapper2 = sqlSession2.getMapper(AuthorMapper.class);Author author2 = authorMapper2.findAuthorById(2);//更新author2.setAuthorUserName("董事长");author2.setAuthroBio("公司");authorMapper2.updateAuthor(author2);//commit会清空缓存区域
        sqlSession2.commit();sqlSession2.close();// 获取会话工厂SqlSession sqlSession3 = sqlSessionFactory.openSession();AuthorMapper authorMapper3 = sqlSession3.getMapper(AuthorMapper.class);// 第一次查询Author author3 = authorMapper3.findAuthorById(2);sqlSession3.close();}

结果:

DEBUG [main] - Configuring ehcache from ehcache.xml found in the classpath: file:/E:/mywork/MybatisDemo2/bin/ehcache.xml
DEBUG [main] - Configuring ehcache from URL: file:/E:/mywork/MybatisDemo2/bin/ehcache.xml
DEBUG [main] - Configuring ehcache from InputStream
DEBUG [main] - Ignoring ehcache attribute xmlns:xsi
DEBUG [main] - Ignoring ehcache attribute xsi:noNamespaceSchemaLocation
DEBUG [main] - Disk Store Path: F:\develop\ehcache
DEBUG [main] - Creating new CacheManager with default config
DEBUG [main] - propertiesString is null.
DEBUG [main] - No CacheManagerEventListenerFactory class specified. Skipping...
DEBUG [main] - No BootstrapCacheLoaderFactory class specified. Skipping...
DEBUG [main] - CacheWriter factory not configured. Skipping...
DEBUG [main] - No CacheExceptionHandlerFactory class specified. Skipping...
DEBUG [main] - Initialized net.sf.ehcache.store.NotifyingMemoryStore for com.pb.mybatis.mapper.AuthorMapper
DEBUG [main] - Initialised cache: com.pb.mybatis.mapper.AuthorMapper
DEBUG [main] - CacheDecoratorFactory not configured for defaultCache. Skipping for 'com.pb.mybatis.mapper.AuthorMapper'.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1286943672.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Returned connection 1286943672 to pool.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.5
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1286943672 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - ==>  Preparing: update author SET author_username=?, author_password=?, author_email=?, author_bio=?, register_time=? where author_id=?
DEBUG [main] - ==> Parameters: 董事长(String), 123asf(String), lisi@163.com(String), 公司(String), 2015-10-29 10:24:29.0(Timestamp), 2(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Returned connection 1286943672 to pool.
DEBUG [main] - Cache Hit Ratio [com.pb.mybatis.mapper.AuthorMapper]: 0.3333333333333333
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1286943672 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - ==>  Preparing: select * from author where author_id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4cb533b8]
DEBUG [main] - Returned connection 1286943672 to pool.

转载于:https://www.cnblogs.com/liunanjava/p/4925553.html

MyBatis入门(五)---延时加载、缓存相关推荐

  1. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

  2. Mybatis延时加载

    延时加载配置 打开延时加载装置 <settings><!--打开延时加载开关--><setting name="lazyLoadingEnabled " ...

  3. MyBatis:延时加载

    什么是延迟加载 概念:如果一张表关联了另一张表的数据,只加载这张表中的数据,它关联的另一张表中的数据等到需要用的时候才去加载,称为延迟加载,也叫懒加载. 多表关联查询缺点: 查询速度更慢 更加占用对象 ...

  4. 关于TableView中图片的延时加载(转)

    经常我们会用tableView显示很多条目, 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. 重写 ...

  5. mybatis 延迟加载(懒加载)

    延迟加载 在多表查询时,数据与对象进行 mapping 操作,只有在真正使用到该对象时,才进行 mapping 操作,以减少数据库查询开销,从而提升系统性能.例如下表中当需要使用tab_seller表 ...

  6. TreeView的异步延时加载

    TreeView的延时加载 在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载 ...

  7. Android 自定义WebView 实现可以加载缓存数据

    1.自定义WebView说明 1.1.这个WebView可以加载缓存的数据.(需要后端配合,将html转换成一个字符串,主要是图片要用特殊格式) 1.2.注入了图片链接,为了方便点击webView中的 ...

  8. Entityframework:启用延时加载的主意事项(只为强化记忆)

    Check List 无参的.高于私有访问级别的构造方法(经常忘记). 非封闭的类(默认的非封闭的). DbContext 配置要开启(默认是开启的). 因为我喜欢将类型设置为封闭的,提供有参数的构造 ...

  9. LINQ-to-SQL那点事~关于延时加载的性能,微软给出了不错的解决方案

    回到目录 LINQ-to-SQL虽然已经属于过去事了,但由于历史原因,还是要关注一下它,呵呵,当微软推出linq to sql之后,最吸引开发者的地方可能就是可视化的数据模型,灵活可控的分部方法及神神 ...

  10. 关于ViewPager的适配器之——pagerAdapter加载缓存页面的机制

    ViewPager有很多的适配器,如pagerAdapter,FragmentPagerAdapter等, 今天我想重点谈的是关于pagerAdapter加载缓存页面的机制的问题. 首先,使用page ...

最新文章

  1. 综述丨七场高端报告,带你大视角看人工智能发展
  2. python--gevent高并发socket
  3. hdu 2009 求数列的和(c语言)
  4. 性味归经与功能的脚本(超过四元素)
  5. c 对一个mysql数据库进行操作_用C语言操作MySQL数据库
  6. JS---------正则表达式
  7. 做柜员还是程序员_应届生放弃互联网大厂回家乡银行:程序员五万比不上柜员五千...
  8. Java讲课笔记35:初探泛型
  9. Python中操作myslq的方法
  10. 防止孩子使用计算机的软件,如何防止熊孩纸在电脑里乱装软件
  11. FPGA数字信号处理(十)ASK调制技术
  12. (八)、MultipartFile
  13. 德保罗大学计算机专业,德保罗大学计算机金融申请要求及专业介绍
  14. 教师办公用计算机使用管理制度,教师办公室计算机使用规章制度
  15. Word(二) Word2016 如何删除页眉的下划线
  16. cpufreq: cpufreq_online: Failed to initialize policy for cpu: 0 (-19)
  17. 洛谷P4113 [HEOI2012]采花 题解
  18. 计算机组成原理第三章例题解析(关于存储器容量扩充)
  19. Win32DiskImager写入U盘后 打不开 提示格式化但是会出现错误
  20. 算法竞赛中的JAVA使用笔记(转载)

热门文章

  1. Mac 下载安装 Tomcat
  2. AI十大数据挖掘算法
  3. tp51 自定义404界面的配置
  4. 互联网面试八股文之Java基础
  5. SOAPUI接口测试http协议详细测试过程
  6. 中国互联网的那些事——二十年回顾
  7. 三菱PLC学习方法分享
  8. 【转】微波射频工程师必读经典参考书
  9. 电脑突然调节不了亮度?让我教你来恢复
  10. Vitamio 3.0 新手教程