首頁 Java java教程 關於Spring中JDBC資料庫的方法介紹

關於Spring中JDBC資料庫的方法介紹

May 11, 2017 am 10:08 AM
java jdbc spring 連接池

本篇文章主要介紹了基於Spring的JDBC基本框架搭建;基於Spring的JDBC增刪改查;讀取設定檔中的資料等,具有很好的參考價值。下面跟著小編一起來看下吧

資料庫連線池

對一個簡單的資料庫應用,由於對資料庫的存取不是很頻繁,這時可以簡單地在需要存取資料庫時,就新建立一個連接,就完後就關閉它,這樣做也不會帶來什麼效能上的開銷。但對於一個複雜的資料庫應用,情況就完全不同而,頻繁的建立、關閉連接,會大大減低系統的效能,因為對於連接的使用成了系統效能的瓶頸。

透過建立一個資料庫連線池以及一套連線使用管理策略,可以達到連線重複使用的效果,使得一個資料庫連線可以得到安全、高效率的複用,避免了資料庫連線頻繁建立、關閉的開銷。

資料庫連接池的基本原理是在內部物件池中維護一定數量的資料庫連接,並對外暴露資料庫連接取得和返回方法。如:外部使用者可透過getConnection方法取得連接,使用完畢後再透過releaseConnection方法將連接返回,注意此時連接並沒有關閉,而是由連接池管理器回收,並為下一次使用做好準備。

資料庫連線池技術帶來的好處:

#1、資源重複使用

由於資料庫連線得到重複使用,避免了頻繁創建、釋放連結引起的大量效能開銷。在減少系統消耗的基礎上,另一方面也增進了系統運行環境的平穩性(減少內存碎片以及數據庫臨時進行/線程數量)

2、更快地系統反應速度

資料庫連線池在初始化過程中,往往已經建立了若干資料庫連線池置於池中備用。此時連接的初始化工作均已完成,對於業務請求處理而言,直接利用現有可用連接,避免了資料庫連接初始化和釋放過程的時間開銷,從而縮減了系統整體回應時間

#3、統一的連線管理,避免資料庫連線外洩

在較為完備的資料庫連線池實作中,可根據預先的連線佔用逾時設定,強制收回被佔用連接,從而避免了常規資料庫連接操作中可能出現的資源外洩。

目前資料庫連線池產品是非常多的,主要有:

#1、dbcp

dbcp,即DataBase Connection PoolApache出品,Spring開發組建議使用的資料庫連接池,開發較為活躍,是使用極為廣泛的資料庫連接池產品。不過從網路上

2、c3p0

Hibernate開發群組推薦使用的資料庫連線池,它實作了資料來源和JNDI的綁定

3、Proxool

Proxool的口碑較好,沒什麼負面評價(例如dbcp就是因為Hibernate認為它BUG太多Hibernate才不推薦使用的),也是Hibernate開發組推薦使用的資料庫連線池,不過使用者不算多,開發不夠活躍。這個連接池提供了連接池監控的功能,方便易用,便於發現連接池洩漏的情況

#基於Spring的JDBC基本框架搭建

先講一下使用Spring實作JDBC,資料庫連線池就用Spring開發組推薦的DBCP,DBCP需要三個jar包,先下載一下:

1、commons-dbcp-1.4.jar,官方網站上有,點我下載

2、commons.pool-1.6.jar,官方網站上有,點我下載

3、commons.collections4-4.0.jar,官方網站上有

下載了這三個jar包之後請導入自己的工程中(注意MySql的包別忘記導入了),雖然dbcp和pool都出了dbcp2和pool2的版本,Apache官網上都可以下載,但是這裡提供的還是dbcp1和pool1的版本下載地址,一個原因是dbcp2和pool2都只可以在JDK1.7及JDK1.7以上的版本運行,而dbcp1和pool1則可以在JDK1.6的版本運行,考慮到MyEclipse10預設自帶的JRE就是1.6版本的,所以這裡下載、使用dbcp1和pool1。想要dbcp2和pool2的可以自己去Apache官網下載,不過要注意,dbcp2必須和pool2一組,dbcp1必須和pool1一組,不可以混著用。

JDBC,我之前寫過一篇文章,資料庫建立和實體類別都是用的原文章裡面的,這裡只是把原生的JDBC搬到Spring JDBC下而已,看下最基礎的寫法,再新增功能,學生管理類別為:

public class StudentManager
{
 private JdbcTemplate jdbcTemplate;

 private static StudentManager instance = new StudentManager();

 public static StudentManager getInstance()
 {
 return instance;
 }

 public JdbcTemplate getJdbcTemplate()
 {
 return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
 {
 this.jdbcTemplate = jdbcTemplate;
 }
}
登入後複製

Spring的XML設定檔命名為jdbc.xml,jdbc.xml的寫法為:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.2.xsd">

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <!-- 驱动包名 -->
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <!-- 数据库地址 -->
 <property name="url" value="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8;" />
 <!-- 用户名 -->
 <property name="username" value="root" />
 <!-- 密码 -->
 <property name="password" value="root" />
 <!-- 最大连接数量 -->
 <property name="maxActive" value="150" />
 <!-- 最小空闲连接 -->
 <property name="minIdle" value="5" />
 <!-- 最大空闲连接 -->
 <property name="maxIdle" value="20" />
 <!-- 初始化连接数量 -->
 <property name="initialSize" value="30" />
 <!-- 连接被泄露时是否打印 -->
 <property name="logAbandoned" value="true" />
 <!-- 是否自动回收超时连接 -->
 <property name="removeAbandoned" value="true" />
 <!-- 超时等待时间(以秒为单位) -->
 <property name="removeAbandonedTimeout" value="10" />
 </bean>

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> 
 <property name="jdbcTemplate" ref="jdbcTemplate" />
 </bean>
</beans>
登入後複製

#函數為:

public static void main(String[] args)
{ 
 ApplicationContext ac = 
  new ClassPathXmlApplicationContext("jdbc.xml");
 System.out.println(StudentManager.getInstance());
 System.out.println(StudentManager.getInstance().getJdbcTemplate());
}
登入後複製

運行沒什麼問題,得到StudentManager的引用位址和StudentManager中屬性jdbcTemplate的參考位址,說明整個連接、注入都沒問題。

JDBCTemple是Spring裡面最基本的JDBC模板,利用JDBC和簡單的索引參數查詢提供對資料庫的簡單存取。除了JDBCTemplate,Spring還提供了NamedParameterJdbcTemplate和SimpleJdbcTemplate兩個類,前者能夠在執行查詢時把值綁定到SQL裡的命名參數而不是使用索引,後者利用Java 5的特性例如自動裝箱、泛型和可變參數清單來簡化JDBC範本的使用。具體使用哪個看個人喜好,這裡使用JdbcTemplate,所以把JdbcTemplate加入學生管理類別。

另外:

1、dbcp提供很多參數給使用者配置,每個參數的意思都以註解的形式寫在.xml裡面了,更具體要知道每個參數的意思可以上網查詢一下

2、注意dbcp的屬性url,url指的是資料庫連線位址,遇到特殊字元要轉義,所以這裡的"&"變成了"&",不然會報錯

#基於Spring的JDBC增刪改查

上面一部分搭建了一個Spring JDBC的基礎框架,下面看一下Java程式碼如何實作CRUD,這個過程中jdbc.xml都不需要變化。

1、新增一個學生訊息,代碼為:

// 添加学生信息
public boolean addStudent(Student student)
{
 try
 {
 jdbcTemplate.update("insert into student values(null,?,?,?)", 
  new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone()},
  new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}
登入後複製

2、根據Id刪除指定學生訊息,代碼為:

// 根据Id删除单个学生信息
public boolean deleteStudent(int id)
{
 try
 {
 jdbcTemplate.update("delete from student where studentId = ?", new Object[]{id}, new int[]{Types.INTEGER});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}
登入後複製

3、根據Id更新學生信息,代碼為:

// 根据Id更新指定学生信息
public boolean updateStudent(int Id, Student student)
{
 try
 {
 jdbcTemplate.update("update student set studentName = ?, studentAge = ?, studentPhone = ? where studentId = ?", 
  new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone(), Id},
  new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR, Types.INTEGER});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}
登入後複製

4、根據Id查詢學生信息,代碼為:

// 根据学生Id查询单个学生信息
public Student getStudent(int id)
{
 try
 {
 return (Student)jdbcTemplate.queryForObject("select * from student where studentId = ?", 
  new Object[]{id}, new int[]{Types.INTEGER}, new RowMapper<Student>(){
  public Student mapRow(ResultSet rs, int arg1) throws SQLException
  {
  Student student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4));
  return student;
  }
 });
 }
 // 根据Id查询学生信息抛异常, 不管什么原因, 认为查询不到该学生信息, 返回null
 catch (DataAccessException e)
 {
 return null;
 }
}
登入後複製

5、查詢所有學生信息,代碼為:

// 查询所有学生信息
public List<Student> getStudents()
{
 List<Map<String, Object>> resultList = jdbcTemplate.queryForList("select * from student");
 List<Student> studentList = null;
 if (resultList != null && !resultList.isEmpty())
 {
 studentList = new ArrayList<Student>();
 Map<String, Object> map = null;
 for (int i = 0; i < resultList.size(); i++)
 {
  map = resultList.get(i);
  Student student = new Student(
  (Integer)map.get("studentId"), (String)map.get("studentName"),
  (Integer)map.get("studentAge"), (String)map.get("studentPhone")
  );
  studentList.add(student);
  }
 }
 return studentList;
}
登入後複製

這是簡單的CRUD操作,有了這5個作為基礎,其餘都可以在這5個的基礎上做擴展,就不繼續詳細寫下去了,說幾個注意點:

1、個人使用經驗來說,除了最後一個查詢所有的以外,建議給其他的都加上try...catch...區塊,因為在操作失敗的時候會拋出異常,捕獲了就可以知道這次的操作失敗了,否則只能程式終止,而自己也不知道操作到底是成功還是失敗

2、添加資訊、更新資訊不建議把每個待操作的字段都作為形參而建議形參就是一個Student實體類,這樣一來更符合面向對象設計原則,二來形參列表的字段多很容易導致出錯

3、update、query方法,如果有佔位符?的話,建議選擇有參數類型的重載方法,指定每個佔位符的字段類型,就像我上面程式碼寫的

最後,這裡講的都是jdbcTemplate的基本上使用,jdbcTemplate裡面還有很多方法,就不一一細說了,可以自己去試一下,也可以查閱Spring API文件。

讀取設定檔中的資料

之前我們都是把資料庫連接的一些屬性配置在db.properties裡面的,這樣方便修改,而這裡卻是在jdbc.xml裡面寫死的,所以要想一個辦法怎麼可以從db.properties裡面讀取出配置,context幫助開發者實現了這一點,看看jdbc.xml如何寫:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.2.xsd">

 <context:property-placeholder location="classpath:db.properties"/>

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <!-- 驱动包名 -->
 <property name="driverClassName" value="${mysqlpackage}" />
 <!-- 数据库地址 -->
 <property name="url" value="${mysqlurl}" />
 <!-- 用户名 -->
 <property name="username" value="${mysqlname}" />
 <!-- 密码 -->
 <property name="password" value="${mysqlpassword}" />
 <!-- 最大连接数量 -->
 <property name="maxActive" value="150" />
 <!-- 最小空闲连接 -->
 <property name="minIdle" value="5" />
 <!-- 最大空闲连接 -->
 <property name="maxIdle" value="20" />
 <!-- 初始化连接数量 -->
 <property name="initialSize" value="30" />
 <!-- 连接被泄露时是否打印 -->
 <property name="logAbandoned" value="true" />
 <!-- 是否自动回收超时连接 -->
 <property name="removeAbandoned" value="true" />
 <!-- 超时等待时间(以秒为单位) -->
 <property name="removeAbandonedTimeout" value="10" />
 </bean>

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> 
 <property name="jdbcTemplate" ref="jdbcTemplate" />
 </bean>
</beans>
登入後複製

【相關推薦】

1. Java免費影片教學

2. JAVA教學手冊

3. 全面解析Java註解

以上是關於Spring中JDBC資料庫的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles