MyBatis核心配置文件详解
transactionManager
配合视频教程观看,更易学习理解,课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。
<?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> <environments default="dev"> <environment id="dev"> <transactionManager type="MANAGED"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/powernode"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="CarMapper.xml"/> </mappers></configuration>@Testpublic void testTransactionManager() throws Exception{ // 准备数据 Car car = new Car(); car.setCarNum("133"); car.setBrand("丰田霸道"); car.setGuidePrice(50.3); car.setProduceTime("2020-01-10"); car.setCarType("燃油车"); // 获取SqlSessionFactory对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config2.xml")); // 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行SQL int count = sqlSession.insert("insertCar", car); System.out.println("插入了几条记录:" + count);}当事务管理器是:JDBC
- 采用JDBC的原生事务机制:
- 开启事务:conn.setAutoCommit(false);
- 处理业务......
- 提交事务:conn.commit();
当事务管理器是:MANAGED
- 交给容器去管理事务,但目前使用的是本地程序,没有容器的支持,当mybatis找不到容器的支持时:没有事务。也就是说只要执行一条DML语句,则提交一次。
dataSource
<?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> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"/> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/powernode"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="CarMapper.xml"/> </mappers></configuration>@Testpublic void testDataSource() throws Exception{ // 准备数据 Car car = new Car(); car.setCarNum("133"); car.setBrand("丰田霸道"); car.setGuidePrice(50.3); car.setProduceTime("2020-01-10"); car.setCarType("燃油车"); // 获取SqlSessionFactory对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml")); // 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(true); // 执行SQL int count = sqlSession.insert("insertCar", car); System.out.println("插入了几条记录:" + count); // 关闭会话 sqlSession.close();}当type是UNPOOLED,控制台输出:
修改配置文件mybatis-config3.xml中的配置:
<dataSource type="POOLED">Java测试程序不需要修改,直接执行,看控制台输出:
通过测试得出:UNPOOLED不会使用连接池,每一次都会新建JDBC连接对象。POOLED会使用数据库连接池。【这个连接池是mybatis自己实现的。】
<dataSource type="JNDI">JNDI的方式:表示对接JNDI服务器中的连接池。这种方式给了我们可以使用第三方连接池的接口。如果想使用dbcp、c3p0、druid(德鲁伊)等,需要使用这种方式。
这种再重点说一下type="POOLED"的时候,它的属性有哪些?
<?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> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/powernode"/> <property name="username" value="root"/> <property name="password" value="root"/> <!--最大连接数--> <property name="poolMaximumActiveConnections" value="3"/> <!--这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。--> <property name="poolTimeToWait" value="20000"/> <!--强行回归池的时间--> <property name="poolMaximumCheckoutTime" value="20000"/> <!--最多空闲数量--> <property name="poolMaximumIdleConnections" value="1"/> </dataSource> </environment> </environments> <mappers> <mapper resource="CarMapper.xml"/> </mappers></configuration>poolMaximumActiveConnections:最大的活动的连接数量。默认值10
poolMaximumIdleConnections:最大的空闲连接数量。默认值5
poolMaximumCheckoutTime:强行回归池的时间。默认值20秒。
poolTimeToWait:当无法获取到空闲连接时,每隔20秒打印一次日志,避免因代码配置有误,导致傻等。(时长是可以配置的)
当然,还有其他属性。对于连接池来说,以上几个属性比较重要。
最大的活动的连接数量就是连接池连接数量的上限。默认值10,如果有10个请求正在使用这10个连接,第11个请求只能等待空闲连接。
最大的空闲连接数量。默认值5,如何已经有了5个空闲连接,当第6个连接要空闲下来的时候,连接池会选择关闭该连接对象。来减少数据库的开销。
需要根据系统的并发情况,来合理调整连接池最大连接数以及最多空闲数量。充分发挥数据库连接池的性能。【可以根据实际情况进行测试,然后调整一个合理的数量。】
下图是默认配置:
在以上配置的基础之上,可以编写java程序测试:
@Testpublic void testPool() throws Exception{ SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml")); for (int i = 0; i < 4; i++) { SqlSession sqlSession = sqlSessionFactory.openSession(); Object selectCarByCarNum = sqlSession.selectOne("selectCarByCarNum"); }}<select id="selectCarByCarNum" resultType="com.powernode.mybatis.pojo.Car"> select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where car_num = '100'</select>