- PR -

SpringのJdbcTemplateでDBアクセス

投稿者投稿内容
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-09-12 01:04
こんにちは。
Spring Frameworkを利用したDBアクセスをしたいのですが、
Spring自体初めてで超初心者です。

Spring実装に当たり以下を設定しました。

○WEB-INF/lib/spring.jarの追加

○WEB-INF/spring-context.xmlを追加
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!-- This is beans.xml for springsample -->
<beans>
<!-- datasource -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" ><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@machinmei:1521:dbname</value></property>
<property name="username"><value>scott</value></property>
<property name="password"><value>tiger</value></property>
</bean>
</beans>

○web.xmlを編集追加
<web-app>
..
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
..

○接続テストソース部
DataSource dataSource = null;

StringBuffer sql = new StringBuffer();
sql.append("UPDATE A_TABLE SET");
sql.append(" NAME = '1'");
sql.append(" WHERE ID = ?");
JdbcTemplate jt = new JdbcTemplate(this.dataSource);
jt.update(sql.toString(),new Object[]{usrId});

これで実行すると以下のエラーが出ました。
java.lang.IllegalArgumentException: dataSource is required

Springを使わずに同じDBアクセスで行った場合、正常に動いた為
スペルミスは無いと思います。
また、DBはオラクル9.2を利用しています。
設定を読み込めていない初歩的な質問かと思います(dataSource = nullが・・)が、
ご教授お願いします。
でるびすた
常連さん
会議室デビュー日: 2005/06/15
投稿数: 22
投稿日時: 2006-09-12 09:22
基本的に使い方が間違ってます。
@JdbcDaoSupport を継承したクラスを作って、
AdataSource を spring-context.xml の中で@のクラスにセットして、
BgetJdbcTemplate() を使ってSQLを実行しましょう。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-09-12 10:33
ありがとうございます。

おっしゃるように変更し実行してみました。

変えた部分は以下です。
○WEB-INF/spring-context.xmlを編集追加
<bean id="DBTouch"
class="common.util.DBTouch">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>

○接続テストソース部
public class DBTouch extends JdbcDaoSupport {
..
StringBuffer sql = new StringBuffer();
sql.append("UPDATE A_TABLE SET");
sql.append(" NAME = '1'");
sql.append(" WHERE ID = ?");
getJdbcTemplate().update(sql.toString(),new Object[]{usrId});

で実行してみました。
すると、NullPointerExceptionでエラーになりました。
デバックで引数にはちゃんと格納されたデータだったので、
他の値だと思うのですが、何が影響されているか見当もつきません。

ご教授お願いできないでしょうか?
ちなみにソース内のdataSource部は削除しましたが・・。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-12 10:47
引用:

かんぱちさんの書き込み (2006-09-12 10:33) より:
すると、NullPointerExceptionでエラーになりました。
デバックで引数にはちゃんと格納されたデータだったので、
他の値だと思うのですが、何が影響されているか見当もつきません。



スタックトレースと例外発生箇所のソースの抜粋ぐらいは提示しましょうね。
何が問題なのか見当もつきません
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-09-12 11:35
失礼しました。

こんな内容です。

java.lang.NullPointerException
at common.util.DBTouch.login(DBTouch.java:157)
at common.login.LoginAction.perform(LoginAction.java:38)
at common.util.UtilBaseAction.execute(UtilBaseAction.java:32)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at common.util.EncodingFilter.doFilter(EncodingFilter.java:16)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)

xml定義のせいでしょうか?自分で作ったソース部いがいの
Springが表示されていませんので、記述ミスかなと思っているのですが・・。
DBTouch.java:157行目が、

getJdbcTemplate().update(sql.toString(),new Object[]{usrId});

です。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-12 12:59
引用:

DBTouch.java:157行目が、

getJdbcTemplate().update(sql.toString(),new Object[]{usrId});

です。


ならばgetJdbcTemplate()がnullを返すのかsqlがnullかのどちらかでしょう。

引用:

xml定義のせいでしょうか?自分で作ったソース部いがいの
Springが表示されていませんので、記述ミスかなと思っているのですが・・。


SpringFrameworkはDIコンテナでAOPを実現させたりするため
結構複雑な制御フローをしています。
とはいっても通過した部分は通常は表示されるはずですよ。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-09-12 15:24
ありがとうございます。

sqlは入っていますので、やっぱりgetJdbcTemplate()のようです。
エラー内容も出力されないので、定義と言う感じがしているのですが、
jarファイルの追加がぬけている可能性はないでしょうか?

サンプルソースでspring.jarのみでいいと書かれていたので
これしか追加しておりませんが・・。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-12 15:52
引用:

かんぱちさんの書き込み (2006-09-12 15:24) より:
sqlは入っていますので、やっぱりgetJdbcTemplate()のようです。



このgetJdbcTemplate()というのはDBTouchクラスに作られた
org.springframework.jdbc.core.JdbcTemplate型のフィールドjdbcTemplateへの
getterなのでしょうか?
このフィールドに対してsetする処理は書かれていますか?
もしくはSpringFrameworkのDIの設定で依存性を注入しているのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)