隨筆 - 251  文章 - 504  trackbacks - 0
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          本博客系個人收集材料及學習記錄之用,各類“大俠”勿擾!

          留言簿(14)

          隨筆分類

          收藏夾

          My Favorite Web Sites

          名Bloger

          非著名Bloger

          搜索

          •  

          積分與排名

          • 積分 - 202345
          • 排名 - 285

          最新評論

          下面會通過一個獲得數據源的例子來比較下傳統編碼模式和IoC編碼模式的不同。首先,在傳統編碼方式下,我們可能這樣獲得數據源并顯示結果:
          package?com.lnic.ioc;

          import?javax.sql.DataSource;
          import?java.sql.Connection;
          import?java.sql.Statement;
          import?java.sql.ResultSet;
          import?java.sql.SQLException;
          import?org.apache.commons.dbcp.BasicDataSource;

          public?class?BasicDataSourceExample?{

          ????
          public?static?void?main(String[]?args)?{
          ????????DataSource?dataSource?
          =?setupDataSource();

          ????????
          //?創建JDBC數據源
          ????????Connection?conn?=?null;
          ????????Statement?stmt?
          =?null;
          ????????ResultSet?rset?
          =?null;

          ????????
          try?{
          ????????????
          ????????????conn?
          =?dataSource.getConnection();
          ????????????stmt?
          =?conn.createStatement();
          ????????????rset?
          =?stmt.executeQuery("select?*?from?user");
          ????????????System.out.println(
          "Basic?DataSource?executing?results:");
          ????????????
          int?numcols?=?rset.getMetaData().getColumnCount();
          ????????????
          while?(rset.next())?{
          ????????????????
          for?(int?i?=?1;?i?<=?numcols;?i++)?{
          ????????????????????System.out.print(
          "\t"?+?rset.getString(i));
          ????????????????}

          ????????????????System.out.println(
          "");
          ????????????}

          ????????}
          ?catch?(SQLException?e)?{
          ????????????e.printStackTrace();
          ????????}
          ?finally?{
          ????????????
          try?{
          ????????????????rset.close();
          ????????????}
          ?catch?(Exception?e)?{
          ????????????}

          ????????????
          try?{
          ????????????????stmt.close();
          ????????????}
          ?catch?(Exception?e)?{
          ????????????}

          ????????????
          try?{
          ????????????????conn.close();
          ????????????}
          ?catch?(Exception?e)?{
          ????????????}

          ????????}

          ????}


          ????
          //?創建數據源
          ????public?static?DataSource?setupDataSource()?{
          ????????BasicDataSource?ds?
          =?new?BasicDataSource();
          ????????ds.setDriverClassName(
          "com.mysql.jdbc.Driver");
          ????????ds.setUsername(
          "root");
          ????????ds.setPassword(
          "131421");
          ????????ds.setUrl(
          "jdbc:mysql://localhost:3306/test");
          ????????
          return?ds;
          ????}


          ????
          //?提示數據源狀態
          ????public?static?void?printDataSourceStats(DataSource?ds)?throws?SQLException?{
          ????????BasicDataSource?bds?
          =?(BasicDataSource)?ds;
          ????????System.out.println(
          "NumActive:?"?+?bds.getNumActive());
          ????????System.out.println(
          "NumIdle:?"?+?bds.getNumIdle());
          ????}


          ????
          //?關閉數據源
          ????public?static?void?shutdownDataSource(DataSource?ds)?throws?SQLException?{
          ????????BasicDataSource?bds?
          =?(BasicDataSource)?ds;
          ????????bds.close();
          ????}

          }

          這個累的測試結果顯示:
          Basic DataSource executing results:
          ?123?matthew?YunNanUniversity
          ?1?lidexian?YunNanUniversity
          ?2?zhangzili?HunanUniversity

          而在Spring 的IoC容器的幫助下我們的編碼會更簡單和靈活。首先,定義個Spring的配置文件:applicationContext.xml。在這個配置文件中,我們配置了三個bean組件,代表不同的數據庫數據源。然后,通過配置jdbcTemplate來啟用需要的具體數據庫數據源。如下:我們采用的MySql數據源。
          <?xml?version="1.0"?encoding="UTF-8"?>
          <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">
          <beans>
          ????
          <bean?id="oracle_dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
          ????????
          <property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/>
          ????????
          <property?name="url"?value="jdbc:oracle:thin:@localhost:1521:cyberdb"?/>
          ????????
          <property?name="username"?value="scott"?/>
          ????????
          <property?name="password"?value="tiger"?/>
          ????
          </bean>
          ????
          ????
          ????
          ????
          <bean?id="mysql_dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
          ????????
          <property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/>
          ????????
          <property?name="url"?value="jdbc:mysql://localhost:3306/test"?/>
          ????????
          <property?name="username"?value="root"?/>
          ????????
          <property?name="password"?value="131421"?/>
          ????
          </bean>
          ????
          ????
          <bean?id="linux_oracle_dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">
          ????????
          <property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/>
          ????????
          <property?name="url"?value="jdbc:oracle:thin:@192.168.0.3:1521:linuxdb"?/>
          ????????
          <property?name="username"?value="scott"?/>
          ????????
          <property?name="password"?value="tiger"?/>
          ????
          </bean>

          ????
          <bean?id="jdbcTemplate"?class="org.springframework.jdbc.core.JdbcTemplate"?lazy-init="true">
          ????????
          <property?name="dataSource">
          ????????????
          <ref?local="mysql_dataSource"?/>
          ????????
          </property>
          ????
          </bean>

          ????
          </beans>


          然后,如下在代碼中通過載入Spring的配置文件,并初始化bean組件:jdbcTemplate得到數據源,并完成數據查詢。可以看出比傳統的方法簡單和靈活多了,只需要簡單配置即可完成。
          package?com.lnic.ioc;

          import?java.sql.ResultSet;
          import?java.sql.SQLException;
          import?java.util.ArrayList;
          import?java.util.List;

          import?org.springframework.context.ApplicationContext;
          import?org.springframework.context.support.ClassPathXmlApplicationContext;
          import?org.springframework.jdbc.core.JdbcTemplate;
          import?org.springframework.jdbc.core.RowCallbackHandler;

          public?class?IocDataSourceExample?{
          ????
          public?static?void?main(String[]?args)?{
          ????????ApplicationContext?ctx?
          =?new?ClassPathXmlApplicationContext(
          ????????????????
          "com/lnic/ioc/applicationContext.xml");//載入spring配置文件applicationContext.xml

          ????????String?sql?
          =?"select?*?from?user";
          ????????JdbcTemplate?jt?
          =?(JdbcTemplate)?ctx.getBean("jdbcTemplate");//這里采用spring的JdbcTemplate,通過spring的配置文件啟用mysql_dataSource數據源。
          ????????jt.query(sql,?new?RowCallbackHandler()?{
          ????????????
          public?void?processRow(ResultSet?rs)?throws?SQLException?{
          ????????????????
          //?do?something?with?the?rowdata?-?like?create?a?new
          ????????????????
          //?object?and?add?it?to?the?List?in?the?enclosing?code
          ????????????????System.out.println("IocDataSource?executing?results:");
          ????????????????
          int?numcols?=?rs.getMetaData().getColumnCount();
          ????????????????
          ????????????????
          do?{
          ????????????????????
          for?(int?i?=?1;?i?<=?numcols;?i++)?{
          ????????????????????????System.out.print(
          "\t"?+?rs.getString(i));
          ????????????????????}

          ????????????????????System.out.println(
          "");
          ????????????????}
          ?while?(rs.next());
          ????????????}

          ????????}
          );
          ????}

          }


          代碼輸出如下:
          IocDataSource executing results:
          ?123?matthew?YunNanUniversity
          ?1?lidexian?YunNanUniversity
          ?2?zhangzili?HunanUniversity
          posted on 2006-12-26 13:25 matthew 閱讀(457) 評論(0)  編輯  收藏 所屬分類: JavaEE
          主站蜘蛛池模板: 行唐县| 巴彦淖尔市| 土默特左旗| 台中市| 昭平县| 连南| 罗城| 紫阳县| 布拖县| 永丰县| 浙江省| 平顺县| 通州区| 赫章县| 梁山县| 樟树市| 革吉县| 肇州县| 尼木县| 寿宁县| 马尔康县| 汤原县| 漳州市| 那坡县| 独山县| 英吉沙县| 黑河市| 滨海县| 临邑县| 通许县| 遂川县| 通化县| 安平县| 大石桥市| 扎兰屯市| 南皮县| 商南县| 龙山县| 南昌县| 海原县| 舞阳县|