• 跟着老杜学MyBatis+第4天+MyBatis核心配置文件详解


    MyBatis核心配置文件详解

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <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"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <mapper resource="CarMapper.xml"/>
            <mapper resource="CarMapper2.xml"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 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

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        
        
        
        <environments default="production">
            
            <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"/>
                dataSource>
            environment>
            
            <environment id="production">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <mapper resource="CarMapper.xml"/>
        mappers>
    configuration>
    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="car">
        <insert id="insertCar">
            insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
        insert>
    mapper>
    package com.powernode.mybatis;
    
    import com.powernode.mybatis.pojo.Car;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class ConfigurationTest {
    
        @Test
        public void testEnvironment() throws Exception{
            // 准备数据
            Car car = new Car();
            car.setCarNum("133");
            car.setBrand("丰田霸道");
            car.setGuidePrice(50.3);
            car.setProduceTime("2020-01-10");
            car.setCarType("燃油车");
    
            // 一个数据库对应一个SqlSessionFactory对象
            // 两个数据库对应两个SqlSessionFactory对象,以此类推
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    
            // 使用默认数据库
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            int count = sqlSession.insert("insertCar", car);
            System.out.println("插入了几条记录:" + count);
    
            // 使用指定数据库
            SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "dev");
            SqlSession sqlSession1 = sqlSessionFactory1.openSession(true);
            int count1 = sqlSession1.insert("insertCar", car);
            System.out.println("插入了几条记录:" + count1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    执行结果:

    img

    img

    4.2 transactionManager

    
    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>
    @Test
    public 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    当事务管理器是:JDBC

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

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

    当事务管理器是:MANAGED

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

    4.3 dataSource

    
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    @Test
    public 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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    当type是UNPOOLED,控制台输出:

    img

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

    <dataSource type="POOLED">
    
    • 1

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

    img

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

    <dataSource type="JNDI">
    
    • 1

    JNDI的方式:表示对接JNDI服务器中的连接池。这种方式给了我们可以使用第三方连接池的接口。如果想使用dbcp、c3p0、druid(德鲁伊)等,需要使用这种方式。

    这种再重点说一下type="POOLED"的时候,它的属性有哪些?

    
    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"/>
                    
                    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    poolMaximumActiveConnections:最大的活动的连接数量。默认值10

    poolMaximumIdleConnections:最大的空闲连接数量。默认值5

    你招了十个工人,但是订单量只够一些人干,所以有员工空闲,你最多能容忍五个员工空闲,再空闲一个你就把他开除

    在这里插入图片描述

    poolMaximumCheckoutTime:强行回归池的时间。默认值20秒。

    poolTimeToWait:当无法获取到空闲连接时,每隔20秒打印一次日志,避免因代码配置有误,导致傻等。(时长是可以配置的)

    当然,还有其他属性。对于连接池来说,以上几个属性比较重要。

    最大的活动的连接数量就是连接池连接数量的上限。默认值10,如果有10个请求正在使用这10个连接,第11个请求只能等待空闲连接。

    最大的空闲连接数量。默认值5,如何已经有了5个空闲连接,当第6个连接要空闲下来的时候,连接池会选择关闭该连接对象。来减少数据库的开销。

    需要根据系统的并发情况,来合理调整连接池最大连接数以及最多空闲数量。充分发挥数据库连接池的性能。【可以根据实际情况进行测试,然后调整一个合理的数量。】

    下图是默认配置:

    img

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

    @Test
    public 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    img

    4.4 properties

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

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

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

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        
        <properties resource="jdbc.properties">
            <property name="jdbc.username" value="root"/>
            <property name="jdbc.password" value="root"/>
        properties>
    
        <environments default="dev">
            <environment id="dev">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <mapper resource="CarMapper.xml"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    编写Java程序进行测试:

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

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

    如果是这样写的话,必须保证类的根下有CarMapper.xml文件。

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

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

    第二种:url,从指定的url位置加载

    假设CarMapper.xml文件放在d盘的根下,这个配置就需要这样写:

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

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

  • 相关阅读:
    使用shell生成指定范围日期序列
    授权规则及规则持久化
    万宾科技管网水位监测预警,管网水位的特点有哪些?
    【js】日时分秒倒计时
    ArcGIS Pro发布地图服务(影像、矢量)
    postgresql13 安装postgis timescaledb
    蓝牙学习五(广播包分析wireshark)
    Vue3 学习笔记 —— 破坏式更新、自定义指令 directive
    【开源库推荐】go-linq 强大的语言集成查询库如,ORM一般丝滑处理内存数据
    [Pandas] 数据连接pd.concat
  • 原文地址:https://blog.csdn.net/qq_38689263/article/details/127569048