11.24

cd /home/app/sxpservice/logs/apps && ll && tail -200f server.log    查看日誌javascript

 

11.24html

 

策略模式前端

在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。java

在策略模式中,咱們建立表示各類策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。mysql

介紹linux

意圖:定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。算法

主要解決:在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護。spring

什麼時候使用:一個系統有許多許多類,而區分它們的只是他們直接的行爲。sql

如何解決:將這些算法封裝成一個一個的類,任意地替換。數據庫

關鍵代碼:實現同一個接口。

應用實例: 一、諸葛亮的錦囊妙計,每個錦囊就是一個策略。 二、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。 三、JAVA AWT 中的 LayoutManager。

優勢: 一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。

缺點: 一、策略類會增多。 二、全部策略類都須要對外暴露。

使用場景: 一、若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲。 二、一個系統須要動態地在幾種算法中選擇一種。 三、若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。

注意事項:若是一個系統的策略多於四個,就須要考慮使用混合模式,解決策略類膨脹的問題。

實現

咱們將建立一個定義活動的 Strategy 接口和實現了 Strategy 接口的實體策略類。Context 是一個使用了某種策略的類。

StrategyPatternDemo,咱們的演示類使用 Context 和策略對象來演示 Context 在它所配置或使用的策略改變時的行爲變化。

 

步驟 1

建立一個接口。

Strategy.java

public interface Strategy {

   public int doOperation(int num1, int num2);

}

步驟 2

建立實現接口的實體類。

OperationAdd.java

public class OperationAdd implements Strategy{

   @Override

   public int doOperation(int num1, int num2) {

      return num1 + num2;

   }

}

OperationSubstract.java

public class OperationSubstract implements Strategy{

   @Override

   public int doOperation(int num1, int num2) {

      return num1 - num2;

   }

}

OperationMultiply.java

public class OperationMultiply implements Strategy{

   @Override

   public int doOperation(int num1, int num2) {

      return num1 * num2;

   }

}

步驟 3

建立 Context 類。

Context.java

public class Context {

   private Strategy strategy;

 

   public Context(Strategy strategy){

      this.strategy = strategy;

   }

 

   public int executeStrategy(int num1, int num2){

      return strategy.doOperation(num1, num2);

   }

}

步驟 4

使用 Context 來查看當它改變策略 Strategy 時的行爲變化。

StrategyPatternDemo.java

public class StrategyPatternDemo {

   public static void main(String[] args) {

      Context context = new Context(new OperationAdd());        

      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

 

      context = new Context(new OperationSubstract());        

      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

 

      context = new Context(new OperationMultiply());        

      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));

   }

}

步驟 5

驗證輸出。

10 + 5 = 15

10 - 5 = 5

10 * 5 = 50

 

MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機普遍使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言廣泛已有MD5實現。將數據(如漢字)運算爲另外一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD二、MD3和MD4。普遍用於加密和解密技術,經常使用於文件校驗。校驗?無論文件多大,通過MD5後都能生成惟一的MD5值。比如如今的ISO校驗,都是MD5校驗。怎麼用?固然是把ISO通過MD5後產生MD5的值。通常下載linux-ISO的朋友都見過下載連接旁邊放着MD5的串。就是用來驗證文件是否一致的。

java實現代碼:

package com.cn.單向加密;

 

import java.math.BigInteger;

import java.security.MessageDigest;

/*

MD5(Message Digest algorithm 5,信息摘要算法)

一般咱們不直接使用上述MD5加密。一般將MD5產生的字節數組交給BASE64再加密一把,獲得相應的字符串

Digest:彙編

*/

public class MD5 {

    public static final String KEY_MD5 = "MD5";  

 

    public static  String  getResult(String inputStr)

    {

        System.out.println("=======加密前的數據:"+inputStr);

        BigInteger bigInteger=null;

 

        try {

         MessageDigest md = MessageDigest.getInstance(KEY_MD5);  

         byte[] inputData = inputStr.getBytes();

         md.update(inputData);  

         bigInteger = new BigInteger(md.digest());  

        } catch (Exception e) {e.printStackTrace();}

        System.out.println("MD5加密後:" + bigInteger.toString(16));  

        return bigInteger.toString(16);

    }

 

    public static void main(String args[])

    {

        try {

             String inputStr = "簡單加密8888888888888888888";  

             getResult(inputStr);

        } catch (Exception e) {

            e.printStackTrace();

        }

 

    }

 

}

MD5算法具備如下特色:

一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
二、容易計算:從原數據計算出MD5值很容易。
三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
四、弱抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。
五、強抗碰撞:想找到兩個不一樣的數據,使它們具備相同的MD5值,是很是困難的。
MD5的做用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的字節串變換成必定長的十六進制數字串)。除了MD5之外,其中比較有名的還有sha-一、RIPEMD以及Haval等。

 

 

StringUtils經常使用的方法

 

1. 檢查字符串是否爲空:

 

 static boolean isBlank(CharSequence str)  判斷字符串是否爲空或null;
 static boolean isNotBlank(CharSequence str) 判斷字符串是否非空或非null;

 

 StringUtils.isBlank("a");
 返回結果爲: false;

 

2. 縮進字符串:

 

 static String abbreviate(String str, int maxWidth) 縮進字符串,第二個參數至少爲4(包括...)

 

 StringUtils.abbreviate("abcdefg", 20);
 返回結果爲:abcdefg (正常顯示)

 StringUtils.abbreviate("abcdefg", 4);
 返回結果爲:a...

 

3. 首字母大寫:

 

 static String capitalize(String str) 首字母大寫
 static String uncapitalize(String str)首字母小寫  

 

 StringUtils.capitalize("abcdefg");
 返回結果:Abcdefg

 

4. 字符串顯示在一個大字符串的位置:

 

 static String center(String str, int size);  默認以空格填充
 static String center(String str, int size, String padString); 其他位置字符串填充
 public static String leftPad(String str,int size); 左側空格填充
 public static String leftPad(String str,int size,String padStr);左側字符串填充
 public static String rightPad(String str,int size); 左側空格填充
 public static String rightPad(String str,int size,String padStr);左側字符串填充
 

 StringUtils.center("abcdefg", 20);
 返回結果:      abcdefg      

 StringUtils.center("abcdefg", 20,"*_");
 返回結果:*_*_*_abcdefg*_*_*_*

 StringUtils.leftPad("abc", 10, "*");
 返回結果:*******abc

 

5. 重複字符串次數

 

 static String repeat(String str, int repeat);

 

 StringUtils.repeat("abc", 5); 
 返回結果:abcabcabcabcabc

 

6. 是否全是大寫,是否全是小寫(3.0版本)

 

 public static boolean isAllLowerCase(String str);
 public static boolean isAllUpperCase(String str);

 

 StringUtils.isAllLowerCase("abC");
 返回結果:false

 

7. 是否都是由字母組成:

 

 public static boolean isAlpha(String str);  只由字母組成
 public static boolean isAlphaSpace(String str); 只有字母和空格組成
 public static boolean isAlphanumeric(String str);只由字母和數字組成
 public static boolean isAlphanumericSpace(String str);只由字母數字和空格組成
 public static boolean isNumeric(String str);只由數字組成
 public static boolean isNumericSpace(String str);只由數字和空格組成

 

 StringUtils.isAlpha("a2bdefg");
 返回結果:false

 

8. 小字符串在大字符串中的匹配次數

 

public static int countMatches(String str,String sub);

 

StringUtils.countMatches("ababsssababa", "ab");
 返回結果:4

 

9. 字符串倒轉

 

 public static String reverse(String str);

 

 StringUtils.reverse("abcdef");
 返回結果:fedcba

 

10. 大小寫轉換,空格不動
 

 public static String swapCase(String str);

 

 StringUtils.swapCase("I am a-A*a")
 返回結果:i AM A-a*A

 

 

 

 

 

 

ArrayUtils是專門用來處理數組的工具類,提供不少有用的方法,下面是其一個方法藍圖:

 
 
 
ArrayUtils.png
 
 

添加方法

 

add(boolean[] array,boolean element)等等

 

add(T[] array,int index,T element)等等

 

addAll(boolean[] array1,boolean... array2)等等

 
    //添加元素到數組中       
    ArrayUtils.add([true, false], true) = [true, false, true]   
 
    //將元素插入到指定位置的數組中
    ArrayUtils.add(["a"], 1, null)     = ["a", null]
     ArrayUtils.add(["a"], 1, "b")      = ["a", "b"]
     ArrayUtils.add(["a", "b"], 3, "c") = ["a", "b", "c"]
 
    ArrayUtils.add(["a", "b"], ["c", "d"]) = ["a", "b", "c","d"]
 

克隆方法

 

clone(boolean[] array)等等

 
    ArrayUtils.clone(newint[] { 3, 2, 4 }); = {3,2,4}
 

包含方法

 

contains(boolean[] array,boolean valueToFind)

 
    // 查詢某個Object是否在數組中
    ArrayUtils.contains(newint[] { 3, 1, 2 }, 1); =  true
 

獲取長度方法

 

getLength(Object array)

 
    ArrayUtils.getLength(["a", "b", "c"]) = 3
 

獲取索引方法

 

indexOf(boolean[] array,boolean valueToFind)

 

indexOf(boolean[] array,boolean valueToFind,int startIndex)

 
    //查詢某個Object在數組中的位置,能夠指定起始搜索位置,找不到返回-1
    //從正序開始搜索,搜到就返回當前的index不然返回-1
    ArrayUtils.indexOf(newint[] { 1, 3, 6 }, 6); =  2
    ArrayUtils.indexOf(newint[] { 1, 3, 6 }, 2); =  -1
 
    //從逆序開始搜索,搜到就返回當前的index,不然返回-1
    ArrayUtils.lastIndexOf(newint[] { 1, 3, 6 }, 6); =  2
 
    //從逆序索引爲2開始搜索,,搜到就返回當前的index,不然返回-1
    ArrayUtils.lastIndexOf(new Object[]{"33","yy","uu"}, "33",2 ) = 0
 

判空方法

 

isEmpty(boolean[] array)等等

 

isNotEmpty(T[] array)   

 
    //判斷數組是否爲空(null和length=0的時候都爲空)
    ArrayUtils.isEmpty(newint[0]); =  true
    ArrayUtils.isEmpty(new Object[] { null }); = false
 

長度相等判斷方法

 

isSameLength(boolean[] array1,boolean[] array2)

 
    //判斷兩個數組的長度是否相等
    ArrayUtils.isSameLength(new Integer[] { 1, 3, 5 }, new Long[] { "1", "3", "5"}); = true
 

空數組轉換

 

nullToEmpty(Object[] array)等等

 
    //講null轉化爲相應數組
    int [] arr1 = null;
    int [] arr2 = ArrayUtils.nullToEmpty(arr1);
 

刪除元素方法

 

remove(boolean[] array,int index)等等

 

removeElement(boolean[] array,boolean element)

 

removeAll(T[] array,int... indices)

 

removeElements(T[] array,T... values)

 
   //刪除指定下標的元素       
   ArrayUtils.remove([true, false], 1)       = [true]
    ArrayUtils.remove([true, true, false], 1) = [true, false]
 
   //刪除第一次出現的元素
   ArrayUtils.removeElement([true, false], false)      = [true]
    ArrayUtils.removeElement([true, false, true], true) = [false, true]
 
   //刪除全部出現的下標的元素
   ArrayUtils.removeAll(["a", "b", "c"], 0, 2) = ["b"]
    ArrayUtils.removeAll(["a", "b", "c"], 1, 2) = ["a"]
 
   //刪除數組出現的全部元素
   ArrayUtils.removeElements(["a", "b"], "a", "c")      = ["b"]
    ArrayUtils.removeElements(["a", "b", "a"], "a")      = ["b", "a"]
    ArrayUtils.removeElements(["a", "b", "a"], "a", "a") = ["b"]
 

反轉方法

 

reverse(boolean[] array)等等

 

reverse(boolean[] array,int startIndexInclusive,int endIndexExclusive)

 
   //反轉數組
   int[] array =newint[] { 1, 2, 5 };
   ArrayUtils.reverse(array);// {5,2,1}
 
   //指定範圍的反轉數組,排除endIndexExclusive的
   int[] array =new int[] {1, 2, 5 ,3,4,5,6,7,8};
   ArrayUtils.reverse(array,2,5);
   System.out.println(ArrayUtils.toString(array)); = {1,2,4,3,5,5,6,7,8}
 

截取數組

 

subarray(boolean[] array,int startIndexInclusive,int endIndexExclusive)

 
    //截取數組
    ArrayUtils.subarray(newint[] { 3, 4, 1, 5, 6 }, 2, 4); =  {1,5}
    //起始index爲2(即第三個數據)結束index爲4的數組
    ArrayUtils.subarray(newint[] { 3, 4, 1, 5, 6 }, 2, 10); =  {1,5,6}
    //若是endIndex大於數組的長度,則取beginIndex以後的全部數據
 

打印數組方法

 

toString(Object array)        

 

toString(Object array,String stringIfNull)

 
    //打印數組
    ArrayUtils.toString(newint[] { 1, 4, 2, 3 }); =  {1,4,2,3}
    ArrayUtils.toString(new Integer[] { 1, 4, 2, 3 }); =  {1,4,2,3}
    //若是爲空,返回默認信息
    ArrayUtils.toString(null, "I'm nothing!"); =  I'm nothing!
 

數組類型轉換

 

toPrimitive(Boolean[] array,boolean valueForNull)

 

Boolean[] toObject(boolean[] array)

 

Map<Object,Object> toMap(Object[] array)

 

<T> T[] toArray(T... items)

 
    //基本數據類型數組與外包型數據類型數組互轉
    ArrayUtils.toObject(new int[] { 1, 2 }); = new Integer[]{Integer,Integer}
    ArrayUtils.toPrimitive(new Integer[] { new Integer(1), new Integer(2) }); = new int[]{1,2}
 
    //將二維數組轉換爲Map對象,數組類型必須爲Map.Entry or an Array這種類型,一個做爲key,一個做爲value
    Map colorMap = ArrayUtils.toMap(new Object[][] {
            {"RED", "#FF0000"},
            {"GREEN", "#00FF00"},
            {"BLUE", "#0000FF"}}
    );
 
    //根據傳入的參數,轉換爲對應的數組
    String[] array = ArrayUtils.toArray("1", "2");
    //建立String或者Number類型的數組
    String[] emptyArray = ArrayUtils.<String>toArray();
    Number[] emptyArray2 = ArrayUtils.<Number>toArray();


做者:阿_毅
連接:http://www.jianshu.com/p/7461c79f0113
來源:簡書
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

 

 

@responsebody表示該方法的返回結果直接寫入HTTP response body中。
它的使用狀況以下:
一、通常在異步獲取數據時使用,在使用@RequestMapping後,返回值一般解析爲跳轉路徑,加上@responsebody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP response body中。好比異步獲取json數據,加上@responsebody後,會直接返回json數據。

二、通常是指定要response 的type。好比json 或 xml 能夠直接用jackson或jaxb的包,而後就能夠自動返回了,xml中也無需多的配置,就可使用。

好處是:GET模式下,這裏使用了@PathVariable綁定輸入參數,很是適合Restful風格。由於隱藏了參數與路徑的關係,能夠提高網站的安全性,靜態化頁面,下降惡意攻擊風險。
POST模式下,使用@RequestBody綁定請求對象,Spring會幫你進行協議轉換,將Json、Xml協議轉換成你須要的對象。
@ResponseBody能夠標註任何對象,由Srping完成對象——協議的轉換。
壞處是:返回以前,若前端編碼格式不一致,很容易致使亂碼。

 

@responsebody表示該方法的返回結果直接寫入HTTP response body中

通常在異步獲取數據時使用,在使用@RequestMapping後,返回值一般解析爲跳轉路徑,加上@responsebody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP response body中。好比異步獲取json數據,加上@responsebody後,會直接返回json數據。

 

 

Java 同步和異步交換數據

同步:A跟B說給我一杯水,B去倒水,A等着,B倒完水,給A拿來,A喝水,A繼續作其餘事情
異步:A跟B說給我一杯水,B去倒水,A去作其餘事情,B倒完水,跟A說水來了,A放下其餘事情喝水,A喝完水繼續作其餘事情

 

交互模型就是Ajax在Browser端引入一個執行引擎,它一邊應付user的請求,一邊把某些必須交給服務器處理的東西背地裏傳送給服務器,同時背地裏把結果準備好(接受服務器端的數據),展示給客戶的技術模式。Ajax加強了用戶的操做性。

而同步就是整個頁面都刷新,異步就是隻刷新用了Ajax技術的部分

 

 

Spring-jdbc:JdbcTemplate使用簡介

原創 2016年08月16日 11:18:14

爲了使 JDBC 更加易於使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此創建一個JDBC存取框架.

做爲 SpringJDBC 框架的核心, JDBC 模板的設計目的是爲不一樣類型的JDBC操做提供模板方法. 每一個模板方法都能控制整個過程,並容許覆蓋過程當中的特定任務.經過這種方式,能夠在儘量保留靈活性的狀況下,將數據庫存取的工做量降到最低.

JdbcTemplate主要提供如下五類方法:
execute方法:能夠用於執行任何SQL語句,通常用於執行DDL語句;
update方法及batchUpdate方法:update方法用於執行新增、修改、刪除等語句;batchUpdate方法用於執行批處理相關語句;
query方法及queryForXXX方法:用於執行查詢相關語句;
call方法:用於執行存儲過程、函數相關語句。

使用示例:

在數據庫中先準備兩張表:

 

 

在java工程中建立兩個對應類:

[java] view plain copy

  1. public class Department {  
  2.     int id;  
  3.     String deptName;  
  4.     @Override  
  5.     public String toString() {  
  6.         return "Department [id=" + id + ", deptName=" + deptName + "]";  
  7.     }  
  8.       
  9. }  

[java] view plain copy

  1. public class Employee {  
  2.     int id;  
  3.     String lastName;  
  4.     String email;  
  5.     Department department;  
  6.     @Override  
  7.     public String toString() {  
  8.         return "Employee [id=" + id + ", lastName=" + lastName + ", email="  
  9.                 + email + ", department=" + department + "]";  
  10. 10.     }  
  11. 11.     public int getId() {  
  12. 12.         return id;  
  13. 13.     }  
  14. 14.     public void setId(int id) {  
  15. 15.         this.id = id;  
  16. 16.     }  
  17. 17.     public String getLastName() {  
  18. 18.         return lastName;  
  19. 19.     }  
  20. 20.     public void setLastName(String lastName) {  
  21. 21.         this.lastName = lastName;  
  22. 22.     }  
  23. 23.     public String getEmail() {  
  24. 24.         return email;  
  25. 25.     }  
  26. 26.     public void setEmail(String email) {  
  27. 27.         this.email = email;  
  28. 28.     }  
  29. 29.     public Department getDepartment() {  
  30. 30.         return department;  
  31. 31.     }  
  32. 32.     public void setDepartment(Department department) {  
  33. 33.         this.department = department;  
  34. 34.     }  
  35. 35.       
  36. 36.       

37. }  



引入Spring框架相關的jar包以及c3p0和mysql鏈接jar包。爲了對方法進行測試,這裏還須要引入JUnit4.這裏以導入外部屬性文件的方式來配置數據源:

jdbc.properties文件內容以下:

[plain] view plain copy

  1. user=root  
  2. password=123  
  3. driverClass=com.mysql.jdbc.Driver  
  4. jdbcUrl=jdbc:mysql:///spring  
  5.   
  6. initPoolSize=5  
  7. maxPoolSize=10  


在xml文件中,導入這個屬性文件以及配置c3p0數據源:

[html] view plain copy

  1. <!-- 導入資源文件 -->  
  2. <context:property-placeholder location="classpath:jdbc.properties"/>  
  3.   
  4. <!-- 配置 c3p0 數據源 -->  
  5. <bean id="dataSource"  
  6.     class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  7.     <property name="user" value="${user}"></property>     
  8.     <property name="password" value="${password}"></property>     
  9.     <property name="jdbcUrl" value="${jdbcUrl}"></property>   
  10. 10.     <property name="driverClass" value="${driverClass}"></property>   
  11. 11.       
  12. 12.     <property name="initialPoolSize" value="${initPoolSize}"></property>      
  13. 13.     <property name="maxPoolSize" value="${maxPoolSize}"></property>   

14. </bean>  


配置好dataSource後就能夠用這個數據源來配置JdbcTemplate了,在xml文件中添加:

[html] view plain copy

  1. <!-- 配置 spring 的 JdbcTemplate -->  
  2. <bean id="jdbcTemplate"  
  3.     class="org.springframework.jdbc.core.JdbcTemplate">  
  4.     <property name="dataSource" ref="dataSource"></property>  
  5. </bean>  

接下來建立一個測試類對JdbcTemplate的方法進行測試:

[java] view plain copy

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import org.junit.Test;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7. import org.springframework.jdbc.core.BeanPropertyRowMapper;  
  8. import org.springframework.jdbc.core.JdbcTemplate;  
  9. import org.springframework.jdbc.core.RowMapper;  
  10. 10.   

11. public class JDBCTest {  

  1. 12.       
  2. 13.     private ApplicationContext ctx= null;  
  3. 14.     private JdbcTemplate jdbcTemplate = null;  

15. //  private EmployeeDao employee;  

  1. 16.   
  2. 17.     {  
  3. 18.         ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");  
  4. 19.         jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");  
  5. 20.     }  
  6. 21.   
  7. 22.     /** 
  8. 23.      * 執行 INSERT,UPDATE,DELETE 
  9. 24.      */  
  10. 25.     @Test  
  11. 26.     public void testUpdate() {  
  12. 27.         String sql = "UPDATE employees SET last_name = ? WHERE id = ?";  
  13. 28.         jdbcTemplate.update(sql, "Jack", 5);  
  14. 29.     }  
  15. 30.     /** 
  16. 31.      * 測試批量更新操做 
  17. 32.      * 最後一個參數是 Object[] 的 List 類型:由於修改一條記錄須要一個 Object 數組,修改多條記錄就須要一個 List 來存放多個數組。 
  18. 33.      */  
  19. 34.     @Test  
  20. 35.     public void testBatchUpdate() {  
  21. 36.         String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";  
  22. 37.           
  23. 38.         List<Object[]> batchArgs = new ArrayList<>();  
  24. 39.           
  25. 40.         batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1});  
  26. 41.         batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2});  
  27. 42.         batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3});  
  28. 43.         batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3});  
  29. 44.         batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2});  
  30. 45.           
  31. 46.         jdbcTemplate.batchUpdate(sql, batchArgs);  
  32. 47.     }  
  33. 48.       
  34. 49.     /** 
  35. 50.      * 從數據庫中獲取一條記錄,實際獲得對應的一個對象 
  36. 51.      * 注意:不是調用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! 
  37. 52.      * 而須要調用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) 
  38. 53.      * 一、其中的 RowMapper 指定如何去映射結果集的行,經常使用的實現類爲 BeanPropertyRowMapper 
  39. 54.      * 二、使用 SQL中的列的別名完成列名和類的屬性名的映射,例如 last_name lastName 
  40. 55.      * 三、不支持級聯屬性。 JdbcTemplate 只能做爲一個 JDBC 的小工具, 而不是 ORM 框架 
  41. 56.      */  
  42. 57.     @Test  
  43. 58.     public void testQueryForObject() {  
  44. 59.         String sql = "SELECT id, last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE ID = ?";  
  45. 60.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  46. 61.         //在將數據裝入對象時須要調用set方法。  
  47. 62.         Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);  
  48. 63.           
  49. 64.         System.out.println(employee);  
  50. 65.     }  
  51. 66.       
  52. 67.     /** 
  53. 68.      * 一次查詢多個對象 
  54. 69.      * 注意:調用的不是 queryForList 方法 
  55. 70.      */  
  56. 71.     @Test  
  57. 72.     public void testQueryForList() {  
  58. 73.         String sql = "SELECT id, last_name lastName, email FROM employees WHERE id > ?";  
  59. 74.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  60. 75.         List<Employee> employees = jdbcTemplate.query(sql, rowMapper,5);  
  61. 76.           
  62. 77.         System.out.println(employees);  
  63. 78.     }  
  64. 79.     /** 
  65. 80.      * 獲取單個列的值或作統計查詢 
  66. 81.      * 使用 queryForObject(String sql, Class<Long> requiredType)  
  67. 82.      */  
  68. 83.     @Test  
  69. 84.     public void testQueryForObject2() {  
  70. 85.         String sql = "SELECT count(id) FROM employees";  
  71. 86.         long count = jdbcTemplate.queryForObject(sql, Long.class);  
  72. 87.           
  73. 88.         System.out.println(count);  
  74. 89.     }     

90. }  


在實際的使用中,通常會建立一個dao類來封裝對某個對象的全部增刪改查操做.

好比,建立一個EmployeeDao類以下:

[java] view plain copy

  1. import org.springframework.beans.factory.annotation.Autowired;  
  2. import org.springframework.jdbc.core.BeanPropertyRowMapper;  
  3. import org.springframework.jdbc.core.JdbcTemplate;  
  4. import org.springframework.jdbc.core.RowMapper;  
  5. import org.springframework.stereotype.Repository;  
  6.   
  7. @Repository  
  8. public class EmployeeDao {  
  9.     @Autowired  
  10. 10.     private JdbcTemplate jdbcTemplate;  
  11. 11.       
  12. 12.     public Employee get(Integer id) {  
  13. 13.         String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?";  
  14. 14.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  15. 15.         Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id);  
  16. 16.           
  17. 17.         return employee;  
  18. 18.     }  

19. }  


在這個Dao類中實現了經過id來獲取記錄並封裝成對象返回的方法。若是有須要還能夠實現其餘操做如插入、刪除、更新等。

因爲這裏使用了註解來配置bean以及bean的自動裝配,因此還須要在xml文件中添加(要先導入context命名空間):

[html] view plain copy

  1. <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>  

測試一下EmployeeDao:

[java] view plain copy

  1. @Test  
  2. public void testEmployeeDao() {  
  3.     EmployeeDao employeeDao = (EmployeeDao) ctx.getBean("employeeDao");  
  4.     Employee employee = employeeDao.get(1);  
  5.     System.out.println(employee);  
  6. }  


打印輸出以下:

 

總結:JdbcTemplate是Spring框架自帶的對JDBC操做的封裝,目的是提供統一的模板方法使對數據庫的操做更加方便、友好,效率也不錯。可是功能仍是不夠強大(好比不支持級聯屬性),在實際應用中還須要和hibernate、mybaties等框架混合使用。

相關文章
相關標籤/搜索