Spring-jdbc:JdbcTemplate使用簡介

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

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

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java多線程編程:變量共享分析(Thread)

Java多線程編程&#xff1a;變量共享分析&#xff08;Thread&#xff09; Java 創建線程的兩種方法 此處只簡單講下自己對java多線程變量共享的理解&#xff1a; 按照進程和多線程的原理&#xff0c;同一進程內的多個線程之間的地址空間是共享的&#xff08;除去ThreadLocal&a…

嘉益仕(Litns)帶您讀懂MES系統:選型篇

自從智能制造概念提出以來&#xff0c;制造執行系統MES在國內掀起了新一波的熱潮。眾多企業在技術發展、政策導向和自身需要的推動下&#xff0c;紛紛上馬MES請添加鏈接描述項目。 由此也帶動了MES軟件開發企業的快速發展。一夜之間MES軟件開發企業遍地開花&#xff0c;MES產品…

[WPF]xml序列化以及反序列化數據

代碼 XML序列化工具類 public static class XMLHelper{/// <summary>/// 將對象序列化為指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多線程的那點兒事

1. 多線程的那點兒事&#xff08;基礎篇&#xff09; 多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程&#xff0c;這就要牽涉到多進程&#xff1f;當然&#xff0c;要了解到多進程&#xff0c;就要涉及到操作系統。不過大家也不要緊張&#xff0c;聽我慢慢道來。…

Android應用開發—AsyncTask

摘錄自 Android 多線程—–AsyncTask詳解 AsyncTask AsyncTask&#xff1a;異步任務&#xff0c;從字面上來說&#xff0c;就是在我們的UI主線程運行的時候&#xff0c;異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在后臺。我們可以將耗時的操作放在異步任務當…

std::shared_ptr之deleter的巧妙應用

本文由作者鄒啟文授權網易云社區發布。std::shared_ptr一次創建&#xff0c;多處共享&#xff0c;通過引用計數控制生命周期。 實例 在郵箱大師PC版中&#xff0c;我們在實現搜索時&#xff0c;大致思路是這樣的&#xff1a; 每一個賬號都有一個SearchFlow&#xff0c;搜索開始…

js - 執行上下文和作用域以及閉包

首先&#xff0c;咱們通常被"執行上下文"&#xff0c;"執行上下文環境"&#xff0c;"上下文環境"&#xff0c;"執行上下文棧"這些名詞搞混。那我們一一來揭秘這些名字的含義。 這一塊一直比較晦澀難懂&#xff0c;還是需要仔細去斟酌斟…

Spring之JDBCTemplate

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Spring對不同的持久化支持&#xff1a; Spring為各種支持的持久化技術&#xff0c;都提供了簡單操作的模板和回調 ORM持久化技術模…

從螞蟻金服實踐入手,帶你深入了解 Service Mesh

本文整理自螞蟻金服高級技術專家敖小劍在 QCon 上海 2018 上的演講。我是來自螞蟻金服中間件團隊的敖小劍&#xff0c;目前是螞蟻金服 Service Mesh 項目的 PD。我同時也是 Servicemesher 中國技術社區的創始人&#xff0c;是 Service Mesh 技術在國內最早的布道師。我今天給大…

Android應用開發—FragmentManager如何管理fragments

本文主要摘錄自Android中使用FragmentManager管理fragments 和 淺談FragmentManager與fragment之一二事 先講下自己對fragment的理解&#xff1a; 對于fragment&#xff0c;有太多官方文檔和博文來介紹&#xff0c;此處不做轉述&#xff1a;我感覺android提供fragment這種組件…

數組指針 和 指針數組

最近發現公司有些人說怎樣區分 數組指針 和 指針數組 &#xff1f; 其實 很簡單&#xff1b; 數組指針&#xff0c; 先是&#xff08;定語 &#xff09; &#xff08;主體&#xff09;&#xff0c; &#xff08;定語 數組&#xff09; &#xff08;主體 指針&#xff09…

在云服務器上注意GeoServer和ShadowDataMap的跨域設置

在云服務器上注意GeoServer和ShadowDataMap的跨域設置 1、對于支持cors的網絡資源 可以在ShadowDataMap的devserverconfig.json里設置相應的跨域資源 提示&#xff1a;geoserver發布的地圖服務雖然同在一個服務器上&#xff0c;但是端口不一樣&#xff0c;同樣需要設置跨域 如&…

Guava ImmutableCollection簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ImmutableCollection代碼定義 GwtCompatible(emulatedtrue) public abstract class ImmutableCollection<E> extends AbstractCo…

Todo List

fragment里面如何處理back按鍵事件。 fragment里面無法Override onBackPressed接口&#xff0c;如何優雅的處理back press事件&#xff1f;activity如何獲取當前活躍的fragment對象。異步網絡請求如何改造成rxjava&#xff0c;rxjava有設置運行線程的能力&#xff0c;異步請求…

常見的幾種負載均衡算法

1、輪詢將所有請求&#xff0c;依次分發到每臺服務器上&#xff0c;適合服務器硬件相同的場景。優點&#xff1a;服務器請求數目相同&#xff1b; 缺點&#xff1a;服務器壓力不一樣&#xff0c;不適合服務器配置不同的情況&#xff1b; 2、隨機請求隨機分配到各臺服務器上。優…

基于 Token 的身份驗證方法

基于 Token 的身份驗證方法 使用基于 Token 的身份驗證方法&#xff0c;在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的&#xff1a;客戶端使用用戶名跟密碼請求登錄 服務端收到請求&#xff0c;去驗證用戶名與密碼 驗證成功后&#xff0c;服務端會簽發一個 Token&…

Android應用開發-圖片加載庫Glide

Glide Picasso和Glide之間的區別&#xff1a; Picasso 僅僅緩存了全尺寸的圖像&#xff1b;然而 Glide 緩存了原始圖像&#xff0c;全分辨率圖像和另外小版本的圖像。

excel 表格導入 - java 實現

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp…

C語言 API

MySQL的C語言API接口 1、首先當然是連接數據庫&#xff0c;函數原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

線程組之間的JMeter傳遞變量

下面&#xff0c;我們將看看如何在線程組之間共享和傳遞變量。在開發高級JMeter腳本時&#xff0c;很可能您將擁有多個線程組。每個線程組將執行不同的請求。一個很好的例子是我們需要使用Bearer Tokens對用戶進行身份驗證。一個線程組執行身份驗證并保存令牌。另一個線程組需要…