我在网络的每个角落搜索都没有结果。 我正在使用Spring并尝试将Jdbc操作注入到我的DaoImpl类中。
似乎我错过了一些东西,因为DaoImpl类在查询某些东西时返回null,我做错了什么?
Bean配置:
<bean id="transactionDao" class="jdbc.dao.OracleTransactionDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ORACLE CONNECTION -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${url}" />
<property name="username" value="${dbname}" />
<property name="password" value="${dbpassword}" />
</bean>
界面dao:
interface TransactionDao extends Serializable {
public abstract void insert (Transaction transaction);
正如您在bean配置中看到的,在下面的这个类中,我当前都在尝试注入JdbcTemplate并尝试使用JdbcDaoSupport的扩展方法 实施道:
OracleTransactionDao extends JdbcDaoSupport implements
TransactionDao {
@Autowired
JdbcTemplate template;
@Override
public void insert (Transaction transaction) {
List<Map<String, Object>> list;
try{
list = template
.queryForList("SELECT * FROM CUSTOMER");
}catch(NullPointerException e) {
list = this.queryForList("SELECT * FROM CUSTOMER");
}
System.out.println("called insert" + list.size());
}
我的主要人物: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( “beanConfigs.xml”); context.registerShutdownHook(); OracleTransactionDao dao =(OracleTransactionDao)上下文 .getBean( “transactionDao”);
我必须在这里遗漏一些细节吗?
提前致谢!
答案 0 :(得分:0)
我在评论中提到的单元测试。 弹簧context.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<bean id="transactionDao" class="jdbc.dao.TransactionDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<jdbc:embedded-database id="dataSource" type="H2" />
</beans>
TransactionDao:
public class TransactionDao extends JdbcDaoSupport {
@Autowired
private JdbcTemplate template;
public List<Map<String, Object>> insert() {
String sql = "CREATE TABLE REGISTRATION " +
"(id INTEGER not NULL, " +
" first VARCHAR(255), " +
" last VARCHAR(255), " +
" age INTEGER, " +
" PRIMARY KEY ( id ))";
template.execute(sql);
return template.queryForList("select * from registration");
}
}
TransactionDaoTest:
@ContextConfiguration(locations = {"classpath*:spring-context.xml"})
public class TransactionDaoTest extends AbstractTestNGSpringContextTests {
@Autowired
private TransactionDao transactionDao;
@Test
public void testJdbcTemplateNotNull(){
Assertions.assertThat(transactionDao.insert()).isNotNull();
}
}
pom.xml(不需要一些代码):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.187</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
答案 1 :(得分:0)
通过将上下文注入OracleTransactionDao
,基本上解决了这个问题OracleTransactionDao implements TransactionDao,
ApplicationContextAware {
private static JdbcOperations jdbc;
@Override
public void setApplicationContext (ApplicationContext context) {
this.jdbc = context.getBean(JdbcOperations.class);
}
我必须在beanConfig中添加所有内容
<bean id="transactionDao" class="jdbc.dao.OracleTransactionDao">
</bean>
如果有人有更好看的解决方案,请告知