<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yeshucheng
    追逐自己,追逐方向,心隨悟所動(dòng)
    posts - 24,comments - 24,trackbacks - 0

    在JDBC應(yīng)用中,如果你已經(jīng)是稍有水平開發(fā)者,你就應(yīng)該始終以PreparedStatement代替Statement.也就是說,在任何時(shí)候都不要使用Statement.
    基于以下的原因:
    一.代碼的可讀性和可維護(hù)性.
    雖然用PreparedStatement來(lái)代替Statement會(huì)使代碼多出幾行,但這樣的代碼無(wú)論從可讀性還是可維護(hù)性上來(lái)說.都比直接用Statement的代碼高很多檔次:

    stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

    perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
    perstmt.setString(1,var1);
    perstmt.setString(2,var2);
    perstmt.setString(3,var3);
    perstmt.setString(4,var4);
    perstmt.executeUpdate();

    不用我多說,對(duì)于第一種方法.別說其他人去讀你的代碼,就是你自己過一段時(shí)間再去讀,都會(huì)覺得傷心.

    二.PreparedStatement盡最大可能提高性能.
    每一種數(shù)據(jù)庫(kù)都會(huì)盡最大努力對(duì)預(yù)編譯語(yǔ)句提供最大的性能優(yōu)化.因?yàn)轭A(yù)編譯語(yǔ)句有可能被重復(fù)調(diào)用.所以語(yǔ)句在被DB的編譯器編譯后的執(zhí)行代碼被緩存下來(lái),那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語(yǔ)句就不需要編譯,只要將參數(shù)直接傳入編譯過的語(yǔ)句執(zhí)行代碼中(相當(dāng)于一個(gè)涵數(shù))就會(huì)得到執(zhí)行.這并不是說只有一個(gè) Connection中多次執(zhí)行的預(yù)編譯語(yǔ)句被緩存,而是對(duì)于整個(gè)DB中,只要預(yù)編譯的語(yǔ)句語(yǔ)法和緩存中匹配.那么在任何時(shí)候就可以不需要再次編譯而可以直接執(zhí)行.而statement的語(yǔ)句中,即使是相同一操作,而由于每次操作的數(shù)據(jù)不同所以使整個(gè)語(yǔ)句相匹配的機(jī)會(huì)極小,幾乎不太可能匹配.比如:
    insert into tb_name (col1,col2) values ('11','22');
    insert into tb_name (col1,col2) values ('11','23');
    即使是相同操作但因?yàn)閿?shù)據(jù)內(nèi)容不一樣,所以整個(gè)個(gè)語(yǔ)句本身不能匹配,沒有緩存語(yǔ)句的意義.事實(shí)是沒有數(shù)據(jù)庫(kù)會(huì)對(duì)普通語(yǔ)句編譯后的執(zhí)行代碼緩存.這樣每執(zhí)行一次都要對(duì)傳入的語(yǔ)句編譯一次.

    當(dāng)然并不是所以預(yù)編譯語(yǔ)句都一定會(huì)被緩存,數(shù)據(jù)庫(kù)本身會(huì)用一種策略,比如使用頻度等因素來(lái)決定什么時(shí)候不再緩存已有的預(yù)編譯結(jié)果.以保存有更多的空間存儲(chǔ)新的預(yù)編譯語(yǔ)句.

    三.最重要的一點(diǎn)是極大地提高了安全性.

    即使到目前為止,仍有一些人連基本的惡義SQL語(yǔ)法都不知道.
    String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
    如果我們把[' or '1' = '1]作為varpasswd傳入進(jìn)來(lái).用戶名隨意,看看會(huì)成為什么?

    select * from tb_name = '隨意' and passwd = '' or '1' = '1';
    因?yàn)?1'='1'肯定成立,所以可以任何通過驗(yàn)證.更有甚者:
    把[';drop table tb_name;]作為varpasswd傳入進(jìn)來(lái),則:
    select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數(shù)據(jù)庫(kù)是不會(huì)讓你成功的,但也有很多數(shù)據(jù)庫(kù)就可以使這些語(yǔ)句得到執(zhí)行.

    而如果你使用預(yù)編譯語(yǔ)句.你傳入的任何內(nèi)容就不會(huì)和原來(lái)的語(yǔ)句發(fā)生任何匹配的關(guān)系.(前提是數(shù)據(jù)庫(kù)本身支持預(yù)編譯,但上前可能沒有什么服務(wù)端數(shù)據(jù)庫(kù)不支持編譯了,只有少數(shù)的桌面數(shù)據(jù)庫(kù),就是直接文件訪問的那些)只要全使用預(yù)編譯語(yǔ)句,你就用不著對(duì)傳入的數(shù)據(jù)做任何過慮.而如果使用普通的statement, 有可能要對(duì)drop,;等做費(fèi)盡心機(jī)的判斷和過慮.

    上面的幾個(gè)原因,還不足讓你在任何時(shí)候都使用PreparedStatement嗎?

     

     

    有的新人可能此時(shí)對(duì)于用法還不太理解下面給個(gè)小例子

    Code Fragment 1:

    String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′"; 
    stmt.executeUpdate(updateString);

    Code Fragment 2:

    PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); 
    updateSales.setInt(1, 75); 
    updateSales.setString(2, "Colombian"); 
    updateSales.executeUpdate();

    set中的1對(duì)應(yīng)第一個(gè)? 2對(duì)應(yīng)第二個(gè)? 同時(shí)注意你set 的類型 是int還是string  哈哈很簡(jiǎn)單吧


    原文出處:http://blog.csdn.net/spcusa/archive/2009/05/09/4164076.aspx

    posted @ 2010-12-14 13:58 葉澍成| 編輯 收藏

    //ValueObject類

    public class AdEntity {
        
    private String id;
        
    private String name;
        
    private String broker;
        
    private String date;
        
    private String body;
        
    //get/set
        
        
    public String toString(){
            
    return "【編號(hào)為:"+id+",廣告名稱為:"+name+",代理商為:"+broker+",發(fā)布日期為:"+date+",內(nèi)容為:"+body+"";
        }
    }

    //調(diào)用任務(wù)類

    public class AdTask implements Callable<AdEntity> {
        @Override
        
    public AdEntity call() throws Exception {
            
    // 模擬遠(yuǎn)程調(diào)用花費(fèi)的一些時(shí)間
            Thread.sleep(5*1000);
            AdEntity vo
    =new AdEntity();
            vo.setId(String.valueOf(
    new Random().nextInt(1000)));
            vo.setName(
    "Ad@內(nèi)衣廣告");
            vo.setBroker(
    "CHANNEL");
            Date date
    =new Date();
            SimpleDateFormat sdf
    =new SimpleDateFormat("yyyy-MM-dd");
            String dateStr
    =sdf.format(date);
            vo.setDate(dateStr);
            vo.setBody(
    "遠(yuǎn)端內(nèi)容");
            
    return vo;
        }
    }

    //主函數(shù)

    public class TestQueryMemg {
        
        
    /**
         * 
    @param args
         * 
    @throws ExecutionException 
         * 
    @throws InterruptedException 
         
    */
        
    public static void main(String[] args) throws InterruptedException, ExecutionException {
            ExecutorService exec
    =Executors.newCachedThreadPool();
            
    //創(chuàng)建Future來(lái)完成網(wǎng)絡(luò)調(diào)用任務(wù)
            Callable<AdEntity> returnAd=new AdTask();
            Future
    <AdEntity> future=exec.submit(returnAd);
            
            
    //開始執(zhí)行本地化查詢信息
            AdEntity localAd=new AdEntity();
            localAd.setId(String.valueOf(
    new Random().nextInt(1000)));
            localAd.setName(
    "Ad@食品廣告");
            localAd.setBroker(
    "蒙牛");
            SimpleDateFormat sdf
    =new SimpleDateFormat("yyyy-MM-dd");
            String dateStr
    =sdf.format(new Date());
            localAd.setDate(dateStr);
            localAd.setBody(
    "內(nèi)容本地");

            System.out.println(
    "當(dāng)前本地化查詢內(nèi)容為:"+localAd.toString());
            System.out.println(
    "稍等片刻以獲取遠(yuǎn)端信息");
            
            
    while(!future.isDone()){
                
    try {
                    Thread.sleep(
    1*1000);
                } 
    catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            AdEntity entityRemote
    =(AdEntity)future.get();

            System.out.println(
    "合并查詢內(nèi)容為:\n"+localAd.toString()+"\n"+entityRemote.toString());
        }
    }


     

     

     

    posted @ 2010-12-12 14:44 葉澍成| 編輯 收藏

    個(gè)人賬戶類:

    public class PrivateAccount implements Callable {
        Integer total;
        
    public Object call() throws Exception {
            Thread.sleep(
    5*1000);
            total
    =new Integer(new Random().nextInt(10000));
            System.out.println(
    "您個(gè)人賬戶上還有"+total+" 存款可以支配");
            
    return total;
        }
    }

    主函數(shù)測(cè)試:

    public class SumTest {
        
    /**
         * 
    @param args
         * 
    @throws ExecutionException 
         * 
    @throws InterruptedException 
         
    */
        
    public static void main(String[] args) throws InterruptedException, ExecutionException {
            Callable privateAccount
    =new PrivateAccount();
            FutureTask task
    =new FutureTask(privateAccount);
                    
    //創(chuàng)建新線程獲取個(gè)人賬戶信息
            Thread thread=new Thread(task);
            thread.start();

            
    int total=new Random().nextInt(1000);
            System.out.println(
    "主線程在這工作");
            System.out.println(
    "您目前操作金額為: "+total+" .");
            System.out.println(
    "請(qǐng)等待計(jì)算個(gè)人賬戶的金額");
            
    while(!task.isDone()){//判斷是否已經(jīng)獲取返回值
                try {
                    Thread.sleep(
    3*1000);
                } 
    catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Integer privateSingle
    =(Integer)task.get();
            
    int post=privateSingle.intValue();
            
            System.out.println(
    "您當(dāng)前賬戶共有金額為:"+(total+post)+" ¥");
        }

    }


     

     

    posted @ 2010-12-10 20:53 葉澍成| 編輯 收藏
    主站蜘蛛池模板: 日韩视频在线精品视频免费观看| 亚洲国产综合专区电影在线| h在线观看视频免费网站| 日韩在线视频免费| 亚洲五月综合缴情婷婷| 久久精品亚洲综合| 亚洲午夜av影院| 国产免费小视频在线观看| 亚洲免费观看网站| 最近免费中文字幕MV在线视频3| 婷婷国产偷v国产偷v亚洲| 亚洲国产成人91精品| 亚洲人成影院在线| 亚洲熟妇丰满多毛XXXX| 免费又黄又爽的视频| 成人性生免费视频| 久草免费在线观看视频| 日韩精品人妻系列无码专区免费| 福利免费在线观看| 成人免费网站视频www| 国产成人不卡亚洲精品91| 亚洲熟女精品中文字幕| 99999久久久久久亚洲| 亚洲日本国产精华液| 亚洲视频国产视频| 91久久亚洲国产成人精品性色 | 亚洲中文久久精品无码| 无码专区一va亚洲v专区在线| 尤物永久免费AV无码网站| 国产在线a免费观看| 嫖丰满老熟妇AAAA片免费看| 18女人毛片水真多免费| 中文字幕成人免费视频| 18禁美女黄网站色大片免费观看| 亚欧日韩毛片在线看免费网站| 久久青草免费91观看| 国产精品99久久免费观看| 免费看又黄又无码的网站| 免费A级毛片无码A∨中文字幕下载| 无码人妻精品中文字幕免费| 久久免费视频99|