app开发者平台在数字化时代的重要性与发展趋势解析
504
2022-12-28
Mybatis配置之<properties>属性配置元素解析
紧接着上篇博客《Mybatis的配置文件入门介绍》,我们开始对mybatis核心配置文件中的各个元素进行详细的说明,在这篇文章中,我们首先来看下
我们先将之前的配置文件在这里拷贝一份,以便对比观察,如下所示:
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 属性值有三种方式书写,接下来我们一个一个的看 (1)通过 之前的配置文件中 <!DOhttp://CTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 这样,我们就在需要配置的地方统一到了 (2)通过 这里我们不用
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 而 使用配置文件的方式,可以使得一次配置在多个地方重复使用,不需要在不同的项目中CTRL+C和CTRL+V了。 (3)通过在初始化的时候,以代码的方式传入Properties类实例 具体如下所示: package com.majing.learning.mybatis; import java.io.IOException; import java.util.Properties; import junit.framework.TestCase; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.majing.learning.mybatis.dao.UserDao; import com.majing.learning.mybatis.entity.User; public class UserDaoTest1 extends TestCase{ @Test public void testFindUserById(){ SqlSession sqlSession = getSessionFactory().openSession(true); UserDao userMapper = sqlSession.getMapper(UserDao.class); User user = userMapper.findUserById(10); System.out.println("记录为:"+user); } // Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互 private sPgRUwVDJkwtatic SqlSessionFactory getSessionFactory() { SqlSessionFactory sessionFactory = null; String resource = "configuration.xml"; try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource), buildInitProperties()); } catch (IOException e) { e.printStackTrace(); } return sessionFactory; } private static Properties buildInitProperties(){ Properties properties = new Properties(); properties.put("driver", "com.mysql.jdbc.Driver"); properties.put("url", "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"); properties.put("username", "root"); properties.put("password", "root"); return properties; } } 从上可以看出,在创建SqlSessionFactory的时候,人为写代码传入了一套属性配置。 上面三种方式都可以实现相同的功能,那就是给mybatis初始化的时候设置一系列的属性值以供使用。 但是这三者又有什么区别呢? 通过查看源码,一个直观的感觉就是这三种配置是有优先级关系的且不同方式配置的配置项是可以并存的,优先级次序如下:第三种方式>第二种方式>第一种方PgRUwVDJkw式。 即如果三种方式都配置了同一个配置项,那么优先级高的配置方式的配置值生效。 这主要还是因为mybats的源码解析过程导致的。 下面我们看下具体的解析逻辑: private void propertiesElement(XNode context) throws Exception { if (context != null) { Properties defaults = context.getChildrenAsProperties(); String resource = context.getStringAttribute("resource"); String url = context.getStringAttribute("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."); } if (resource != null) { defaults.putAll(Resources.getResourceAsProperties(resource)); } else if (url != null) { defaults.putAll(Resources.getUrlAsProperties(url)); } Properties vars = configuration.getVariables(); if (vars != null) { defaults.putAll(vars); } parser.setVariables(defaults); configuration.setVariables(defaults); } } 从代码看, 同时,解析的时候是先解析的 在这之后,开始判断是否有第三种方式的属性配置,如果有,则将相关配置添加到之前的属性集合中,如果存在同名的配置也进行覆盖。这样的逻辑也是导致为什么会有优先级的直接原因。
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
属性值有三种方式书写,接下来我们一个一个的看
(1)通过
之前的配置文件中
<!DOhttp://CTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
这样,我们就在需要配置的地方统一到了
(2)通过
这里我们不用
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
而
使用配置文件的方式,可以使得一次配置在多个地方重复使用,不需要在不同的项目中CTRL+C和CTRL+V了。
(3)通过在初始化的时候,以代码的方式传入Properties类实例
具体如下所示:
package com.majing.learning.mybatis;
import java.io.IOException;
import java.util.Properties;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.majing.learning.mybatis.dao.UserDao;
import com.majing.learning.mybatis.entity.User;
public class UserDaoTest1 extends TestCase{
@Test
public void testFindUserById(){
SqlSession sqlSession = getSessionFactory().openSession(true);
UserDao userMapper = sqlSession.getMapper(UserDao.class);
User user = userMapper.findUserById(10);
System.out.println("记录为:"+user);
}
// Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
private sPgRUwVDJkwtatic SqlSessionFactory getSessionFactory() {
SqlSessionFactory sessionFactory = null;
String resource = "configuration.xml";
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource), buildInitProperties());
} catch (IOException e) {
e.printStackTrace();
}
return sessionFactory;
}
private static Properties buildInitProperties(){
Properties properties = new Properties();
properties.put("driver", "com.mysql.jdbc.Driver");
properties.put("url", "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8");
properties.put("username", "root");
properties.put("password", "root");
return properties;
}
}
从上可以看出,在创建SqlSessionFactory的时候,人为写代码传入了一套属性配置。
上面三种方式都可以实现相同的功能,那就是给mybatis初始化的时候设置一系列的属性值以供使用。
但是这三者又有什么区别呢?
通过查看源码,一个直观的感觉就是这三种配置是有优先级关系的且不同方式配置的配置项是可以并存的,优先级次序如下:第三种方式>第二种方式>第一种方PgRUwVDJkw式。
即如果三种方式都配置了同一个配置项,那么优先级高的配置方式的配置值生效。
这主要还是因为mybats的源码解析过程导致的。
下面我们看下具体的解析逻辑:
private void propertiesElement(XNode context) throws Exception {
if (context != null) {
Properties defaults = context.getChildrenAsProperties();
String resource = context.getStringAttribute("resource");
String url = context.getStringAttribute("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.");
}
if (resource != null) {
defaults.putAll(Resources.getResourceAsProperties(resource));
} else if (url != null) {
defaults.putAll(Resources.getUrlAsProperties(url));
}
Properties vars = configuration.getVariables();
if (vars != null) {
defaults.putAll(vars);
}
parser.setVariables(defaults);
configuration.setVariables(defaults);
}
}
从代码看,
同时,解析的时候是先解析的
在这之后,开始判断是否有第三种方式的属性配置,如果有,则将相关配置添加到之前的属性集合中,如果存在同名的配置也进行覆盖。这样的逻辑也是导致为什么会有优先级的直接原因。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~