- - PR -
SpringのJdbcTemplateでDBアクセス
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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が・・)が、 ご教授お願いします。 | ||||||||
|
投稿日時: 2006-09-12 09:22
基本的に使い方が間違ってます。
@JdbcDaoSupport を継承したクラスを作って、 AdataSource を spring-context.xml の中で@のクラスにセットして、 BgetJdbcTemplate() を使ってSQLを実行しましょう。 | ||||||||
|
投稿日時: 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部は削除しましたが・・。 | ||||||||
|
投稿日時: 2006-09-12 10:47
スタックトレースと例外発生箇所のソースの抜粋ぐらいは提示しましょうね。 何が問題なのか見当もつきません | ||||||||
|
投稿日時: 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}); です。 | ||||||||
|
投稿日時: 2006-09-12 12:59
ならばgetJdbcTemplate()がnullを返すのかsqlがnullかのどちらかでしょう。
SpringFrameworkはDIコンテナでAOPを実現させたりするため 結構複雑な制御フローをしています。 とはいっても通過した部分は通常は表示されるはずですよ。 | ||||||||
|
投稿日時: 2006-09-12 15:24
ありがとうございます。
sqlは入っていますので、やっぱりgetJdbcTemplate()のようです。 エラー内容も出力されないので、定義と言う感じがしているのですが、 jarファイルの追加がぬけている可能性はないでしょうか? サンプルソースでspring.jarのみでいいと書かれていたので これしか追加しておりませんが・・。 | ||||||||
|
投稿日時: 2006-09-12 15:52
このgetJdbcTemplate()というのはDBTouchクラスに作られた org.springframework.jdbc.core.JdbcTemplate型のフィールドjdbcTemplateへの getterなのでしょうか? このフィールドに対してsetする処理は書かれていますか? もしくはSpringFrameworkのDIの設定で依存性を注入しているのでしょうか? |