Spring MVC 3.X解决一个web项目关联多个数据源(数据库)

dilipy 2011-09-23

[align=left][/align]今天项目里涉及到需要一个项目关联多个数据库。框架又是用的springMVC以前也没有整过。对spring的注解也多少有点了解。

首先介绍下单个的数据库连接配置。

jdbc.properties文件中的属性

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://172.17.0.68:3306/xh_bidding?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

jdbc.username=root

jdbc.password=

spring配置文件app-config.xml

<context:component-scan base-package="com.xxx.news" />
	<bean id="dataSource" name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
[color=red]<context:property-placeholder location="classpath:jdbc.properties" />[/color]	</bean>

spring先说明声明一个com.xxx.news下的全局变量既bean---dataSource。这个大家都懂的。里面是用EL表达式取值。红色的说明文件路径。

java-DAO代码

public abstract class BaseDAO extends Base {
	private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
		
	
	
	@Autowired
		public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
		this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				dataSource);
	}
		

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}
	
		public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
		return namedParameterJdbcTemplate;
	}
	
	}

默认情况下只需要这样写即可。spring的自动注入默认会根据类型来找到要注入的对象。既@Autowired

会找到dateSource这个bean。但是当发现有多个相同类型的bean时就不知道注入那一个了。默认好像会注入第一个。但是我不推荐默认写法,这样会让人混淆,不知道注入的对象和bean对象到底是通过什么方式关联的,很费解。

以上方式即可实现spring的单个数据源配置。

一下为多个数据源配置,其实没有想象中的那么复杂,当走通以后有点哭笑不得!但是摸出来还是值得的。

jdbc.properties文件中的属性

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://172.17.0.68:3306/xh_bidding?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

jdbc.username=root

jdbc.password=

#jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url2=jdbc:mysql://172.17.0.68:3306/xh_payment?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

jdbc.username2=root

#jdbc.password2=

spring配置文件app-config.xml

<context:component-scan base-package="com.xxx.news" />
	<bean id="dataSource" name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	<bean id="dataSource2" name="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url2}" />
		<property name="username" value="${jdbc.username2}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	<context:property-placeholder location="classpath:jdbc.properties" />

以上的意思没有什么变化

java代码DAO

public abstract class BaseDAO extends Base {
	private JdbcTemplate jdbcTemplate;
	private JdbcTemplate jdbcTemplate2;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate2;
	
	
	
	@Autowired
	@Resource(name="dataSource")
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
		this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				dataSource);
	}
	
	@Autowired
	@Resource(name="dataSource2")
	public void setDataSource2(DataSource dataSource2){
		this.jdbcTemplate2 = new JdbcTemplate(dataSource2);
		this.namedParameterJdbcTemplate2 = new NamedParameterJdbcTemplate(dataSource2);
	}
	
	

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}
	
	public JdbcTemplate getJdbcTemplate2() {
		return jdbcTemplate2;
	}

	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
		return namedParameterJdbcTemplate;
	}
	
	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate2() {
		return namedParameterJdbcTemplate2;
	}
}

当出现多个相同类型的bean时。需要指定所注入bean的name。这样就可以找到对应的bean对象。@Resource(name="dataSource")

以上jdbc连接方式也可以分开多个文件中写

这样即可实现。很简单,很方便!

感谢段总同志给予的指导。

相关推荐