SpringBoot與jdbcTemplate結合遇到的一些問題


問題設計的關鍵類及方法:

如下

@Repository(value = "bardao")//value的作用在於給該Bean(BarDao)命名
public class BarDao {

public static final Log LOGGER = LogFactory.getLog(Application.class);

@Autowired private JdbcTemplate jdbcTemplate;
//如下方法是首先先數據庫里面插入一條記錄

public Bar add(Bar bar) {
String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info(
"bar.gerId() is " + bar.getId());
//jdbcTemplate
= new JdbcTemplate();//這樣做的目的是問了解決jdbcTemplate無法注入而使得jdbcTemplate=null臨時采用的一種辦法,詳見問題1
System.
out.println("jdbcTemplate:"+jdbcTemplate);//通過應用程序上下文的方式,在獲取bardao這個bean的時候則可以實現自動注入,通過@Autowire這個注解使得jdbcTemplate自動注入
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

 

 

問題1:使用@Autowired標注時,jdbcTemlate==null;

 

原因:經過自己的測試之后發現,不在注解@Autowired本身,而在於包含該JdbcTemlate的Bean(BarDao)生成實例的方式。

  1.如果采用new 方式來生成實例,則會出現null的情況。new方式:BarDao bd = new BarDao();、

public void test(){
Bar bar = new Bar(1, 34, "天堂島");
BarDao bd = new BarDao();
bd.add(bar);
}

對應add方法

public Bar add(Bar bar) {
String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info("bar.gerId() is " + bar.getId());
jdbcTemplate = new JdbcTemplate();//不這樣做jdbcTemplate==null
System.out.println("jdbcTemplate:"+jdbcTemplate);//通過應用程序上下文的方式獲取bardao這個bean的時候則可以實現自動注入
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

解決:如果采用應用程序上下文獲取bean的方式,則不會出現null的情況。通過應用程序上下文獲取bean的方式:  

public void test(){
Bar bar = new Bar(1, 34, "天堂島");
BarDao bd = (BarDao) SpringContextUtil.getBean("bardao");
bd.add(bar);
}

       注:點擊查看SpringContextUtil工具類代碼  

對應add方法

public Bar add(Bar bar) {
String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info("bar.gerId() is " + bar.getId());
System.out.println("jdbcTemplate:"+jdbcTemplate);//jdbcTemplate實現了自動注入,所以jdbcTemplate != null
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

 

 

問題2:出現 java.lang.IllegalArgumentException: No DataSource specified

 

原因:是基於上一個問題而出現的。大概是這樣,使用了new方式來生成實例,導致jdbcTemplate無法注入使得JdbcTemplate=null。這時我便急中生智,既然等於空,那我就同樣new一個jdbcTemplate不就行了。其實在這樣做的時候,我也在想一個問題,我在jdbcTemplate上標注的那個@Autowired注解有何用?但沒辦法,此時我沒有其他更好的辦法了,於是我就這樣試了一試。我抱着一絲的殘念,祈禱上蒼,結果就是出現了No dataSource specified這個異常。

 

解決:方式就是第一個問題的解決方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM