Mybatis
缓存
内存中的一块春出空间,服务于某个应用程序,就是在将频繁读取的并且很少去更新的数据临时保存在内存中,便于二次快速访问
1.一级缓存
SqlSession级别的缓存,同一个SqlSeesion的发起多次同构查询,会将数据保存在一级缓存中
- 注意:MyBatis默认开启一级缓存,无需任何配置
2.二级缓存
SqlSessionFactory级别缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保在二级缓存中
- 注意:在sqlSession.commit()或者sqlSession.close()之后生效
- 在工具类中添加getSession方法
// getSession方法可以创建多个的SqlSession
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
### 2.1开启全局缓存
<settings>是MyBatis中极为重要的调整设置,他们会改变MyBatis的运作行为,其他详细配置可参考官方文档
- 注意:MaBatis-config.xml需要注意标签的顺序
```java
configuration (properties?, settings?,
typeAliases?, typeHandlers?, objectFactory?,
objectWrapperFactory?, reflectorFactory?,
plugins?, environments?, databaseIdProvider?, mappers?)
<!--全局缓存-->
<settings>
<setting name="cacheEnabled" value="true"/><!--开启全局缓存(默认开启)-->
</settings>
2.2指定Mapper缓存
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ozl.dao.UserDao"><!--定位哪个Dao的接口进行描述-->
<!--二级缓存默认开启的,但不是所有的查询结果都会进入二级缓存,需要<cache/>标签来给声明-->
<cache/>
<resultMap id="rm" type="User"><!--唯一标识rm,返回结果为User-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="gender" property="gender"/>
<result column="regist_time" property="regist_time"/>
</resultMap>
<!-- sql片段-->
<sql id="usersql">
<!--复用sql代码-->
select id,username,password,gender,regist_time
from mybatis
</sql>
<!--定位dao方法 返回的类型 写入sql语句-->
<select id="queryUser" resultMap="rm">
<include refid="usersql"></include>
</select>
<!--删除-->
<delete id="deleteUser" parameterType="int">
delete
from mybatis
where id=#{
id}
</delete>
</mapper>
2.3缓存清空并重新缓存
@Test
public void test1(){
SqlSession session = MyBatisUtils.getSession();
SqlSession session1 = MyBatisUtils.getSession();
SqlSession session2 = MyBatisUtils.getSession();
SqlSession session3 = MyBatisUtils.getSession();
UserDao mapper = session.getMapper(UserDao.class);
UserDao mapper1 = session1.getMapper(UserDao.class);
UserDao mapper2 = session2.getMapper(UserDao.class);
UserDao mapper3 = session3.getMapper(UserDao.class);
mapper.queryUser();![在这里插入图片描述](https://img-blog.csdnimg.cn/20201010144334178.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L296bDUyMA==,size_16,color_FFFFFF,t_70#pic_center)
session.close();
System.out.println("=======================");
// 修改相关的缓存会被移除
mapper2.deleteUser(1001);
session2.commit();
session2.close();
System.out.println("==========================");
mapper1.queryUser();
session1.close();
System.out.println("==========================");
mapper3.queryUser();
session3.close();
}
}
结果
Druid连接池
1.概念
Druid是阿里巴巴开源平台的一个项目,整个项目由数据库连接池,插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证,统计SQL信息,SQL性能收集,SQL注入检查,SQL翻译等,程序员可以通过定制实现自己需要的功能
2.不同连接池的对比
- 测试执行申请归还连接1,000,000次总耗时性能对比
可以看出Druid的优势是非常明显的
3.配置pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
4.创建DruidDataSoureFactory
public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
public MyDruidDataSourceFactory() {
this.dataSource=new DruidDataSource();//替换数据源
}
}
5.修改Mybatis-config.xml
<!--数据库相关信息-->
<environment id="ozl_config">
<!--事务控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<dataSource type="cn.ozl.datasource.MyDruidDataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<!--&转义&;-->
<!--数据库连接信息-->
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
PageHelper分页插件
1.概念
PageHelper是适用于MyBatis框架的一个分页插件,使用极其方便,支持任何的复杂的单表,多表分页查询操作
2.开发步骤
2.1引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
2.2配置MyBatis-config.xml
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
2.3PageHelper应用方式
@Test
public void test3(){
UserDao mapper = MyBatisUtils.getMapper(UserDao.class);
// PageHelper.startPage()方法后的第一个查询语句才会执行分页
// 分3页每页2行数据
PageHelper.startPage(3,2);
List<User> users = mapper.queryUser();
for (User user : users) {
System.out.println(user);
}
// 将查询结果封装到PageInfo对象中
PageInfo<User> pageInfo=new PageInfo(users);
System.out.println("=======================");
}
3.PegeInfo对象
3.1PageInfoy应用方式
@Test
public void test3(){
UserDao mapper = MyBatisUtils.getMapper(UserDao.class);
// PageHelper.startPage()方法后的第一个查询语句才会执行分页
// 分3页每页2行数据
PageHelper.startPage(3,2);
List<User> users = mapper.queryUser();
for (User user : users) {
System.out.println(user);
}
// 将查询结果封装到PageInfo对象中
PageInfo<User> pageInfo=new PageInfo(users);
System.out.println("=======================");
}
结果
3.2分页练习
- 使用Servlet+JSP+MyBatis+分页插件,完成分页查询功能
UserDao
public interface UserDao {
List<User> queryUsers();
}
UserDao-Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ozl.dao.UserDao"><!--定位哪个Dao的接口进行描述-->
<!-- sql片段-->
<sql id="usersql">
<!--复用sql代码-->
select id,username,password,gender,regist_time registTime
from mybatis
</sql>
<!--定位dao方法 返回的类型 写入sql语句-->
<select id="queryUsers" resultType="User">
<!--引用sql片段-->
<include refid="usersql"></include>
</select>
</mapper>
MyDruidDataSourceFactory
public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
public MyDruidDataSourceFactory() {
this.dataSource=new DruidDataSource();//替换数据源
}
}
Page
public class Page {
private Integer pageNum=1;
private Integer pageSize=2;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
User
public class User {
private Integer id;
private String username;
private String password;
private Boolean gender;
private Date registTime;
public User(){
}
public User(Integer id, String username, String password, Boolean gender, Date registTime) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.registTime = registTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender=" + gender +
", registTime=" + registTime +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Date getRegistTime() {
return registTime;
}
public void setRegistTime(Date registTime) {
this.registTime = registTime;
}
}
UserServiceImpl
public class UserServiceImpl implements UserService {
public PageInfo<User> queryUsers(Page page) {
UserDao mapper = MyBatisUtils.getMapper(UserDao.class);
//分页设置
PageHelper.startPage(page.getPageNum(), page.getPageSize());
List<User> users = mapper.queryUsers();
System.out.println(new PageInfo<User>(users));
//封装PageInfo
return new PageInfo<User>(users);
}
}
UserService
public interface UserService {
PageInfo<User> queryUsers(Page page);
}
Mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--configuration (properties?, settings?,
typeAliases?, typeHandlers?, objectFactory?,
objectWrapperFactory?, reflectorFactory?,
plugins?, environments?, databaseIdProvider?, mappers?)-->
<!--书写位置要按照规则-->
<!--导入jdbc.properties外部参数-->
<properties resource="jdbc.properties"></properties>
<!--全局缓存-->
<settings>
<setting name="cacheEnabled" value="true"/><!--开启全局缓存(默认开启)-->
</settings>
<!--实体类别名-->
<typeAliases>
<!-- <typeAlias type="cn.ozl.entity.User" alias="user"/>-->
<!--定义实体类所在的包,每个实体类都会自动注册一个别名 这个别名就是实体类名-->
<package name="cn.ozl.entity"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
<!--核心配置信息-->
<environments default="ozl_config">
<!--数据库相关信息-->
<environment id="ozl_config">
<!--事务控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<dataSource type="cn.ozl.datasource.MyDruidDataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<!--&转义&;-->
<!--数据库连接信息-->
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--注册Mapper-->
<mappers>
<mapper resource="cn/ozl/dao/UserDao-Mapper.xml"></mapper>
</mappers>
</configuration>
users.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table width="500px" align="center" border="1px" cellspacing="0">
<tr>
<th>id</th>
<th>username</th>
<th>password</th>
<th>gender</th>
<th>registTime</th>
</tr>
<c:forEach items="${requestScope.pageData.list}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.gender}</td>
<td>${user.registTime}</td>
</tr>
</c:forEach>
</table>
<div style="text-align: center">
<a href="${pageContext.request.contextPath}/users?pageNum=1&pageSize=${requestScope.pageData.pageSize}">首页</a>
<c:if test="${requestScope.pageData.hasPreviousPage}">
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.prePage}&pageSize=${requestScope.pageData.pageSize}">上一页</a>
</c:if>
<c:forEach begin="1" end="${requestScope.pageData.pages}" var="i">
<a href="${pageContext.request.contextPath}/users?pageNum=${i}&pageSize=${requestScope.pageData.pageSize}">
<c:if test="${requestScope.pageData.pageNum==i}">
<spn style="color: red">${i}</spn>
</c:if>
<c:if test="${requestScope.pageData.pageNum!=i}">
<spn>${i}</spn>
</c:if>
</a>
</c:forEach>
<c:if test="${requestScope.pageData.hasNextPage}">
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.nextPage}&pageSize=${requestScope.pageData.pageSize}">下一页</a>
</c:if>
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.pages}&pageSize=${requestScope.pageData.pageSize}">尾页</a>
</div>
</body>
</html>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis-page</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<packaging>war</packaging>
<dependencies>
<!-- web项目编译环境-->
<dependency>
<!-- jstl支持-->
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--servlet编译环境-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--junit测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>*.xml</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
结果