org.mybatis
mybatis
x.x.x
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
driver.encoding=UTF8
poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程. 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。
这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
data_source – 这是引用数据源实例位置的上下文的路径。
提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
env.encoding=UTF8
blog表
id | title | content |
---|---|---|
1 | aaa | 1111 |
2 | aaa | 1111 |
3 | bbb | 2222 |
4 | bbb | 3333 |
注:由于演示代码需要,表中的数据不定
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
~~parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。~~
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
/**
*
*
* 1、导包(mybatis的支持,mysql数据库的支持)
* 2、编写了一个mybatis-config.xml(全局配置文件),主要包含数据库访问信息
* 3、创建mybatis的核心对象SqlSessionFactory产生sqlsession-->connection
* 4、数据映射文件(编写sql脚本,对象关系映射)
* 5、在全局配置文件中,引入该数据映射文件
*
*
* @Copyright (C),华清远见
* @author HC
* @Date:2018年11月19日
*/
public class MybatisDemo {
/**
*
*
* 老版本mybatis的操作形式
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
//这里的Blog是自创的对象
try {
//名称空间加上要调用的方法的id来调用,返回一个Blog对象
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1);
System.out.println(blog);
// Blog b = new Blog();
// b.setTitle("dadsadsd");
// b.setContent("sdsadsad");
// session.insert("org.mybatis.example.BlogMapper.insertBlog", b);
// session.commit();
} finally {
session.close();//每次都需要关闭
}
}
}
Blog [id=1, title=我的博客, content=博客内容]
package com.hqyj.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.hqyj.mybatis.Blog;
public interface BlogDao {
//根据id查询
public Blog findByid(Integer id);
//传入对象修改记录
public void update(Blog blog);
//传入对象增加记录
public void insert(Blog blog);
//传入对象删除记录
public void delete(Blog blog);
//查找所有记录
public List finaAll();
//传入多种参数,第一种方式,直接传参,在Mapper XML文件中去用arg0,arg1去指定参数
public List findByids(Integer id,Integer id2);
//传入多种参数,指定参数的引用,在Mapper XML文件中使用引用的名字去指定参数
public List findByidsAnnoation(@Param("id")Integer id,@Param("id2")Integer id2);
}
update blog set title=#{title},content=#{content} where id=#{id}
insert INTO blog(title,content) VALUES(#{title},#{content})
DELETE FROM blog where id = #{id}
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.BlogDao;
import com.hqyj.dao.BlogDaoAnnotation;
/**
*
*
* 1、导包(mybatis的支持,mysql数据库的支持)
* 2、编写了一个mybatis-config.xml(全局配置文件),主要包含数据库访问信息
* 3、创建mybatis的核心对象SqlSessionFactory产生sqlsession-->connection
* 4、数据映射文件(编写sql脚本,对象关系映射)
* 5、在全局配置文件中,引入该数据映射文件
*
*
* @Copyright (C),华清远见
* @author HC
* @Date:2018年11月19日
*/
public class MybatisDemo {
//手动提交,因为调用了事务,所以增删改需要调用commit()方法手动提交
// session.commit();
//可以往commit()方法里传boolean类型的参数来设置提交
// session.commit(true);
// session.commit(false);
/**
*
*
* 面向接口形式
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void test02() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//无需再写实现类,直接得到这个类class的映射作为代理映射
BlogDao dao = session.getMapper(BlogDao.class);
/**
* 使用代理映射去调用方法,因为接口中的方法名和Mapper XML文件中的id对应
* 所以会去Mapper XML文件中直接调用id为方法名的SQL
*/
System.out.println(dao.findByid(1));
}finally {
session.close();
}
}
/**
*
*
* 注解的使用
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
// public interface BlogDaoAnnotation {
//注解,直接在方法上面加注解,在代理实现去调用
// @Select("select * from blog where id = #{id}")
// public Blog findByidAnnotation(Integer id);
//}
@Test
public void test03() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
BlogDaoAnnotation dao = session.getMapper(BlogDaoAnnotation.class);
System.out.println(dao.findByidAnnotation(1));
}finally {
session.close();
}
}
/**
当Java实体类属性字段和数据库字段不匹配
* 1、将数据库字段和Java实体类属性保持一致
* 2、强行将数据库查询的字段改名为Java的实体类属性
* 3、引用mybatis中标签--->结果集的包装
*/
/**
*
*
* 修改操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testUpdate() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
Blog blog = new Blog();
blog.setId(4);
blog.setTitle("333");
blog.setContent("444");
dao.update(blog);
//手动提交,因为调用了事务,所以增删改需要手动提交
session.commit();
}finally {
session.close();
}
}
/**
*
*
* 增加操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testInert() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
Blog blog = new Blog();
blog.setTitle("555");
blog.setContent("666");
dao.insert(blog);
//手动提交,因为调用了事务,所以增删改需要手动提交
session.commit();
}finally {
session.close();
}
}
/**
*
*
* 删除操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testDelete() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
Blog blog = new Blog();
blog.setId(10);
dao.delete(blog);
//手动提交,因为调用了事务,所以增删改需要手动提交
session.commit();
}finally {
session.close();
}
}
/**
*
*
* 查询所有操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testFindAll() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
System.out.println(dao.finaAll());
}finally {
session.close();
}
}
/**
*
*
* 查询多个参数操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testFindids() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
System.out.println(dao.findByids(1,4));
}finally {
session.close();
}
}
/**
*
*
* 查询多个参数操作
*
* @author zlf
* @Date 2018年11月19日
* @throws IOException
*/
@Test
public void testFindidsAnnoation() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
BlogDao dao = session.getMapper(BlogDao.class);
//Blog修改
System.out.println(dao.findByidsAnnoation(1, 4));
}finally {
session.close();
}
}
}
id | studentname | t_id | c_id |
---|---|---|---|
1 | 张三 | 1 | 1 |
2 | 李四 | 1 | 1 |
id | teachername |
---|---|
1 | 王麻子 |
2 | 赵六 |
id | classname |
---|---|
1 | 一年级一班 |
2 | 一年级二班 |
Student.java
package com.hqyj.onetone.bean;
public class Student {
private int id;
private String studentname;
private Teacher teacher;
......
}
Teacher.java
package com.hqyj.onetone.bean;
public class Teacher {
private int id;
private String teachername;
......
}
Classroom.java
package com.hqyj.onetomany.bean;
import java.util.List;
import com.hqyj.onetone.bean.Student;
public class Classroom {
private int id;
private String classname;
private List students;
......
}
StudentDao.java
package com.hqyj.dao.StudentDao;
import java.util.List;
import com.hqyj.onetone.bean.Student;
public interface StudentDao {
//根据id查,未使用标签与使用association用的方法
public Student findByid(Integer id);
//根据id查,分步查询
public Student findByStepid(Integer id);
//多对多,根据班级查询有哪些学生
public List findByClassid(Integer id);
}
TeacherDao
package com.hqyj.dao.StudentDao;
import com.hqyj.onetone.bean.Teacher;
public interface TeacherDao {
//根据id查老师,分步查询中使用
public Teacher findByid(Integer id);
}
ClassRoomDao
package com.hqyj.dao.onetomany;
import com.hqyj.onetomany.bean.Classroom;
public interface ClassRoomDao {
//根据id查
public Classroom findByid(Integer id);
//分步多对多
public Classroom findsetpByid(Integer id);
}
映射中的sql.xml文件(StudentDao)
测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.StudentDao.StudentDao;
public class OneToOneTest {
/**
*
*
* 未使用association标签
*
* @author zlf
* @throws IOException
* @Date 2018年11月20日
*/
@Test
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
StudentDao dao = session.getMapper(StudentDao.class);
// //一步查询
System.out.println(dao.findByid(1));
}finally {
session.close();
}
}
}
结果
Student [id=1, studentname=张三, teacher=Teacher [id=1, teachername=王麻子]]
映射中的sql.xml文件(StudentDao)
测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.StudentDao.StudentDao;
public class OneToOneTest {
/**
*
*
* 使用association标签
*
* @author zlf
* @throws IOException
* @Date 2018年11月20日
*/
@Test
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
StudentDao dao = session.getMapper(StudentDao.class);
System.out.println(dao.findByid(1));
}finally {
session.close();
}
}
}
结果一样
Student [id=1, studentname=张三, teacher=Teacher [id=1, teachername=王麻子]]
映射中的sql.xml文件(StudentDao)
映射中的sql.xml文件(TeacherDao)
测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.StudentDao.StudentDao;
public class OneToOneTest {
/**
*
*
* 使用association标签
*
* @author zlf
* @throws IOException
* @Date 2018年11月20日
*/
@Test
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
StudentDao dao = session.getMapper(StudentDao.class);
//分步查询
System.out.println(dao.findByStepid(1));
}finally {
session.close();
}
}
}
结果一样
Student [id=1, studentname=张三, teacher=Teacher [id=1, teachername=王麻子]]
沿用上几张表
映射中的sql.xml文件(ClassRoomDao)
测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.StudentDao.StudentDao;
import com.hqyj.dao.onetomany.ClassRoomDao;
public class OneToMany {
@Test
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
ClassRoomDao dao = session.getMapper(ClassRoomDao.class);
使用connection标签一步搞定
System.out.println(dao.findByid(1));
}finally {
session.close();
}
}
}
结果
Classroom [id=1, classname=一年级一班, students=[Student [id=1, studentname=张三, teacher=null], Student [id=2, studentname=李四, teacher=null]]]
映射中的sql.xml文件(ClassRoomDao)
映射中的sql.xml文件(StudentDao)
测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.StudentDao.StudentDao;
import com.hqyj.dao.onetomany.ClassRoomDao;
public class OneToMany {
@Test
public void test01() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
//获取dao接口的代理对象(实现类)
ClassRoomDao dao = session.getMapper(ClassRoomDao.class);
// 使用分步
System.out.println(dao.findsetpByid(1));
}finally {
session.close();
}
}
}
结果一样
Classroom [id=1, classname=一年级一班, students=[Student [id=1, studentname=张三, teacher=null], Student [id=2, studentname=李四, teacher=null]]]
BlogDao.java
package com.hqyj.dao.dynamicsql;
import java.util.List;
import com.hqyj.mybatis.Blog;
public interface BlogDao {
//使用动态if
public List find(Blog blog);
//使用trim标签补全where
public List find_where(Blog blog);
//使用foreach查询多个记录
public List find_foreach(List list);
}
映射文件的xml
测试类
package com.hqyj.mybatis;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
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.Test;
import com.hqyj.dao.dynamicsql.BlogDao;
/**
*
*
* 动态SQL
*
* @Copyright (C),华清远见
* @author HC
* @Date:2018年11月20日
*/
public class DynamicSql {
@Test
public void testif() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
BlogDao dao = session.getMapper(BlogDao.class);
Blog blog = new Blog();
blog.setTitle("aaa");
blog.setContent("444");
blog.setId(1);
System.out.println(dao.find(blog));
System.out.println(dao.find_where(blog));
List list = new ArrayList<>();
list.add(1);
list.add(4);
list.add(8);
list.add(9);
dao.find_foreach(list);
} finally {
session.close();
}
}
}
结果
[Blog [id=1, title=aaa, content=11111111111]]
[Blog [id=4, title=aaa, content=444]]
[Blog [id=1, title=aaa, content=11111111111], Blog [id=4, title=aaa, content=444], Blog [id=8, title=aaa, content=222], Blog [id=9, title=bbb, content=666]]
fetchType="lazy" 懒加载 当要使用到这个字段的时候才加载
fetchType="eager" 全加载 不管是否使用,都会加载
也可以在全局文件中直接设置
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.BlogDao;
/**
*
*
* 一级缓存(mybatis默认开启)
* 针对以下效果有效:
* 1、session对象一致
* 2、session执行的查询条件要一致
* 3、session不能执行清空缓存操作、关闭操作
* 4、多次查询中不能执行增加、修改、删除操作
*
* @Copyright (C),华清远见
* @author HC
* @Date:2018年11月20日
*/
public class First_Cache {
@Test
public void testfirstcache() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
/**
* 当第一次查询的结果和之后的查询结果是一样的,就不会再去执行多次sql语句,因为第一次查询之后就会把结果放在session的缓存中
*/
try {
BlogDao dao = session.getMapper(BlogDao.class);
dao.findByid(1);
dao.findByid(1);
//session.clearCache();//清理缓存的操作
//增删改后,缓存需要重新读取
Blog blog = new Blog();
blog.setId(1);
blog.setTitle("sdsadsad");
blog.setContent("11111111111");
dao.update(blog);
session.commit();
}finally {
session.close();
}
}
}
日志结果
2018-11-20 19:55:40,658 [main] DEBUG [com.hqyj.dao.BlogDao] - Cache Hit Ratio [com.hqyj.dao.BlogDao]: 0.0
2018-11-20 19:55:40,853 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - ==> Preparing: select * from blog where id = ?
//虽然查询了两次,但还是只调用了一次SQL,因为第一次查询已经将结果放在了缓存中
//进行了增删改会自动清除缓存
2018-11-20 19:55:40,878 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - ==> Parameters: 1(Integer)
2018-11-20 19:55:40,896 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - <== Total: 1
2018-11-20 19:55:40,897 [main] DEBUG [com.hqyj.dao.BlogDao] - Cache Hit Ratio [com.hqyj.dao.BlogDao]: 0.0
2018-11-20 19:55:40,897 [main] DEBUG [com.hqyj.dao.BlogDao.update] - ==> Preparing: update blog set title=?,content=? where id=?
2018-11-20 19:55:40,898 [main] DEBUG [com.hqyj.dao.BlogDao.update] - ==> Parameters: sdsadsad(String), 11111111111(String), 1(Integer)
2018-11-20 19:55:40,900 [main] DEBUG [com.hqyj.dao.BlogDao.update] - <== Updates: 1
全局文件
Mapper文件
二级缓存测试类
package com.hqyj.mybatis;
import java.io.IOException;
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.Test;
import com.hqyj.dao.BlogDao;
/**
* 二级缓存
* 1、二级缓存绑定在而非session对象
* 2、使用二级缓存要做一下操作:
* 全局配置文件中,
* 查询具体的实体类需要实现序列化接口
* mapper文件中需要添加 //只读
>
* @author DELL
*
*/
public class Second_Cache {
@Test
public void testfirstcache() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//两个session对象
SqlSession session = sqlSessionFactory.openSession();
SqlSession session2 = sqlSessionFactory.openSession();
try {
BlogDao dao = session.getMapper(BlogDao.class);
BlogDao dao2 = session2.getMapper(BlogDao.class);
dao.findByid(1);
//需要提交一次
session.commit();
dao2.findByid(1);
}finally {
session.close();
}
}
}
日志:
//命中率
2018-11-20 20:07:45,221 [main] DEBUG [com.hqyj.dao.BlogDao] - Cache Hit Ratio [com.hqyj.dao.BlogDao]: 0.0
2018-11-20 20:07:45,426 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - ==> Preparing: select * from blog where id = ?
//只调用了一次
2018-11-20 20:07:45,452 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - ==> Parameters: 1(Integer)
2018-11-20 20:07:45,470 [main] DEBUG [com.hqyj.dao.BlogDao.findByid] - <== Total: 1
2018-11-20 20:07:45,518 [main] DEBUG [com.hqyj.dao.BlogDao] - Cache Hit Ratio [com.hqyj.dao.BlogDao]: 0.5
BlogDao.java
package com.hqyj.dao;
import java.util.Map;
import com.hqyj.mybatis.Blog;
public interface BlogDao {
public void findMap(Map map);
}
Mapper映射文件
测试类
package com.hqyj.mybatis;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
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.Test;
import com.hqyj.dao.BlogDao;
/**
*
*
* 调用存储过程
*
* @Copyright (C),华清远见
* @author HC
* @Date:2018年11月20日
*/
public class CallAbleTest {
@Test
public void testfirstcache() throws IOException {
//装载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
BlogDao dao = session.getMapper(BlogDao.class);
Map map = new HashMap<>();
map.put("b_id", 0);
dao.findMap(map);
System.out.println(map.get("b_count"));
}finally {
session.close();
}
}
}
日志:
2018-11-20 20:28:40,125 [main] DEBUG [com.hqyj.dao.BlogDao.findMap] - ==> Preparing: call query_id(?,?)
2018-11-20 20:28:40,166 [main] DEBUG [com.hqyj.dao.BlogDao.findMap] - ==> Parameters: 0(Integer)
2
类型处理器 Java 类型 JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler java.lang.Float, float 数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double 数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal 数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 数据库兼容的字节流类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定类型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE