2018-12-24 17:41:04 +08:00

426 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# spring 整合 jdbc template注解配置方式
1、创建标准web maven工程导入依赖
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.heibaiying</groupId>
<artifactId>spring-jdbc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring-base-version>5.1.3.RELEASE</spring-base-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!--jdbc 相关依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-base-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--单元测试相关依赖包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-base-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
</dependency>
</dependencies>
</project>
```
2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器
```java
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{ServletConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
```
3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties
```properties
# mysql 数据库配置
mysql.driverClassName=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mysql
mysql.username=root
mysql.password=root
```
```properties
# oracle 数据库配置
oracle.driverClassName=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名
oracle.username=用户名
oracle.password=密码
```
4、在新建数据库配置映射类DataSourceConfig.java
```java
package com.heibaiying.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* @author : heibaiying
* @description :
*/
@Configuration
@PropertySource(value = "classpath:mysql.properties")
@Data
public class DataSourceConfig {
@Value("${mysql.driverClassName}")
private String driverClassName;
@Value("${mysql.url}")
private String url;
@Value("${mysql.username}")
private String username;
@Value("${mysql.password}")
private String password;
}
```
5、新建ServletConfig.java进行数据库相关配置
```java
package com.heibaiying.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author : heibaiying
*/
@Configuration
@EnableTransactionManagement // 开启声明式事务处理 等价于xml中<tx:annotation-driven/>
@ComponentScan(basePackages = {"com.heibaiying.*"})
public class ServletConfig implements WebMvcConfigurer {
/**
* 配置数据源
*/
@Bean
public DriverManagerDataSource dataSource(DataSourceConfig sourceConfig) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(sourceConfig.getDriverClassName());
dataSource.setUrl(sourceConfig.getUrl());
dataSource.setUsername(sourceConfig.getUsername());
dataSource.setPassword(sourceConfig.getPassword());
return dataSource;
}
/**
* 配置jdbcTemplate
* @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为
* 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性
*/
@Bean
public JdbcTemplate jdbcTemplate(DriverManagerDataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
/**
* 定义事务管理器
*/
@Bean
public DataSourceTransactionManager transactionManager(DriverManagerDataSource dataSource) {
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
}
```
6、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表
```java
public interface MysqlDao {
List<Relation> get();
}
```
```java
package com.heibaiying.dao;
import com.heibaiying.bean.Relation;
import com.heibaiying.dao.impl.MysqlDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author : heibaiying
* @description :
*/
@Repository
public class MysqlDaoImpl implements MysqlDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 更多JDBC 的使用可以参考官方文档
* @see <a href="https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate">JdbcTemplate</a>
*/
public List<Relation> get() {
List<Relation> relations = jdbcTemplate.query("select * from help_keyword where help_keyword_id = ? ", new Object[]{691},
new RowMapper<Relation>() {
public Relation mapRow(ResultSet rs, int rowNum) throws SQLException {
Relation relation = new Relation();
relation.setId(rs.getString("help_keyword_id"));
relation.setName(rs.getString("name"));
return relation;
}
});
return relations;
}
}
```
```mysql
package com.heibaiying.dao.impl;
import com.heibaiying.bean.Flow;
import java.util.List;
/**
* @author : heibaiying
* @description :
*/
public interface OracleDao {
List<Flow> get();
}
```
```java
package com.heibaiying.dao;
import com.heibaiying.bean.Flow;
import com.heibaiying.dao.impl.OracleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author : heibaiying
* @description :
*/
@Repository
public class OracleDaoImpl implements OracleDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 更多JDBC 的使用可以参考官方文档
* @see <a href="https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate">JdbcTemplate</a>
*/
public List<Flow> get() {
List<Flow> flows = jdbcTemplate.query("select * from APEX_030200.WWV_FLOW_CALS where ID = ? ", new Object[]{217584603977429772L},
new RowMapper<Flow>() {
public Flow mapRow(ResultSet rs, int rowNum) throws SQLException {
Flow flow = new Flow();
flow.setId(rs.getLong("ID"));
flow.setFlowId(rs.getLong("FLOW_ID"));
flow.setPlugId(rs.getLong("PLUG_ID"));
return flow;
}
});
return flows;
}
}
```
7、新建测试类进行测试
```java
package com.heibaiying.dao;
import com.heibaiying.bean.Relation;
import com.heibaiying.config.DispatcherServletInitializer;
import com.heibaiying.config.ServletConfig;
import com.heibaiying.dao.impl.MysqlDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @author : heibaiying
* @description :
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class})
public class MysqlDaoTest {
@Autowired
private MysqlDao mysqlDao;
@Test
public void get() {
List<Relation> relations = mysqlDao.get();
if (relations != null) {
for (Relation relation : relations) {
System.out.println(relation.getId() + " " + relation.getName());
}
}
}
}
```
```java
package com.heibaiying.dao;
import com.heibaiying.bean.Flow;
import com.heibaiying.config.DispatcherServletInitializer;
import com.heibaiying.config.ServletConfig;
import com.heibaiying.dao.impl.OracleDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @author : heibaiying
* @description :
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class})
public class OracleDaoTest {
/*注入接口时: 如果接口有多个实现类 可以用这个指定具体的实现类*/
@Qualifier("oracleDaoImpl")
@Autowired
private OracleDao oracleDao;
@Test
public void get() {
List<Flow> flows = oracleDao.get();
if (flows != null) {
for (Flow flow : flows) {
System.out.println(flow.getId() + " " + flow.getPlugId());
}
}
}
}
```