MyBatis二properties属性

作者: 一觉睡到丶小时候 | 来源:发表于2019-09-30 15:08 被阅读0次

    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">
    <!-- mybatis的基本配置文件:主要配置基本的上下文参数和运行环境 -->
    <configuration>
        <!--配置-->
        <properties></properties>
        <!--设置 -->
        <settings></settings>
        <!--类型命名 -->
        <!--别名:pojo对象的别名 -->
        <typeAliases>
            <typeAlias alias="user" type="com.daily.pojo.User"></typeAlias>
            <typeAlias alias="product" type="com.daily.pojo.Product"></typeAlias>
        </typeAliases>
        <!--类型处理器 -->
        <typeHandlers></typeHandlers>
        <!--对象工厂 -->
        <objectFactory></objectFactory>
        <!--插件 -->
        <plugins></plugins>
        <!-- 环境模式:development开发模式 work工作模式 -->
        <environments default="development">
            <!--环境变量 -->
            <environment id="development">
                <!--事务管理器 -->
                <transactionManager type="JDBC" />
                <!--数据源 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${db.driver}" />
                    <property name="url" value="${db.url}" />
                    <property name="username" value="${db.username}" />
                    <property name="password" value="${db.pwd}" />
                </dataSource>
            </environment>
        </environments>
        <!--数据库厂商标示 -->
        <databaseIdProvider></databaseIdProvider>
        <!-- 映射器 -->
        <mappers>
            <mapper resource="com/daily/mapper/UserMapper.xml" />
            <mapper resource="com/daily/mapper/ProductMapper.xml" />
        </mappers>
    </configuration>
    

    以上就是所有的配置项,需要注意的是配置项的顺序不能颠倒,如果颠倒了它们的顺序,在MyBatis的自启动阶段会发生异常,导致程序无法运行。

    首先properties的使用方式有三种:

    • property子元素:就是在properties属性中增加子属性property,从而设置一些配置的key-value;

    • properties文件:就是直接使用properties引入外部配置文件,相当于将子属性抽取成一个独立的外部文件引入;

    • 程序代码传递参数:就是通过代码的方式设置该配置相关的信息,如数据库配置文件中的用户名和密码一般是密文,但是连接数据库时需要对配置进行解密,此时就只能通过程序代码的方式配置了;

    下面以数据库配置为例,来实现这三种不同的配置方式:

    ⚠️注意:因为是单独介绍,所以这里显示properties的配置,不显示其他配置项

    一、property子元素

     <properties>
        <property name="db.driver" value="org.postgresql.Driver"></property>
        <property name="db.url" value="jdbc:postgresql://localhost:5433/postgres"></property>
        <property name="db.username" value="postgres"></property>
        <property name="db.pwd" value="postgres"></property>
     </properties>
    

    这种配置方式的缺点是,如果配置项很多,那么就会让配置文件显得很庞大,为了解决这个缺点,我们可以使用下面的配置方式👇

    二、properties文件

    首先将上述配置中的所有property属性提取到一个叫做db.properties的配置文件中,如下图所示:

     #postgresql
     db.driver=org.postgresql.Driver
     db.url=jdbc:postgresql://localhost:5433/postgres
     db.username=cG9zdGdyZXM=
     db.pwd=aHljMTIz
    

    然后将该文件引入MyBatis配置文件

     <properties resource="db.properties" />
    

    这样就相当于将db.properties中的所有配置都加载到MyBatis的配置文件中了,但是这种使用方式也存在它的缺点,当外部配置文件中的值需要加密时,如连接数据库的用户名和密码,无法在配置文件中进行解密,所以只能通过程序代码传递的方式,就是要介绍的第三种,如下👇

    三、程序代码方式传递参数

    其实这种方式一般会和第二种配合使用,作用对特殊配置进行覆盖或重写,以上面的db.properties为例,在使用到数据库配置信息时对配置中的用户名和密码进行解密。这里举个MyBatis中获取SqlSessionFactory的例子:

    public static SqlSessionFactory getSqlSessionFactoryByXml() {
            synchronized (Lock) {
                if (null != sqlSessionFactory) {
                    return sqlSessionFactory;
                }
                String resource = "mybatis-config.xml";
                InputStream inputStream;
                InputStream is = null;
                try {
                    // 加载数据库配置文件
                    is = Resources.getResourceAsStream("db.properties");
                    Properties properties = new Properties();
                    properties.load(is);
    
                    // 获取加密信息
                    String userName = properties.getProperty("db.username");
                    String pwd = properties.getProperty("db.pwd");
    
                    // 解密用户名和密码,并重置属性
                    properties.setProperty("db.username", CyperTool.decodeByBase64(userName));
                    properties.setProperty("db.pwd", CyperTool.decodeByBase64(pwd));
                    // 读取mybatis配置文件
                    inputStream = Resources.getResourceAsStream(resource);
                    // 通过SqlSessionFactoryBuilder类的builder方法进行构建,并使用程序传递的方式覆盖原有属性
                    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
                return sqlSessionFactory;
            }
        }
    

    上面的代码中:

    1⃣️11~13行是加载数据库配置文件

    2⃣️16、17行是获取加密配置

    3⃣️20、21行是解密数据并重新设置到配置文件中

    4⃣️25行通过传递配置文件完成重写

    以上就是properties属性的所有内容,一般来说如果不加密,会使用第二种方式,这样降低维护的耦合性,如果有加密信息,则使用第三种。

    相关文章

      网友评论

        本文标题:MyBatis二properties属性

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