3.1 properties 元素
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论