基於註解的spring3 + jdbc開發環境搭建

來源:互聯網
上載者:User

最近面試屢次被虐,不是自己不思進取,是不會總結,不會理清思路,以至於過不了多久就忘記關了,面試官隨便問問傻眼,雖然有些東西是鋪天蓋地的多,但是從自己的腦子裡出來的才是自己的,於是乎還是寫下。

 

下面就寫下spring mvc下開發的配置,因為弄了好幾天沒出來,說了確實丟人,

這裡只是jdbc整合的部分,也是一直出錯的部分,mvc的配置哪天我在黏上來

 

 

不知道為什麼,在spring 3 裡面注入

jdbcTemplate時候我在設定檔裡引用dataSource熟悉老是報錯,說我的property datasource is required.

我用的是spring 3.0.5,我查了好多資料,別人的這麼配也是可以的。

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

dao:

package com.hmn.dao.manager;<br />import javax.annotation.Resource;<br />import javax.sql.DataSource;<br />import org.springframework.jdbc.core.JdbcTemplate;<br />import org.springframework.stereotype.Repository;<br />import com.hmn.dao.entity.User;<br />@Repository<br />public class UserDao extends JdbcTemplate {<br />@Resource<br />private JdbcTemplate jdbcTemplate;<br />public User getUserById(int id) {<br />User user = (User) jdbcTemplate.queryForObject(<br />"select * from user where id=?", new Object[] { id },<br />new UserRowMapper());<br />return user;<br />}<br />}<br />

 

但是我這卻一直報這個錯,不知道是不是在高版本裡改了實現還是怎麼說,後來我看一個spring視頻的時候得到啟示,

加了下面兩個地方

@Resource<br />private DataSource dataSource;<br />//public void setDataSource(DataSource dataSource) {<br />//this.jdbcTemplate = new JdbcTemplate(dataSource);<br />//}<br />/**<br /> * @author hoot<br /> * @return DataSource<br /> *<br /> * 可以不用setter,但是必須有getter,<br /> * 因為下面要給jdbcTemplate注入值<br /> */<br />public DataSource getDataSource() {<br />return this.dataSource;<br />}<br />

jdbcTemplate要從dataSource裡擷取串連等資訊是必然的,但是我就不明白為什麼前面的版本可以這麼寫

現在的卻為何不行。在UserDao裡面配置dataSource的get方法就可以給jdbcTemplate注入dataSource.

 

public JdbcTemplate(DataSource dataSource) {<br />setDataSource(dataSource);<br />afterPropertiesSet();<br />}

上面這是jdbcTemplate源碼裡的建構函式,從上面可以看出,DataSource是從這裡注入的,也就是你不提供

getDataSource方法也同樣報錯的緣故,因為雖然你注入了DataSource,但是沒有提供dataSource的訪問器函數,

spring無法給你的JdbcTemplate建構函式注入參數。所以提示你,dataSource is required,那為什麼我在

jdbcTemplate的源碼裡看不到任何DataSource的屬性呢,嘿嘿,請看下面兩處你就明白了,

 

public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {}<br />注意下面<br />public abstract class JdbcAccessor implements InitializingBean {<br />/** Logger available to subclasses */<br />protected final Log logger = LogFactory.getLog(getClass());<br />private DataSource dataSource;<br />...<br />}<br />JdbcTemplate繼承了JdbcAccessor,主義accessor裡面的DataSource屬性

 

現在終於明白了為什麼注入熟悉跟建構函式注入參數他都可以

package com.hmn.dao.manager;<br />import javax.annotation.Resource;<br />import javax.sql.DataSource;<br />import org.springframework.jdbc.core.JdbcTemplate;<br />import org.springframework.stereotype.Repository;<br />import com.hmn.dao.entity.User;<br />@Repository<br />public class UserDao extends JdbcTemplate {<br />@Resource<br />private JdbcTemplate jdbcTemplate;<br />@Resource<br />private DataSource dataSource;<br />//public void setDataSource(DataSource dataSource) {<br />//this.jdbcTemplate = new JdbcTemplate(dataSource);<br />//}<br />/**<br /> * @author hoot<br /> * @return DataSource<br /> *<br /> * 可以不用setter,但是必須有getter,<br /> * 因為下面要給jdbcTemplate注入值<br /> */<br />public DataSource getDataSource() {<br />return this.dataSource;<br />}<br />public User getUserById(int id) {<br />User user = (User) jdbcTemplate.queryForObject(<br />"select * from user where id=?", new Object[] { id },<br />new UserRowMapper());<br />return user;<br />}<br />}

部落格已搬到http://marspring.mobi/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.