美文网首页Java
重学MyBatis(三):一文带你玩转MyBatis的xml配置

重学MyBatis(三):一文带你玩转MyBatis的xml配置

作者: 废柴程序员 | 来源:发表于2021-07-16 22:47 被阅读0次

    一、环境配置( environments)

    • MyBatis 可以配置成适应多种环境
    image.png
    • 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
    • Mybatis 默认的事务管理器是JDBC,连接池:POOLED
    • 多环境配置(实际开发中都是以这种方式来的)
    • ContextAplication.xml:
    <?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>
    
        <!--引入外部配置文件,这里文件名称要一样,properties文件一般我们放在resources目录下 -->
        <properties resource="application.properties">
        </properties>
    
        <environments default="prod">
            <!--设置默认的环境为开发环境  -->
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${dev.driver}"/>
                    <property name="url" value="${dev.url}"/>
                    <property name="username" value="${dev.username}"/>
                    <property name="password" value="${dev.password}"/>
                </dataSource>
            </environment>
            <!--测试环境用  -->
            <environment id="pre">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${pre.driver}"/>
                    <property name="url" value="${pre.url}"/>
                    <property name="username" value="${pre.username}"/>
                    <property name="password" value="${pre.password}"/>
                </dataSource>
            </environment>
            <!--生产环境用  -->
            <environment id="prod">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${prod.driver}"/>
                    <property name="url" value="${prod.url}"/>
                    <property name="username" value="${prod.username}"/>
                    <property name="password" value="${prod.password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/dy/mapper/UserMapper.xml"/>
        </mappers>
    </configuration>
    
    • application.properties:
    dev.driver = com.mysql.jdbc.Driver
    dev.url = jdbc:mysql://IP地址:3306/master?useSSL=false&amp;jeuc_2_1?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;testOnBorrow=true
    dev.username = root
    dev.password = 123456
    
    pre.driver = com.mysql.jdbc.Driver
    pre.url = jdbc:mysql://IP地址:3306/master?useSSL=false&amp;jeuc_2_1?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;testOnBorrow=true
    pre.username = root
    pre.password = 123456
    
    prod.driver = com.mysql.jdbc.Driver
    prod.url = jdbc:mysql://IP地址:3306/master?useSSL=false&amp;jeuc_2_1?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;testOnBorrow=true
    prod.username = root
    prod.password = 123456
    

    这个也是根据实际开发的需求来的,一般我们都是三套环境

    • dev 开发环境
    • pre 上线前转测环境
    • pro 线上环境

    整体目录结构如图:

    image.png
    • 这种方式可以让我们灵活地变换不同的配置文件!十分方便和简洁!
    • 这里的 ${url} 动态属性替换下面详解

    二、属性(properties)

    ①、外部动态替换

    • 先看下本来的配置文件
    image.png
    • 实际开发中我们可能是多个环境,如:dev(开发环境)、pre(准测环境)、prod(线上环境) 这可能会导致我们需要配置多个ContextAplication.xml核心配置文件,这种做法不可取。 Mybatis提供了动态配置替换的功能。
    • 使用如下: 新建配置文件:application.properties
    driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://IP地址:3306/master?useSSL=false&amp;jeuc_2_1?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;testOnBorrow=true
    username = root
    password = 123456
    
    image.png

    ContextAplication.xml文件修改

    <?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>
    
        <!--引入外部配置文件-->
        <properties resource="application.properties">
        </properties>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/dy/mapper/UserMapper.xml"/>
        </mappers>
    </configuration>
    

    对应关系:

    image.png

    好处:多环境配置可以ContextAplication.xml无需修改只需要配置application.properties文件,在实际开发中我们也是这样做的!方便测试和开发!

    • 执行结果成功:
    image.png

    ②、内部动态替换

    • 内部动态替换效果是一样的,但是没有外部配置文件的方式灵活!建议使用外部配置文件来进行灵活动态替换!
    image.png
    • 如果两种同时有呢?
    image.png
    • 内部密码瞎写是错误的,执行查看结果正常
    • 结论:优先走外面的properties文件


      image.png

    ③、方法中传入替换

    • SqlSessionFactoryBuilder.build() 方法中传入属性值
    • 我们可以先看下build这个方法的代码:
    image.png image.png

    可以看出来,可以传入inputStrem、envirnoment、properties等参数值。

    • inputStrem:字节流,这个没啥好说的,创建SqlSessionFactory必传的东西
    • envirnoment:指定的环境,跟** **保持中的id一致
    • properties:properties配置文件的设置

    具体案例如下:

    Properties properties=new Properties();
               //用的是磁盘符的绝对路径
               InputStream input = new BufferedInputStream(new FileInputStream("D:\\workSpace\\dyj-MyBatis-Project\\MyBatis-01-properties\\src\\main\\resources\\application.properties"));
               //加载到properties中
               properties.load(input);
               String resource = "ContextAplication.xml";
               InputStream inputStream = Resources.getResourceAsStream(resource);
               sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"prod",properties);
    
    • 打个断点瞅瞅:可以看见,properties文件成功被读取,所有数值都一样!
    image.png

    如果三种动态替换同时存在呢?顺序如下:

    • 首先读取在 properties 元素体内指定的属性。
    • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
    • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

    ④、占位符

    • 从 MyBatis 3.4.2 开始,可以为占位符指定一个默认值。
    • 前提条件:这个特性默认是关闭的。要启用这个特性,需要添加一个特定的属性来开启这个特性:
    <properties resource="application.properties">
            <!-- 启用默认值特性 -->
            <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
        </properties>
    
    • 语法格式如下:
     <!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 '123456' -->
    
            <environment id="prod">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${prod.driver}"/>
                    <property name="url" value="${prod.url}"/>
                    <property name="username" value="${prod.username}"/>
                    <property name="password" value="${prod.password:123456}"/>
                </dataSource>
            </environment>
    

    测试看看结果:

    • 去除所有关于密码的设置
    image.png
    • 执行结果如下:成功!
    image.png

    三、设置(settings)

    • 此内容不作重点讲解,了解基本概念即可!
    • 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
    image.png image.png image.png image.png
    image.png

    四、别名(typeAliases)

    ①、typeAlias

    • 语法格式如下:
        <typeAliases>
            <typeAlias type="com.dy.pojo.User" alias="hello"></typeAlias>
        </typeAliases>
    
    • type:实体类的具体位置

    • alias:设置别名

    • mapper.xml

    <select id="getUserInfo" resultType="hello">
       select * from user
    </select>
    
    • resultType:写上面设置的别名

    • 执行结果:

    image.png
    • 使用场景:实体类比较少的时候使用typeAlias当这样配置时,hello 可以用在任何使用 hello 的地方。

    ②、package

    • 语法格式如下:
        <typeAliases>
            <package name="com.dy.pojo"/>
        </typeAliases>
    
    • package:只需要指定到实体类所在目录即可,该表下的所有实体类名称的名字即是别名
    • mapper.xml
        <select id="getUserInfo" resultType="User">
            select * from user
        </select>
    
    • 执行结果
    image.png
    • 使用场景: 实体类多使用 package 第一种可以自定义,第二则不行,本身的名称即是它的别名,不区分大小写!

    ③、注解

    • 使用注解为实体类标明别名
    • 这个需要搭配着package来一起使用,当没有注解起别名时,本身名称就是别名
    • 当有@Alias("dayu")时,dayu就是它的别名
    • 语法格式如下:
    @Alias("dayu")
    
    • mapper.xml
        <select id="getUserInfo" resultType="dayu">
            select * from user
        </select>
    
    • resultType:别名
    • 执行结果如下:
    image.png
    • 使用场景: 我们一般搭配着 package 来一起使用
    • 下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
    image.png image.png

    五、映射器(mappers)

    既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。

    ①、resource(使用相对于类路径的资源引用)

    • 语法格式如下:
    <mappers>
        <mapper resource="com/dy/mapper/UserMapper.xml"/>
    </mappers>
    
    • 推荐使用,比较稳定,省心!
    • 结果正常:
    image.png

    ②、url(使用完全限定资源定位符)

    • 语法格式如下:
        <mappers>
            <mapper url="file:D:\workSpace\dyj-MyBatis-Project\MyBatis-01-properties\src\main\java\com\dy\mapper\UserMapper.xml"/>
        </mappers>
    
    • 通俗来讲就是文件位置绝对路径
    • 不推荐使用!换个环境可能就得改动!比较麻烦!
    • 结果正常:
    image.png

    ③、class(使用映射器接口实现类的完全限定类名)

    • 语法格式如下:
    <mappers>
        <mapper class="com.dy.mapper.UserMapper"/>
    </mappers>
    
    • 不推荐使用,还是有区别的,本来指定的是xml,这个指定的mapper文件
    • 接口和它的Mapper必须同名
    • 接口和他的Mapper必须在同一包下
    • 否则报错
    image.png
    • 改正后结果正常:
    image.png

    ④、name(将包内的映射器接口实现全部注册为映射器)

    • 语法格式如下:
        <mappers>
            <package name="com.dy.mapper"/>
        </mappers>
    
    • 不推荐使用
    • 接口和它的Mapper必须同名
    • 接口和他的Mapper必须在同一包下
    • 这个是指定到包目录下
    • 结果正常:
    image.png

    六、事务管理器(transactionManager)

    • 其实这个属于environments中的内容,但是我觉得有必要拿出来单独讲一讲!
    • 这个内容我觉得了解即可,我们大部分情况下用的都是第一种JDBC
    • 但是!我们要知道有MANAGED 这么个玩意存在!(面试的时候可能会被问到哦~)
    • 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
    • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
    • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
    <transactionManager type="MANAGED">
      <property name="closeConnection" value="false"/>
    </transactionManager>
    
    • 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

    七、配置的顺序(补充知识点)

    • 给大家分享一个好玩的东西,为啥不写在开头呢?因为只有自己试过才好玩呀!哈哈哈哈啊!
    • 将mapper的映射位置换到上面去:
    image.png

    报错,看提示:

    image.png

    总结顺序如下:

    • properties
    • settings
    • typeAliases
    • typeHandlers
    • objectFactory
    • objectWrapperFactory
    • reflectorFactory
    • plugins
    • environments
    • databaseIdProvider
    • mappers

    必须按照MyBatis规定的顺序来哦~否则会报错的哟!

    作者:大鱼丶
    原文链接:https://juejin.cn/post/6983847807656394760

    相关文章

      网友评论

        本文标题:重学MyBatis(三):一文带你玩转MyBatis的xml配置

        本文链接:https://www.haomeiwen.com/subject/jqhipltx.html