隨筆-295  評(píng)論-26  文章-1  trackbacks-0

          文章: 49
          積分: 89
          來自: 浙江杭州

          ?????? 時(shí)間: 2007-02-09 14:38 ?? 關(guān)鍵字: ? Spring?spring ??? ???

          1、使用JdbcTemplate的execute()方法執(zhí)行SQL語句

          代碼
          1. jdbcTemplate.execute( "CREATE?TABLE?USER?(user_id?integer,?name?varchar(100))" );??

          2、如果是UPDATE或INSERT,可以用update()方法。
          代碼
          1. jdbcTemplate.update("INSERT?INTO?USER?VALUES('"??
          2. ???????????+?user.getId()?+?"',?'"??
          3. ???????????+?user.getName()?+?"',?'"??
          4. ???????????+?user.getSex()?+?"',?'"??
          5. ???????????+?user.getAge()?+?"')"); ??

          3、帶參數(shù)的更新
          代碼
          1. jdbcTemplate.update("UPDATE?USER?SET?name?=???WHERE?user_id?=??",?new?Object[]?{name,?id});??

          代碼
          1. jdbcTemplate.update("INSERT?INTO?USER?VALUES(?,??,??,??)",?new?Object[]?{user.getId(),?user.getName(),?user.getSex(),?user.getAge()}); ??

          4、使用JdbcTemplate進(jìn)行查詢時(shí),使用queryForXXX()等方法
          代碼
          1. int?count?=?jdbcTemplate.queryForInt("SELECT?COUNT(*)?FROM?USER");??

          代碼
          1. String?name?=?(String)?jdbcTemplate.queryForObject("SELECT?name?FROM?USER?WHERE?user_id?=??",?new?Object[]?{id},?java.lang.String.class);??

          代碼
          1. List?rows?=?jdbcTemplate.queryForList("SELECT?*?FROM?USER");??

          代碼
          1. List?rows?=?jdbcTemplate.queryForList("SELECT?*?FROM?USER"); ??
          2. Iterator?it?=?rows.iterator(); ??
          3. while(it.hasNext())?{ ??
          4. ????Map?userMap?=?(Map)?it.next(); ??
          5. ????System.out.print(userMap.get("user_id")?+?"\t"); ??
          6. ????System.out.print(userMap.get("name")?+?"\t"); ??
          7. ????System.out.print(userMap.get("sex")?+?"\t"); ??
          8. ????System.out.println(userMap.get("age")?+?"\t"); ??
          9. } ??

          JdbcTemplate將我們使用的JDBC的流程封裝起來,包括了異常的捕捉、SQL的執(zhí)行、查詢結(jié)果的轉(zhuǎn)換等等。spring大量使用Template Method模式來封裝固定流程的動(dòng)作,XXXTemplate等類別都是基于這種方式的實(shí)現(xiàn)。
          除了大量使用Template Method來封裝一些底層的操作細(xì)節(jié),spring也大量使用callback方式類回調(diào)相關(guān)類別的方法以提供JDBC相關(guān)類別的功能,使傳統(tǒng)的JDBC的使用者也能清楚了解spring所提供的相關(guān)封裝類別方法的使用。

          JDBC的PreparedStatement

          代碼
          1. final?String?id?=?user.getId(); ??
          2. final?String?name?=?user.getName(); ??
          3. final?String?sex?=?user.getSex()?+?""; ??
          4. final?int?age?=?user.getAge(); ??
          5. ??
          6. jdbcTemplate.update("INSERT?INTO?USER?VALUES(?,??,??,??)", ??
          7. ?????????????????????new?PreparedStatementSetter()?{ ??
          8. ?????????????????????????public?void?setValues(PreparedStatement?ps)?throws?SQLException?{ ??
          9. ?????????????????????????????ps.setString(1,?id); ??
          10. ?????????????????????????????ps.setString(2,?name);?????????? ??
          11. ?????????????????????????????ps.setString(3,?sex); ??
          12. ?????????????????????????????ps.setInt(4,?age); ??
          13. ?????????????????????????} ??
          14. ?????????????????????}); ??
          15. ??

          代碼
          1. final?User?user?=?new?User(); ??
          2. jdbcTemplate.query("SELECT?*?FROM?USER?WHERE?user_id?=??", ??
          3. ????????????????????new?Object[]?{id}, ??
          4. ????????????????????new?RowCallbackHandler()?{ ??
          5. ????????????????????????public?void?processRow(ResultSet?rs)?throws?SQLException?{ ??
          6. ????????????????????????????user.setId(rs.getString("user_id")); ??
          7. ????????????????????????????user.setName(rs.getString("name")); ??
          8. ????????????????????????????user.setSex(rs.getString("sex").charAt(0)); ??
          9. ????????????????????????????user.setAge(rs.getInt("age")); ??
          10. ????????????????????????} ??
          11. ????????????????????}); ??
          12. ??

          代碼
          1. class?UserRowMapper?implements?RowMapper?{ ??
          2. ????public?Object?mapRow(ResultSet?rs,?int?index)?throws?SQLException?{ ??
          3. ????????User?user?=?new?User(); ??
          4. ??
          5. ????????user.setId(rs.getString("user_id")); ??
          6. ????????user.setName(rs.getString("name")); ??
          7. ????????user.setSex(rs.getString("sex").charAt(0)); ??
          8. ????????user.setAge(rs.getInt("age")); ??
          9. ??
          10. ????????return?user; ??
          11. ????} ??
          12. } ??
          13. ??
          14. public?List?findAllByRowMapperResultReader()?{ ??
          15. ????String?sql?=?"SELECT?*?FROM?USER"; ??
          16. ????return?jdbcTemplate.query(sql,?new?RowMapperResultReader(new?UserRowMapper())); ??
          17. } ??
          18. ??

          在getUser(id)里面使用UserRowMapper

          代碼
          1. public?User?getUser(final?String?id)?throws?DataAccessException?{ ??
          2. ????String?sql?=?"SELECT?*?FROM?USER?WHERE?user_id=?"; ??
          3. ????final?Object[]?params?=?new?Object[]?{?id?}; ??
          4. ????List?list?=?jdbcTemplate.query(sql,?params,?new?RowMapperResultReader(new?UserRowMapper())); ??
          5. ??
          6. ????return?(User)?list.get(0); ??
          7. } ??

          網(wǎng)上收集
          org.springframework.jdbc.core.PreparedStatementCreator 返回預(yù)編譯SQL 不能于Object[]一起用

          代碼
          1. public?PreparedStatement?createPreparedStatement(Connection?con)?throws?SQLException?{ ??
          2. ?return?con.prepareStatement(sql); ??
          3. } ??

          1.增刪改
          org.springframework.jdbc.core.JdbcTemplate 類(必須指定數(shù)據(jù)源dataSource)
          代碼
          1. template.update("insert?into?web_person?values(?,?,?)",Object[]); ??


          代碼
          1. template.update("insert?into?web_person?values(?,?,?)",new?PreparedStatementSetter(){?匿名內(nèi)部類?只能訪問外部最終局部變量 ??
          2. ??
          3. ?public?void?setValues(PreparedStatement?ps)?throws?SQLException?{ ??
          4. ??ps.setInt(index++,3); ??
          5. }); ??

          org.springframework.jdbc.core.PreparedStatementSetter 接口 處理預(yù)編譯SQL
          代碼
          1. public?void?setValues(PreparedStatement?ps)?throws?SQLException?{ ??
          2. ?ps.setInt(index++,3); ??
          3. } ??

          2.查詢JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
          org.springframework.jdbc.core.RowMapper 記錄映射接口 處理結(jié)果集
          代碼
          1. public?Object?mapRow(ResultSet?rs,?int?arg1)?throws?SQLException?{???int表當(dāng)前行數(shù) ??
          2. ??person.setId(rs.getInt("id")); ??
          3. } ??
          4. List?template.query("select?*?from?web_person?where?id=?",Object[],RowMapper); ??

          org.springframework.jdbc.core.RowCallbackHandler 記錄回調(diào)管理器接口 處理結(jié)果集
          代碼
          1. template.query("select?*?from?web_person?where?id=?",Object[],new?RowCallbackHandler(){ ??
          2. ?public?void?processRow(ResultSet?rs)?throws?SQLException?{ ??
          3. ??person.setId(rs.getInt("id")); ??
          4. }); ??


          大盤預(yù)測(cè) 國富論
          posted on 2007-09-06 18:04 華夢(mèng)行 閱讀(158) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 贵州省| 油尖旺区| 抚顺市| 巴青县| 巴中市| 七台河市| 克什克腾旗| 丰台区| 洪泽县| 施甸县| 玉屏| 阿坝| 绥德县| 乌海市| 始兴县| 阳山县| 琼海市| 清远市| 安溪县| 洞头县| 抚顺市| 澎湖县| 南郑县| 应城市| 长子县| 铜陵市| 镇沅| 咸宁市| 尚志市| 子长县| 合江县| 鄂托克旗| 萨嘎县| 常山县| 施甸县| 同德县| 长春市| 云和县| 铜陵市| 湘乡市| 贞丰县|