搜尋
首頁Javajava教程關於Spring中JDBC資料庫的方法介紹

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

May 11, 2017 am 10:08 AM
javajdbcspring連接池

本篇文章主要介紹了基於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
在Java中如何在項目啟動時動態修改easypoi中@Excel註解的savePath參數?在Java中如何在項目啟動時動態修改easypoi中@Excel註解的savePath參數?Apr 19, 2025 pm 02:09 PM

在Java中如何動態配置實體類註解的參數在開發過程中,我們經常會遇到需要根據不同環境動態配置註解參數的�...

在YARN上提交PyFlink作業時,為什麼會報錯無法找到Python腳本?在YARN上提交PyFlink作業時,為什麼會報錯無法找到Python腳本?Apr 19, 2025 pm 02:06 PM

在YARN上提交PyFlink作業時報錯無法找到Python腳本的原因分析當你嘗試通過YARN提交一個PyFlink作業時,可能會遇到�...

Spring Boot項目中調用第三方接口,字段名大小寫和getter方法不一致導致數據傳輸失敗怎麼辦?Spring Boot項目中調用第三方接口,字段名大小寫和getter方法不一致導致數據傳輸失敗怎麼辦?Apr 19, 2025 pm 02:03 PM

在SpringBoot項目中調用第三方接口傳輸數據時遇到的難題本文將針對一個Spring...

如何將名字轉換為數字以實現群組內排序?如何將名字轉換為數字以實現群組內排序?Apr 19, 2025 pm 01:57 PM

如何將名字轉為數字以實現群組內排序?在群組中排序用戶時,常常需要將用戶的名字轉化為數字,以便在不同...

在Java遠程調試中,如何正確獲取遠程服務器上的常量值?在Java遠程調試中,如何正確獲取遠程服務器上的常量值?Apr 19, 2025 pm 01:54 PM

Java遠程調試中常量獲取的疑問解答在使用Java進行遠程調試時,許多開發者可能會遇到一些難以理解的現象。其�...

在後端開發中,如何區分service層和dao層的職責?在後端開發中,如何區分service層和dao層的職責?Apr 19, 2025 pm 01:51 PM

探討後端開發中的分層架構在後端開發中,分層架構是一種常見的設計模式,通常包括controller、service和dao三層�...

See all articles

熱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 無盡。

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。