一起学习框架SSM之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}"/>
                <!--&转义&amp;-->
                <!--数据库连接信息-->
                <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}"/>
                <!--&转义&amp;-->
                <!--数据库连接信息-->
                <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>

结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ozl520/article/details/108966625