(35)Mybatis框架细节(3)SqlMapConfig.xml配置文件、mybatis中的连接池、Mybatis中的缓存

tech2022-08-16  137

Mybatis框架(3)

一、SqlMapConfig.xml配置文件的重要标签1.properties标签(引入外部文件):2.typeAliases标签(Mybatis中设置别名): 二、数据库连接池介绍1.mybatis中的连接池:2.type属性的三种取值: 三、Mybatis中的缓存1.什么是缓存:2.使用缓存的好处:3.适用缓存的情况:4.Mybatis中的一级缓存和二级缓存:1)一级缓存2)二级缓存

一、SqlMapConfig.xml配置文件的重要标签

1.properties标签(引入外部文件):

通过引用外部配置文件的方法,配置连接数据库的4个基本信息 1)在 resources 下定义 jdbcConfig.properties 文件

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/user?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC jdbc.username=root jdbc.password= properties 标签配置 <!--引入外部配置文件--> <properties url="file:///D:\ideaProjects\mybatis3\0903_mybatis\src\main\resources/jdbcConfig.properties"></properties>

resource 属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下 resource=“jdbcConfig.properties” URL: Uniform Resource Locator 统一资源定位符 http://localhost:8080/mystroe/CategoryServlet URL 协议 主机 端口 URI URI:Uniform Resource Identifier 统一资源标识符 /mystroe/CategoryServlet 它是可以在 web 应用中唯一定位一个资源的路径

<!--配置连接数据库的4个基本信息--> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>

遇到的报错:failed to parse the connection string near ';characterEncoding=utf8&useSSL=true&serverTimezo 原因: jdbcConfig.properties 文件中&这个符号编译不出来。 解决: jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" 改为如下: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT

2.typeAliases标签(Mybatis中设置别名):

<!--配置别名--> <typeAliases> <package name="com.anyi.domain"></package> </typeAliases>

二、数据库连接池介绍

在实际开发中都会使用数据库连接池,因为它可以减少我们获取连接所消耗的时间。

1.mybatis中的连接池:

在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过< dataSource type=”POOLED”>来实现 Mybatis 中连接池的配置。

2.type属性的三种取值:

1)POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。 2)UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。 3)JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource对象是不一样的。 注意:如果不是web或者maven的war工程,是不能使用的。(tomcat服务器,采用的是dbcp连接池)

三、Mybatis中的缓存

1.什么是缓存:

存在于内存中的临时数据。

2.使用缓存的好处:

不用每次用数据都去数据库中取,减少了和数据库交互的次数,提高执行效率。

3.适用缓存的情况:

1)经常查询并且不经常改变的。 2)数据正确与否对最终结果影响不大的。

4.Mybatis中的一级缓存和二级缓存:

1)一级缓存

指的是Mybatis中SqlSession对象的缓存。当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供的一块区域中。该区域的结果是一个Map。当我们再次查询同样的数据,Mybatis会先去SqlSession中查询是否有,有的话直接拿出来用。 当SqlSession对象消失时,mybatis的一级缓存也就消失了。

@Test public void testFirstLeveCache(){ User user1 = userDao.findByid(1); System.out.println(user1); User user2 = userDao.findByid(1); System.out.println(user2); System.out.println(user1==user2); }

从控制台可以看出,只发起了一次查询,但是数据被使用了两次。

测试一级缓存的清空:

@Test public void testFirstLeveCache(){ User user1 = userDao.findByid(1); System.out.println(user1); // sqlSession.close(); //再次获取 SqlSession 对象 //session = factory.openSession(); session.clearCache(); //此方法也可以清空缓存 userDao = session.getMapper(IUserDao.class); User user2 = userDao.findByid(1); System.out.println(user2); System.out.println(user1==user2); }

2)二级缓存

a.定义:指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession对象共享其缓存。 二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

b.二级缓存的使用步骤: 第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)

<settings> <setting name="cacheEnabled" value="true"/> </settings>

因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为false 代表不开启二级缓存。

第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)

<!--开启user支持二级缓存--> <cache/>

第三步:让当前的操作支持二级缓存(配置 statement 上面的 useCache 属性)

<!--根据id查找用户--> <select id="findByid" parameterType="INT" resultType="com.anyi.domain.User" useCache="true"> select * from t_user where id=#{uid} </select>

测试类:

@Test public void testFirstLeveCache(){ SqlSession session1 = factory.openSession(); IUserDao dao1 = session1.getMapper(IUserDao.class); User user1 = dao1.findByid(1); System.out.println(user1); session1.close();//一级缓存消失 SqlSession session2 = factory.openSession(); IUserDao dao2 = session2.getMapper(IUserDao.class); User user2 = dao2.findByid(1); System.out.println(user2); System.out.println(user1==user2); }

输出: 二级缓存里面存放的内容是数据而不是对象,所有每次使用之前都会重新创建一个对象,所有输出为false。

最新回复(0)