上一篇博客咱们介绍了mybatis的增删改查入门实例,咱们发如今 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,以下图,那么咱们如何改进这个写法呢?java
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=root
<?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="db.properties"> </properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 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> </configuration>
若是数据库有变化,咱们就能够经过修改 db.properties 文件来修改,而不用去修改 mybatis-configuration.xml 文件mysql
注意:咱们也能够在<properties></properties>中手动增长属性sql
<!-- 加载数据库属性文件 --> <properties resource="db.properties"> <property name="username" value="aaa"/> </properties>
那么这个时候是读取的username 是以 db.properties 文件中的 root 为准,仍是以本身配置的 aaa 为准呢?数据库
咱们先看一段 properties 文件加载的源码mybatis
private void propertiesElement(XNode context) throws Exception { if (context != null) { /** * 解析properties 属性中指定的属性。 */ Properties defaults = context.getChildrenAsProperties(); String resource = context.getStringAttribute("resource"); //resource 制定的属性路径 String url = context.getStringAttribute("url"); //url制定的属性路径 if (resource != null && url != null) { throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference. Please specify one or the other."); } /** * 根据 properties 元素中的 resource 属性读取类路径下属性文件,并覆盖properties 属性中指定的同名属性。 */ if (resource != null) { defaults.putAll(Resources.getResourceAsProperties(resource)); } else if (url != null) { /** * 根据properties元素中的url属性指定的路径读取属性文件,并覆盖properties 属性中指定的同名属性。 */ defaults.putAll(Resources.getUrlAsProperties(url)); } /** * 获取方法参数传递的properties * 建立XMLConfigBuilder实例时,this.configuration.setVariables(props); */ Properties vars = configuration.getVariables(); if (vars != null) { defaults.putAll(vars); } parser.setVariables(defaults); configuration.setVariables(defaults); } }
一、在 properties 内部自定义的属性值第一个被读取app
二、而后读取 resource 路径表示文件中的属性,若是有它会覆盖已经读取的属性;若是 resource 路径不存在,那么读取 url 表示路径文件中的属性,若是有它会覆盖第一步读取的属性值ui
三、最后读取 parameterType 传递的属性值,它会覆盖已读取的同名的属性this
前面两步好理解,第三步咱们能够举个例子来看:编码
咱们在 userMapper.xml 文件中进行模糊查询url
<select id="selectLikeUserName" resultType="com.ys.po.User" parameterType="String"> select * from user where username like '%${jdbc.username}%' <!-- select * from user where username like #{username} --> </select>
这个时候你会发现不管你后台传给这个查询语句什么参数,都是 select * from user where username like '%root%'
在 userMapper.xml 文件中,咱们能够看到resultType 和 parameterType 须要指定,这这个值每每都是全路径,不方便开发,那么咱们就能够对这些属性进行一些别名设置
1、定义单个别名
首先在全局配置文件 mybatis-configuration.xml 文件中添加以下配置:是在<configuration>标签下
<!-- 定义别名 --> <typeAliases> <typeAlias type="com.ys.po.User" alias="user"/> </typeAliases>
第二步经过 user 引用
2、批量定义别名
在全局配置文件 mybatis-configuration.xml 文件中添加以下配置:是在<configuration>标签下
<!-- 定义别名 --> <typeAliases> <!-- mybatis自动扫描包中的po类,自动定义别名,别名是类名(首字母大写或小写均可以,通常用小写) --> <package name="com.ys.po"/> </typeAliases>
引用的时候类名的首字母大小写均可以