Spring配置数据源
==============================================================
目录
===============================================================
1、使用JNDI数据源
Spring应用程序经常部署在Java EE应用服务器中,如WebSphere、JBoss或甚至像Tomcat这样的Web容器中。这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。
在服务器的server.xml的Context元素下配置Resource
/>
Java配置查找数据源
packagecn.ycx.config;importjavax.naming.NamingException;importjavax.sql.DataSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Profile;importorg.springframework.jndi.JndiObjectFactoryBean;
@Profile("PROD")
@Configurationpublic classJndiDataSourceConfig {
@Beanpublic DataSource dataSource() throwsIllegalArgumentException, NamingException {
System.out.println("JndiDataSourceConfig...");
JndiObjectFactoryBean jndi= newJndiObjectFactoryBean();
jndi.setJndiName("jdbc/mysql");
jndi.setResourceRef(true);//自动添加 java:comp/env/ 前缀
jndi.setProxyInterface(javax.sql.DataSource.class);
jndi.afterPropertiesSet();return(DataSource) jndi.getObject();
}
}
使用xml配置数据源时需要使用注解@ImportResource(value="classpath:context.xml")导入xml文件
@Profile("PROD")
@Configuration
@ImportResource(value="classpath:context.xml")
public class JndiDataSourceConfig
2、使用嵌入式数据源
packagecn.ycx.config;importjavax.sql.DataSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.ImportResource;importorg.springframework.context.annotation.Profile;importorg.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;importorg.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Profile("DEV")
@Configurationpublic classEmbededDataSourceConfig {
@BeanpublicDataSource dataSource() {
System.out.println("EmbededDataSourceConfig...");return newEmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:data.sql")
.build();
}
}
使用xml配置数据源时需要使用注解@ImportResource(value="classpath:context.xml")导入xml文件
@Profile("DEV")
@Configuration
@ImportResource(value="classpath:context.xml")public class EmbededDataSourceConfig
3、使用C3P0数据源
Java配置
packagecn.ycx.web.config;importjava.beans.PropertyVetoException;importjavax.sql.DataSource;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importcom.mchange.v2.c3p0.ComboPooledDataSource;
@Configurationpublic classDataSourceConfig {
@Bean(name="dataSource")public DataSource dataSource() throwsPropertyVetoException {
ComboPooledDataSource comboPooledDataSource= newComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql:///ycxdb?useUnicode=true&autoReconnect=true&rewriteBatchedStatements=TRUE");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("123456");
comboPooledDataSource.setInitialPoolSize(10);
comboPooledDataSource.setMinPoolSize(10);
comboPooledDataSource.setMaxPoolSize(50);
comboPooledDataSource.setMaxIdleTime(3600);//解决mysql timeout
comboPooledDataSource.setTestConnectionOnCheckout(false);
comboPooledDataSource.setTestConnectionOnCheckin(true);
comboPooledDataSource.setIdleConnectionTestPeriod(3600);returncomboPooledDataSource;
}
}
xml配置
使用数据源的Java业务代码
packagecn.ycx.service;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.Statement;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Random;importjavax.sql.DataSource;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;
@Servicepublic class IndexServiceImpl implementsIndexService {
@AutowiredprivateDataSource dataSource;
@Overridepublic List>get() {try{
List> list = new ArrayList>();
Map item = null;
Connection con=dataSource.getConnection();
Statement stm=con.createStatement();
ResultSet rs= stm.executeQuery("select id,username from user");while(rs.next()) {
item= new HashMap();
item.put("id", rs.getString("id"));
item.put("username", rs.getString("username"));
list.add(item);
}
rs.close();
stm.close();
con.close();returnlist;
}catch(Exception e) {
e.printStackTrace();
}return null;
}public Mapadd() {try{
Random r= newRandom();
LocalDateTime dt=LocalDateTime.now();
DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
Connection con=dataSource.getConnection();
PreparedStatement pstm= con.prepareStatement("insert into user(id,username)values(?,?)");
pstm.setString(1, dt.format(formatter));
pstm.setString(2, String.valueOf(r.nextInt()));int count =pstm.executeUpdate();
pstm.close();
con.close();
Map data = new HashMap();
data.put("status", String.valueOf(count));returndata;
}catch(Exception e) {
}return null;
}
}
注入数据源
@Autowired
private DataSource dataSource;
使用Connection con = dataSource.getConnection();取得链接