返回介绍

3.1 properties 元素

发布于 2025-04-26 13:08:32 字数 3533 浏览 0 评论 0 收藏

properties 是一个配置属性的元素,让我们能在配置文件的上下文中使用它。

MyBatis 提供 3 种配置方式。

  • property 子元素。

  • properties 配置文件。

  • 程序参数传递。

3.1.1 property 子元素

property 子元素的配置方法如代码清单 3-2 所示。

代码清单 3-2:property 子元素配置

<properties>
  <property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  <property name="username" value="root"/>
  <property name="password" value="learn"/>
</properties>

这样我们就可以在上下文中使用已经配置好的属性值了。我们配置数据库时就可以按照代码清单 3-3 进行配置。

代码清单 3-3:配置参数在配置文件中的使用

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

3.1.2 properties 配置文件

更多时候,我们希望使用 properties 配置文件来配置属性值,以方便我们在多个配置文件中重复使用它们,也方便日后维护和随时修改,这些在 MyBatis 中是很容易做到的,我们先来看一下 properties 文件,如代码清单 3-4 所示。

代码清单 3-4:properties 文件的使用

#数据库配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=learn

我们把这个 properties 文件放在源包下,只要这样引入这个配置文件即可。

<properties resource="jdbc.properties"/>

3.1.3 程序参数传递

在实际工作中,我们常常遇到这样的问题:系统是由运维人员去配置的,生产数据库的用户密码对于开发者而言是保密的,而且为了安全,运维人员要求对配置文件中的数据库用户和密码进行加密,这样我们的配置文件中往往配置的是加密过后的数据库信息,而无法通过加密的字符串去连接数据库,这个时候可以通过编码的形式来满足我们遇到的场景。

下面假设 jdbc.properties 文件中的 username 和 password 两个属性使用了加密的字符串,这个时候我们需要在生成 SqlSessionFactory 之前将它转化为明文,而系统已经提供了解密的方法 decode(str),让我们来看看如何使用代码的方式来完成 SqlSessionFactory 的创建,如代码清单 3-5 所示。

代码清单 3-5:程序传递参数构建 SqlSessionFactory

InputStream cfgStream = null;
        Reader cfgReader = null;
        InputStream proStream = null;
        Reader proReader = null;
        Properties properties = null;
        try {
            //读入配置文件流
            cfgStream = Resources.getResourceAsStream("mybatis-config. xml");
            cfgReader = new InputStreamReader(cfgStream);
            //读入属性文件
            proStream = Resources.getResourceAsStream("jdbc.properties");
            proReader = new InputStreamReader(proStream);
            properties = new Properties();
            properties.load(proReader);
            //解密为明文
            properties.setProperty("username", decode(properties.getProperty("username")));
            properties.setProperty("password", decode(properties.getProperty("password")));
        } catch (IOException ex) {
            Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        synchronized(CLASS_LOCK) {
            if (sqlSessionFactory == null) { 
                //使用属性来创建 SqlSessionFactory
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader, properties);
            }
        }

这样我们完全可以在 jdbc.properties 配置密文,满足对系统安全的要求。

3.1.4 优先级

MyBatis 支持的 3 种配置方式可能同时出现,并且属性还会重复配置。这 3 种方式是存在优先级的,MyBatis 将按照下面的顺序来加载。

1. 在 properties 元素体内指定的属性首先被读取。

2. 根据 properties 元素中的 resource 属性读取类路径下属性文件,或者根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。

3. 读取作为方法参数传递的属性,并覆盖已读取的同名属性。

因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。因此,实际操作中我们需要注意以下 3 点。

1. 不要使用混合的方式,这样会使得管理混乱。

2. 首选的方式是使用 properties 文件。

3. 如果我们需要对其进行加密或者其他加工以满足特殊的要求,不妨按示例的方法处理。这样做的好处是使得配置都来自于同一个配置文件,就不容易产生没有必要的歧义,也为日后统一管理提供了方便。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。