通过引用外部配置文件的方法,配置连接数据库的4个基本信息 1)在 resources 下定义 jdbcConfig.properties 文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&characterEncoding=UTF-8&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
在实际开发中都会使用数据库连接池,因为它可以减少我们获取连接所消耗的时间。
在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过< dataSource type=”POOLED”>来实现 Mybatis 中连接池的配置。
1)POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。 2)UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。 3)JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource对象是不一样的。 注意:如果不是web或者maven的war工程,是不能使用的。(tomcat服务器,采用的是dbcp连接池)
存在于内存中的临时数据。
不用每次用数据都去数据库中取,减少了和数据库交互的次数,提高执行效率。
1)经常查询并且不经常改变的。 2)数据正确与否对最终结果影响不大的。
指的是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); }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。