MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          spring jdbc筆記

          Posted on 2009-12-23 17:29 leekiang 閱讀(805) 評(píng)論(0)  編輯  收藏 所屬分類: spring 、jdbc、事務(wù)、并發(fā)
          SQL標(biāo)準(zhǔn)允許基于一個(gè)帶參數(shù)列表的表達(dá)式進(jìn)行查詢。一個(gè)典型的例子可能像這樣:"select * from T_ACTOR where id in (1, 2, 3)"。 不過這種參數(shù)列表的方式并不能直接被JDBC標(biāo)準(zhǔn)所支持 - 因?yàn)椴⒉淮嬖谶@種聲明一個(gè)列表參數(shù)作為占位符的方式。 你不得不為此寫多個(gè)占位符來表示多個(gè)參數(shù),或者當(dāng)你知道占位符的數(shù)量時(shí),你可以動(dòng)態(tài)構(gòu)建SQL字符串。 NamedParameterJdbcTemplate和SimpleJdbcTemplate中所提供的命名參數(shù)的特性,采用的是后面一種做法。 當(dāng)你傳入?yún)?shù)時(shí),你需要傳入一個(gè)java.util.List類型,支持基本類型。而這個(gè)list將會(huì)在SQL執(zhí)行時(shí)替換占位符并傳入?yún)?shù)。
          在使用IN語句時(shí),當(dāng)你傳入大批量的值時(shí)要小心,JDBC標(biāo)準(zhǔn)并不確保超過100個(gè)元素在IN語句中。 有不少數(shù)據(jù)庫可以超出這個(gè)值的限制,但是不同的數(shù)據(jù)庫會(huì)有不同的數(shù)量限制,比如Oracle的限制數(shù)量是1000個(gè)。
          除了基本類型之外,你還可以創(chuàng)建一個(gè)java.util.List的對(duì)象數(shù)組,這可以讓你支持在IN表達(dá)式中編寫多重表達(dá)式,例如"select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop'))". 當(dāng)然,這樣做的前提是數(shù)據(jù)庫底層的語法支持。

          http://www.javaeye.com/problems/6124
          select count(*) num from lottery_term where term_issuenum in (?) and term_lotteryid = ?
          改成getJdbcTemplate().queryForInt(sql,new Object[]{new String[]{"2008326","2008325","2008324"},103});
          List list=new ArrayList();
          list.add("****");
          getJdbcTemplate().queryForInt(sql,new Object[]{list,103});

          select count(*) from info_document where category_id in (:category_id_list);
          Map<String,Object> parm = new HashMap<String,Object>();
          parm.put("category_id_list", idList);


          ? public List getAllStu() {

          ?????? String sql="select s_id as sid,s_name as sname,s_sex as ssex,s_brith as sbrith from stu";

          ?????? List list=this.getJdbcTemplate().query(sql,new BeanPropertyRowMapper(Stu.class));

          ?????? return list;

          ??? }


          關(guān)于execute和update方法之間的區(qū)別,update方法返回的是受影響的記錄數(shù)目的 一個(gè)計(jì)數(shù),并且如果傳入?yún)?shù)的話,使用的是java.sql.PreparedStatement,而execute方法總是使用 java.sql.Statement,不接受參數(shù),而且他不返回受影響記錄的計(jì)數(shù),更適合于創(chuàng)建和丟棄表的語句,而update方法更適合于插入,更新 和刪除操作,這也是我們?cè)谑褂脮r(shí)需要注意的。



          Connection conn=DataSourceUtils.getConnection(getJdbcTempldate().getDataSource());

          conn=getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(conn);

          OracleConnection oconn=(OracleConnection)conn;

          通過DataSourceUtils獲取當(dāng)前線程綁定的數(shù)據(jù)連接,為了使用線程上下文相關(guān)的事務(wù),這樣寫是正確的寫法,如果直接從DataSource獲取連接,得到的是和當(dāng)前線程上下文無關(guān)的新的數(shù)據(jù)庫連接實(shí)例。

          http://www.javaeye.com/topic/49932?page=2

          http://www.javaeye.com/problems/15846

          http://www.javaeye.com/topic/87034

          http://www.javaeye.com/topic/508799

          http://ttitfly.javaeye.com/blog/151560


          jdbcTemplate的方式里如果帶上int[] argTypes顯示指定每個(gè)占位符所對(duì)應(yīng)的字段數(shù)據(jù)類型,可以保證類型安全,當(dāng)參數(shù)值為null時(shí),提供了更好的支持。

          -----------------------

          上面這句話如何理解?


          后在http://javazoo.bokee.com/viewdiary.15850865.html找到原因了

          今天在調(diào)試程序的時(shí)候,在后臺(tái)業(yè)務(wù)邏輯類中利用JdbcTemplate進(jìn)行數(shù)據(jù)同步操作時(shí),發(fā)現(xiàn)當(dāng)
          執(zhí)行jdbcTemplate.update(帶?的SQL語句,new Object[]{tmp.getName( ),tmp.getNo( ),tmp.getSpeciality( ),tmp.getMounterofficer( ),tmp.getDesigner( ),tmp.getProductivity( ),tmp.getState( ))
          這種操作時(shí),如果后面參數(shù)中有值為null時(shí),后臺(tái)會(huì)報(bào)異常,細(xì)想下也是,如果是null,那就要執(zhí)行jdbc的setNull(Spring底層還是用JDBC做的)方法了,但是setNull方法要知道具體的數(shù)據(jù)庫字段的類型.如setNull(1,Types.VARCHAR).而在上面的方法沒有體現(xiàn).
          終于體會(huì)到update方法中第三個(gè)參數(shù)new int[]的作用了.!
          spring還是很偉大的.


          如果字段名和屬性名是嚴(yán)格對(duì)應(yīng)的,那么就可以不用自己寫RowMapper了,使用BeanPropertyRowMapper:

          getJdbcTemplate().query(sql,?new?BeanPropertyRowMapper(User.class));??

          類的屬性字段名稱要數(shù)據(jù)庫中的字段名稱一樣或者數(shù)據(jù)庫字段名為s_id類的名稱為SId,
          如果你沒有遵守這個(gè)規(guī)范則可以在select語句后面給數(shù)據(jù)庫字段名取別名


          //綁定參數(shù)時(shí),日期類型的寫法,未經(jīng)過驗(yàn)證

          ??? public void updStu(Stu stu) {
          String sql = "update stu set s_name=?,s_sex=?,s_brith=? where s_id=?";
          Object[] obj = new Object[] { stu.getSname(), stu.getSsex(),new java.sql.Date(stu.getSbrith().getTime()), stu.getSid() };
          ????? getJdbcTemplate().update(sql, obj, new int[] { Types.VARCHAR, Types.VARCHAR,Types.DATE, Types.INTEGER });
          ??? }



          ConnectionCallback的用法,使用完要手動(dòng)關(guān)閉連接嗎?

          spring的AbstractRoutingDataSource,可以多態(tài)切換數(shù)據(jù)庫?


          事務(wù)抽象層http://blog.csdn.net/congqian1120/archive/2008/01/16/2046311.aspx




          http://www.oracle.com/technology/global/cn/pub/articles/marx_spring.html
          主站蜘蛛池模板: 江阴市| 潜山县| 肇庆市| 建平县| 西吉县| 白城市| 马关县| 营口市| 上林县| 芮城县| 堆龙德庆县| 海阳市| 富顺县| 凭祥市| 新田县| 韩城市| 盐亭县| 榆林市| 余庆县| 金阳县| 平凉市| 达州市| 宁陵县| 辽阳市| 镇沅| 湘潭市| 吴江市| 台东县| 雅江县| 高淳县| 同心县| 伊川县| 福建省| 安陆市| 和政县| 大安市| 本溪市| 桂林市| 德昌县| 平舆县| 平武县|