Spring MVC 3.X解决一个web项目关联多个数据源(数据库)
[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连接方式也可以分开多个文件中写
这样即可实现。很简单,很方便!
感谢段总同志给予的指导。