首頁  >  文章  >  Java  >  關於Spring中JDBC資料庫的方法介紹

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

Y2J
Y2J原創
2017-05-11 10:08:051573瀏覽

本篇文章主要介紹了基於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