Junky's IT Notebook

          導(dǎo)航

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          隨筆分類(224)

          文章分類(5)

          隨筆檔案(228)

          文章檔案(7)

          統(tǒng)計(jì)

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評(píng)論排行榜

          Spring in Action 筆記(II) part II

          Spring in Action 筆記(II) part II

          下面是測(cè)試Spring提高的Jdbc功能的主要測(cè)試類, 測(cè)試了一些使用JDBC操作數(shù)據(jù)的常用功能, 其他沒(méi)有測(cè)試的請(qǐng)查看其Doc,TestJdbcTemplate.java

          package? test.jdbc;

          import? java.sql.CallableStatement;
          import? java.sql.PreparedStatement;
          import? java.sql.ResultSet;
          import? java.sql.SQLException;
          import? java.sql.Types;
          import? java.util.List;

          import? org.springframework.dao.DataAccessException;
          import? org.springframework.jdbc.core.BatchPreparedStatementSetter;
          import? org.springframework.jdbc.core.CallableStatementCallback;
          import? org.springframework.jdbc.core.JdbcTemplate;
          import? org.springframework.jdbc.core.RowCallbackHandler;
          import? org.springframework.jdbc.core.RowMapper;
          import? org.springframework.jdbc.core.RowMapperResultSetExtractor;

          public?class? TestJdbcTemplate?{
          ?? public?static?final? String?strGetTest?=? "SELECT?*?FROM?APP.test?WHERE?ID?=??" ;
          ?? private?static?final? String?strInsertIntoTestTeble?=? "INSERT?INTO?APP.test?(id,?name)??VALUES?(?,??)" ;
          ??
          ?? private? JdbcTemplate?jdbcTemplate;
          ??
          ?? public? TestJdbcTemplate()?{}
          ?? public? TestJdbcTemplate(JdbcTemplate?jdbcTemplate)?{
          ???? this .jdbcTemplate?=?jdbcTemplate;
          ?? }

          ?? public? JdbcTemplate?getJdbcTemplate()?{
          ???? return? jdbcTemplate;
          ?? }

          ?? public?void? setJdbcTemplate(JdbcTemplate?jdbcTemplate)?{
          ???? this .jdbcTemplate?=?jdbcTemplate;
          ?? }
          ??
          ?? /**??測(cè)試?插入數(shù)據(jù)*/
          ?? public?void? insertTestData( int? id,String?name)?{
          ???? Object[]?params?=? new? Object[]?{id,name};
          ???? jdbcTemplate.update(strInsertIntoTestTeble,?params);
          ???? System.out.println( "插入數(shù)據(jù)成功!" );
          ?? }
          ?? /**??測(cè)試?插入數(shù)據(jù)*/
          ?? public?void? insertTestDataWithTypeChecked( int? id,String?name)?{
          ???? Object[]?params?=? new? Object[]?{id,name};
          ???? int []?types?=? new?int []?{Types.INTEGER,Types.VARCHAR};
          ???? jdbcTemplate.update(strInsertIntoTestTeble,?params,?types);
          ???? System.out.println( "插入數(shù)據(jù)成功(with?Types?checked)!" );
          ?? }
          ?? /**??測(cè)試?批量插入數(shù)據(jù)*/
          ?? public?void? insertTestDataByBatchInsert( final? List<TestData>?datas)?{
          ???? //構(gòu)造?BatchPreparedStatementSetter
          ???? BatchPreparedStatementSetter?setter?=? new? BatchPreparedStatementSetter()?{
          ?????? public?int? getBatchSize()?{
          ???????? return? datas.size();
          ?????? }
          ?????? public?void? setValues(PreparedStatement?ps,? int? index)?{
          ???????? TestData?data?=?datas.get(index);
          ???????? try? {
          ?????????? ps.setInt( 1 ,?data.id);??? //?從1?開始......
          ?????????? ps.setString( 2 ,?data.name);
          ???????? }? catch? (SQLException?e)?{
          ?????????? //?TODO?Auto-generated?catch?block
          ?????????? e.printStackTrace();
          ???????? }
          ?????? }
          ???? };
          ???? jdbcTemplate.batchUpdate(strInsertIntoTestTeble,?setter);
          ???? System.out.println( "批量插入數(shù)據(jù)成功!" );
          ?? }
          ?? /**
          ??? *?測(cè)試?JdbcTemplate
          ??? *? @param? id
          ??? */
          ?? public?void? getTestData( final?int? id)?{
          ???? final? Object[]?params?=? new? Object[]?{id};
          ????
          ???? jdbcTemplate.query(strGetTest,?params,? new? RowCallbackHandler()?{

          ?????? public?void? processRow(ResultSet?rs)? throws? SQLException?{
          ???????? //?TODO?Auto-generated?method?stub
          ???????? System.out.println( "測(cè)試JdbcTemplate::?name:"? +?rs.getString( 2 ));
          ?????? }
          ??????
          ???? });
          ?? }
          ??
          ?? /**?測(cè)試RowMapper?和?RowMapperResultReader?接口*/
          ?? public?void? getDataUsingRowMapper( int? id)?{
          ???? List?datas?=?jdbcTemplate.query( "SELECT?*?FROM?APP.test?WHERE?ID?=?"? +?id,? new? RowMapper()?{
          ?????? //?實(shí)現(xiàn)RowMapper接口,?來(lái)映射每一行數(shù)據(jù)
          ?????? public? Object?mapRow(ResultSet?rs,? int? index)? throws? SQLException?{
          ???????? //?TODO?Auto-generated?method?stub
          ???????? System.out.println( "測(cè)試RowMapper?接口:?name?"? +?rs.getString( 2 ));
          ???????? return?null ;
          ?????? }
          ??????
          ???? });
          ???? //datas?中保存查詢結(jié)果
          ???? System.out.println(datas.size());
          ?? }
          ??
          ?? public? TestData?getDataUsingRowMapperResultReader( final?int? id)?{
          ???? final? Object[]?params?=? new? Object[]?{id};
          ???? //?TODO?有問(wèn)題.......
          ???? TestData?data?=??(TestData)?jdbcTemplate.query(strGetTest,params,new?RowMapperResultSetExtractor( new? RowMapper()?{
          ?????? public? Object?mapRow(ResultSet?rs,int?index)? throws? SQLException?{
          ???????? TestData?tdata?=? new? TestData();
          ???????? tdata.id?=?rs.getInt( 1 );
          ???????? tdata.name?=?rs.getString( 2 );
          ???????? return? tdata;
          ?????? }
          ???? }));
          ????
          ???? return? data;
          ?? }
          ??
          ?? /**?測(cè)試調(diào)用存儲(chǔ)過(guò)程..*/
          ?? public?void? testCallableStatement()?{
          ???? //?使用?CallableStatementCallback?回調(diào)接口?調(diào)用存儲(chǔ)過(guò)程.
          ???? CallableStatementCallback?cb?=? new? CallableStatementCallback()?{
          ?????? public? Object?doInCallableStatement(CallableStatement?cs)? throws? SQLException,?DataAccessException?{
          ???????? cs.execute();
          ???????? return?null ;
          ?????? }
          ???? };
          ???? //?GET_DATA?為存儲(chǔ)過(guò)程名
          ???? jdbcTemplate.execute( "{?GET_DATA}" ,?cb);
          ?? }
          ??
          ??
          ?? //?用對(duì)象操作數(shù)據(jù),?使用SqlUpdate接口.?見(jiàn)?InsertData?類,,,,,
          ?? //?有容器注入?InsertData.
          ?? private? InsertData?insertData?;
          ?? public?int? insertTestData(TestData?data)?{
          ???? return? insertData.insert(data);
          ?? }
          ?? public? InsertData?getInsertData()?{
          ???? return? insertData;
          ?? }
          ?? public?void? setInsertData(InsertData?insertData)?{
          ???? this .insertData?=?insertData;
          ?? }
          ?? //測(cè)試插入數(shù)據(jù)
          ?? public?void? insertDataUsingSqlUpdate(TestData?data)?{
          ???? insertData.insert(data);
          ???? System.out.println( "使用SqlUpdate接口插入數(shù)據(jù)?成功....." );
          ?? }
          ??
          ?? /**?和上面使用SqlUpdate接口一樣?把操作創(chuàng)建為對(duì)象來(lái)操作*/
          ?? private? QueryDataById?queryDataById;

          ?? public?void? setQueryDataById(QueryDataById?queryDataById)?{
          ???? this .queryDataById?=?queryDataById;
          ?? }
          ?? //測(cè)試
          ?? public? TestData?getDataUsingMappingSqlQuery( int? id)?{
          ???? Object[]?params?=? new? Object[]?{id};
          ???? return? (TestData)?queryDataById.execute(params).get( 0 );
          ?? }
          ?? //使用上面兩種方法來(lái)插入和查詢數(shù)據(jù),不用和JDBC?API交互,?有Spring提供了
          ?? //中間代理層
          ??
          }

          下面是函有main函數(shù)的 主類. TestApp.java

          package? test.jdbc;

          import? java.util.ArrayList;
          import? java.util.List;

          import? org.springframework.context.ApplicationContext;
          import? org.springframework.context.support.ClassPathXmlApplicationContext;

          public?class? TestApp?{

          ?? /**
          ??? *? @param? args
          ??? */
          ?? public?static?void? main(String[]?args)?{
          ???? DatabaseUtils?dataUtils?=? new? DatabaseUtils();
          ???? dataUtils.connect();
          ???? System.out.println( "Open?database:!" );
          ???? //?TODO?Auto-generated?method?stub
          ???? //測(cè)試連接數(shù)據(jù)源?......
          ???? ApplicationContext?context?=? new? ClassPathXmlApplicationContext( "test/jdbc/spring-traning.xml" );
          ???? /*?測(cè)試?DataSource?配置*/
          ???? TestDataSource?ds?=?(TestDataSource)?context.getBean( "dataBean" );
          ???? ds.testDataSource();

          ???? /*?測(cè)試JdbcTemplate?配置*/
          ????
          ???? TestJdbcTemplate?tjt?=?(TestJdbcTemplate)?context.getBean( "testJdbcTemplate" );
          ???? tjt.insertTestData( 2 ,? "test?name2" );
          ???? tjt.insertTestDataWithTypeChecked( 3 ,? "test?name?3" );
          ???? List<TestData>?datas?=? new? ArrayList<TestData>();
          ???? datas.add( new? TestData( 4 , "test?name?4" ));
          ???? datas.add( new? TestData( 5 , "test?name?5" ));
          ???? datas.add( new? TestData( 6 , "test?name?6" ));
          ???? tjt.insertTestDataByBatchInsert(datas);
          ???? tjt.getTestData( 1 );
          ???? tjt.getTestData( 2 );
          ???? tjt.getTestData( 5 );
          ???? tjt.getDataUsingRowMapper( 5 );
          //TODO?類型轉(zhuǎn)換錯(cuò)誤.????TestData?data?=?tjt.getDataUsingRowMapperResultReader(1);
          //????System.out.println("測(cè)試使用?RowMapperResultSetExtractor?讀取一行數(shù)據(jù):?"?+?data.id?+?":::?name?"?+?data.name);
          ???? TestData?tdata?=? new? TestData( 9 , "TestSqlUpdate." );
          ???? tjt.insertDataUsingSqlUpdate(tdata);?? //?插入數(shù)據(jù)
          ????
          ???? tjt.getDataUsingRowMapper( 9 );? //?測(cè)試上面插入的數(shù)據(jù)是否成功
          ????
          ????
          ???? dataUtils.disconnect();
          ?? }

          }

           

          JDBC配置文件:jdbc.properties

          # Sample ResourceBundle properties file

          db.username=

          addressuser

          db.password=

          addressuser

          db.driver=

          org.apache.derby.jdbc.EmbeddedDriver

          db.url=

          jdbc : derby:

          db.table=

          test

          db.schema=

          APP

          db.urlName=

          jdbc : derby:test

           

          最后是最重要的配置文件: spring-traning.xml

          <?

          xml version = "1.0" encoding = "UTF-8" ?>

          <!

          DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >

          <

          beans >

          < bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >

          < property name = "location" >

          < value > test/jdbc/jdbc.properties </ value >

          </ property >

          </ bean >

          <!-- get dataSource,配置dataSource -->

          <!-- 從JNDI得到DataSource -->

          <!-- bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

          <property name="jndiName">

          <value>java:comp/env/jdbc/myDataSource</value>

          </property>

          </bean> -->

          <!-- 使用Spring中的 DriverManagerDataSource -->

          <!-- bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

          <property name="driverClassName">

          <value>${db.driver}</value>

          </property>

          <property name="url">

          <value>${db.urlName}</value>

          </property>

          <property name="username">

          <value>${db.username}</value>

          </property>

          <property name="password">

          <value>${db.password}</value>

          </property>

          </bean -->

          <!-- 使用DBCP dataSource -->

          < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >

          < property name = "driverClassName" >

          < value > ${db.driver} </ value >

          </ property >

          < property name = "url" >

          < value > ${db.urlName} </ value >

          </ property >

          < property name = "username" >

          < value > ${db.username} </ value >

          </ property >

          < property name = "password" >

          < value > ${db.password} </ value >

          </ property >

          </ bean >

          < bean id = "dataBean" class = "test.jdbc.TestDataSource" >

          < property name = "dataSource" >

          < ref bean = "dataSource" />

          </ property >

          </ bean >

          <!-- ################################################################# -->

          <!-- 配合DataSource測(cè)試JdbcTemplate -->

          < bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate" >

          < property name = "dataSource" >

          < ref bean = "dataSource" />

          </ property >

          </ bean >

          < bean id = "testJdbcTemplate" class = "test.jdbc.TestJdbcTemplate" >

          < constructor-arg >

          < ref bean = "jdbcTemplate" />

          </ constructor-arg >

          <!-- 測(cè)試 SqlUpdate 接口... -->

          < property name = "insertData" >

          < ref bean = "insertDataUsingSqlUptate" />

          </ property >

          </ bean >

          <!-- 測(cè)試SqlUpdate......接口 -->

          < bean id = "insertDataUsingSqlUptate" class = "test.jdbc.InsertData" >

          < constructor-arg >

          < ref bean = "dataSource" />

          </ constructor-arg >

          </ bean >

          </

          beans >

           

          ok, Jdbc測(cè)試的代碼就結(jié)束了.

          在這里主要學(xué)習(xí)了,Spring提高的使用Jdbc的一些包裝類和接口, 來(lái)更方便的使用Jdbc操作數(shù)據(jù), 不用些那么一些煩人的 try ... catch...... finally.....

          感覺(jué)使用Sprig效率是很好,代碼看起來(lái)也很優(yōu)美哦. 呵呵:

          ok ,今天就終結(jié)完了, 下一次看看在Spring中如何高效使用Hibernate吧, 下次見(jiàn)啦

          posted on 2006-05-25 20:22 junky 閱讀(477) 評(píng)論(0)  編輯  收藏 所屬分類: spring

          主站蜘蛛池模板: 佛学| 永康市| 榆林市| 连平县| 兴海县| 太仓市| 麻江县| 遂川县| 临安市| 台中市| 盐源县| 阿拉善盟| 离岛区| 安庆市| 丹巴县| 昌黎县| 长垣县| 保德县| 苏尼特右旗| 曲阜市| 璧山县| 菏泽市| 彝良县| 渝北区| 修水县| 陈巴尔虎旗| 肥乡县| 泸西县| 长垣县| 松桃| 南平市| 河间市| 湘潭市| 屯留县| 南华县| 河西区| 鹤峰县| 米林县| 吉木萨尔县| 大名县| 厦门市|