mybatis学习记录(四)-----MyBatis核心配置文件详解

待我称王封你为后i 2024-03-02 08:42 94阅读 0赞

目录

MyBatis核心配置文件详解

4.1 environment

4.2 transactionManager

4.3 dataSource

4.4 properties

4.5 mapper


MyBatis核心配置文件详解

mybatis-config.xml :

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="CarMapper.xml"/>
  19. <mapper resource="CarMapper2.xml"/>
  20. </mappers>
  21. </configuration>
  • configuration:根标签,表示配置信息。
  • environments:环境(多个),以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。

    • default属性:表示默认使用的是哪个环境,default后面填写的是environment的id。default的值只需要和environment的id值一致即可
  • environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置

    • id:给当前环境一个唯一标识,该标识用在environments的default后面,用来指定默认环境的选择。
  • transactionManager:配置事务管理器

    • type属性:指定事务管理器具体使用什么方式,可选值包括两个
      • JDBC:使用JDBC原生的事务管理机制。底层原理:事务开启conn.setAutoCommit(false); …处理业务…事务提交conn.commit();
      • MANAGED:交给其它容器来管理事务,比如WebLogic、JBOSS等。如果没有管理事务的容器,则没有事务。没有事务的含义:只要执行一条DML语句,则提交一次
  • dataSource:指定数据源

    • type属性:用来指定具体使用的数据库连接池的策略,可选值包括三个
      • UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
        • property可以是:
          • driver 这是 JDBC 驱动的 Java 类全限定名。
          • url 这是数据库的 JDBC URL 地址。
          • username 登录数据库的用户名。
          • password 登录数据库的密码。
          • defaultTransactionIsolationLevel 默认的连接事务隔离级别。
          • defaultNetworkTimeout 等待数据库操作完成的默认网络超时时间(单位:毫秒)
      • POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。
        • property可以是(除了包含UNPOOLED中之外):
          • poolMaximumActiveConnections 在任意时间可存在的活动(正在使用)连接数量,默认值:10
          • poolMaximumIdleConnections 任意时间可能存在的空闲连接数。
          • 其它….
      • JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。如果不是web或者maven的war工程,JNDI是不能使用的。
        • property可以是(最多只包含以下两个属性):
          • initial_context 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
          • data_source 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
  • mappers:在mappers标签中可以配置多个sql映射文件的路径。

  • mapper:配置某个sql映射文件的路径

    • resource属性:使用相对于类路径的资源引用方式
    • url属性:使用完全限定资源定位符(URL)方式

4.1 environment

mybatis-003-configuration :

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--默认使用开发环境-->
  7. <!--<environments default="dev">-->
  8. <!--默认使用生产环境-->
  9. <environments default="production">
  10. <!--开发环境-->
  11. <environment id="dev">
  12. <transactionManager type="JDBC"/>
  13. <dataSource type="POOLED">
  14. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  15. <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
  16. <property name="username" value="root"/>
  17. <property name="password" value="root"/>
  18. </dataSource>
  19. </environment>
  20. <!--生产环境-->
  21. <environment id="production">
  22. <transactionManager type="JDBC" />
  23. <dataSource type="POOLED">
  24. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  25. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  26. <property name="username" value="root"/>
  27. <property name="password" value="root"/>
  28. </dataSource>
  29. </environment>
  30. </environments>
  31. <mappers>
  32. <mapper resource="CarMapper.xml"/>
  33. </mappers>
  34. </configuration>

CarMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="car">
  6. <insert id="insertCar">
  7. insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
  8. </insert>
  9. </mapper>

ConfigurationTest.testEnvironment

  1. package com.dong.mybatis;
  2. import com.powernode.mybatis.pojo.Car;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import org.junit.Test;
  8. public class ConfigurationTest {
  9. @Test
  10. public void testEnvironment() throws Exception{
  11. // 准备数据
  12. Car car = new Car();
  13. car.setCarNum("133");
  14. car.setBrand("丰田霸道");
  15. car.setGuidePrice(50.3);
  16. car.setProduceTime("2020-01-10");
  17. car.setCarType("燃油车");
  18. // 一个数据库对应一个SqlSessionFactory对象
  19. // 两个数据库对应两个SqlSessionFactory对象,以此类推
  20. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  21. // 使用默认数据库
  22. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
  23. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  24. int count = sqlSession.insert("insertCar", car);
  25. System.out.println("插入了几条记录:" + count);
  26. // 使用指定数据库
  27. SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "dev");
  28. SqlSession sqlSession1 = sqlSessionFactory1.openSession(true);
  29. int count1 = sqlSession1.insert("insertCar", car);
  30. System.out.println("插入了几条记录:" + count1);
  31. }
  32. }

执行结果:

562d7d6857e94d2291708b7292dc485a.png

347b4ee08c654d8dadd0c5dd9910e1ff.png

4.2 transactionManager

mybatis-config2.xml :

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="dev">
  7. <environment id="dev">
  8. <transactionManager type="MANAGED"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="CarMapper.xml"/>
  19. </mappers>
  20. </configuration>

ConfigurationTest.testTransactionManager :

  1. @Test
  2. public void testTransactionManager() throws Exception{
  3. // 准备数据
  4. Car car = new Car();
  5. car.setCarNum("133");
  6. car.setBrand("丰田霸道");
  7. car.setGuidePrice(50.3);
  8. car.setProduceTime("2020-01-10");
  9. car.setCarType("燃油车");
  10. // 获取SqlSessionFactory对象
  11. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  12. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config2.xml"));
  13. // 获取SqlSession对象
  14. SqlSession sqlSession = sqlSessionFactory.openSession();
  15. // 执行SQL
  16. int count = sqlSession.insert("insertCar", car);
  17. System.out.println("插入了几条记录:" + count);
  18. }

当事务管理器是:JDBC

  • 采用JDBC的原生事务机制:

    • 开启事务:conn.setAutoCommit(false);
    • 处理业务……
    • 提交事务:conn.commit();

当事务管理器是:MANAGED

  • 交给容器去管理事务,但目前使用的是本地程序,没有容器的支持,当mybatis找不到容器的支持时:没有事务。也就是说只要执行一条DML语句,则提交一次。

4.3 dataSource

mybatis-config3.xml :

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="dev">
  7. <environment id="dev">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="UNPOOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="CarMapper.xml"/>
  19. </mappers>
  20. </configuration>

ConfigurationTest.testDataSource :

  1. @Test
  2. public void testDataSource() throws Exception{
  3. // 准备数据
  4. Car car = new Car();
  5. car.setCarNum("133");
  6. car.setBrand("丰田霸道");
  7. car.setGuidePrice(50.3);
  8. car.setProduceTime("2020-01-10");
  9. car.setCarType("燃油车");
  10. // 获取SqlSessionFactory对象
  11. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  12. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml"));
  13. // 获取SqlSession对象
  14. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  15. // 执行SQL
  16. int count = sqlSession.insert("insertCar", car);
  17. System.out.println("插入了几条记录:" + count);
  18. // 关闭会话
  19. sqlSession.close();
  20. }

当type是UNPOOLED,控制台输出:

7798085c35b339bff06bd897264fd255.png

修改配置文件mybatis-config3.xml中的配置:

mybatis-config3.xml :

  1. <dataSource type="POOLED">

Java测试程序不需要修改,直接执行,看控制台输出:

64e1e5c4d7edce24e633d96600f822fd.png

通过测试得出:UNPOOLED不会使用连接池,每一次都会新建JDBC连接对象。POOLED会使用数据库连接池。【这个连接池是mybatis自己实现的。】

mybatis-config3.xml:

  1. <dataSource type="JNDI">

JNDI的方式:表示对接JNDI服务器中的连接池。这种方式给了我们可以使用第三方连接池的接口。如果想使用dbcp、c3p0、druid(德鲁伊)等,需要使用这种方式。
这种再重点说一下type=”POOLED”的时候,它的属性有哪些?

mybatis-config3.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="dev">
  7. <environment id="dev">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. <!--最大连接数-->
  15. <property name="poolMaximumActiveConnections" value="3"/>
  16. <!--这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。-->
  17. <property name="poolTimeToWait" value="20000"/>
  18. <!--强行回归池的时间-->
  19. <property name="poolMaximumCheckoutTime" value="20000"/>
  20. <!--最多空闲数量-->
  21. <property name="poolMaximumIdleConnections" value="1"/>
  22. </dataSource>
  23. </environment>
  24. </environments>
  25. <mappers>
  26. <mapper resource="CarMapper.xml"/>
  27. </mappers>
  28. </configuration>

poolMaximumActiveConnections:最大的活动的连接数量。默认值10
poolMaximumIdleConnections:最大的空闲连接数量。默认值5
poolMaximumCheckoutTime:强行回归池的时间。默认值20秒。

poolTimeToWait:当无法获取到空闲连接时,每隔20秒打印一次日志,避免因代码配置有误,导致傻等。(时长是可以配置的)
当然,还有其他属性。对于连接池来说,以上几个属性比较重要。
最大的活动的连接数量就是连接池连接数量的上限。默认值10,如果有10个请求正在使用这10个连接,第11个请求只能等待空闲连接。
最大的空闲连接数量。默认值5,如何已经有了5个空闲连接,当第6个连接要空闲下来的时候,连接池会选择关闭该连接对象。来减少数据库的开销。
需要根据系统的并发情况,来合理调整连接池最大连接数以及最多空闲数量。充分发挥数据库连接池的性能。【可以根据实际情况进行测试,然后调整一个合理的数量。】
下图是默认配置:

9970FDF3-6A6A-4530-84A3-B72FE189124E.png

在以上配置的基础之上,可以编写java程序测试:

ConfigurationTest.testPool

  1. @Test
  2. public void testPool() throws Exception{
  3. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  4. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml"));
  5. for (int i = 0; i < 4; i++) {
  6. SqlSession sqlSession = sqlSessionFactory.openSession();
  7. Object selectCarByCarNum = sqlSession.selectOne("selectCarByCarNum");
  8. }
  9. }

CarMapper.xml :

  1. <select id="selectCarByCarNum" resultType="com.powernode.mybatis.pojo.Car">
  2. select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where car_num = '100'
  3. </select>

ecc7f1734eef469e8115377c3bec90cd.png

4.4 properties

mybatis提供了更加灵活的配置,连接数据库的信息可以单独写到一个属性资源文件中,假设在类的根路径下创建jdbc.properties文件,配置如下:

jdbc.properties :

  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/powernode

在mybatis核心配置文件中引入并使用:

mybatis-config4.xml :

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--引入外部属性资源文件-->
  7. <properties resource="jdbc.properties">
  8. <property name="jdbc.username" value="root"/>
  9. <property name="jdbc.password" value="root"/>
  10. </properties>
  11. <environments default="dev">
  12. <environment id="dev">
  13. <transactionManager type="JDBC"/>
  14. <dataSource type="POOLED">
  15. <!--${key}使用-->
  16. <property name="driver" value="${jdbc.driver}"/>
  17. <property name="url" value="${jdbc.url}"/>
  18. <property name="username" value="${jdbc.username}"/>
  19. <property name="password" value="${jdbc.password}"/>
  20. </dataSource>
  21. </environment>
  22. </environments>
  23. <mappers>
  24. <mapper resource="CarMapper.xml"/>
  25. </mappers>
  26. </configuration>

编写Java程序进行测试:

ConfigurationTest.testProperties :

  1. @Test
  2. public void testProperties() throws Exception{
  3. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  4. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config4.xml"));
  5. SqlSession sqlSession = sqlSessionFactory.openSession();
  6. Object car = sqlSession.selectOne("selectCarByCarNum");
  7. System.out.println(car);
  8. }

properties两个属性:

resource:这个属性从类的根路径下开始加载。【常用的。】

url:从指定的url加载,假设文件放在d:/jdbc.properties,这个url可以写成: file:///d:/jdbc.properties。注意是三个斜杠哦。

注意:如果不知道mybatis-config.xml文件中标签的编写顺序的话,可以有两种方式知道它的顺序:

  • 第一种方式:查看dtd约束文件。
  • 第二种方式:通过idea的报错提示信息。【一般采用这种方式】

4.5 mapper

mapper标签用来指定SQL映射文件的路径,包含多种指定方式,这里先主要看其中两种:
第一种:resource,从类的根路径下开始加载【比url常用】

mybatis-config4.xml :

  1. <mappers>
  2. <mapper resource="CarMapper.xml"/>
  3. </mappers>

如果是这样写的话,必须保证类的根下有CarMapper.xml文件。
如果类的根路径下有一个包叫做test,CarMapper.xml如果放在test包下的话,这个配置应该是这样写:

mybatis-config4.xml :

  1. <mappers>
  2. <mapper resource="test/CarMapper.xml"/>
  3. </mappers>

第二种:url,从指定的url位置加载
假设CarMapper.xml文件放在d盘的根下,这个配置就需要这样写:

mybatis-config4.xml :

  1. <mappers>
  2. <mapper url="file:///d:/CarMapper.xml"/>
  3. </mappers>

mapper还有其他的指定方式,后面再看!!!

发表评论

表情:
评论列表 (有 0 条评论,94人围观)

还没有评论,来说两句吧...

相关阅读