一起学习框架SSM之MyBatis(三)

    科技2026-02-13  2

    Mybatis

    缓存1.一级缓存2.二级缓存2.2指定Mapper缓存2.3缓存清空并重新缓存 Druid连接池1.概念2.不同连接池的对比3.配置pom.xml4.创建DruidDataSoureFactory5.修改Mybatis-config.xml PageHelper分页插件1.概念2.开发步骤2.1引入依赖2.2配置MyBatis-config.xml2.3PageHelper应用方式 3.PegeInfo对象3.1PageInfoy应用方式3.2分页练习

    缓存

    内存中的一块春出空间,服务于某个应用程序,就是在将频繁读取的并且很少去更新的数据临时保存在内存中,便于二次快速访问

    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>

    结果

    Processed: 0.023, SQL: 9