spring jdbcdaosupport返回null

时间:2015-06-12 20:11:01

标签: spring jdbc dao jdbctemplate

我在网络的每个角落搜索都没有结果。 我正在使用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”);

我必须在这里遗漏一些细节吗?

提前致谢!

2 个答案:

答案 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>

如果有人有更好看的解决方案,请告知