數據持久化編程學習總結
一、JDBC編程
1. 使用JDBC規範
在數據庫編程方面。最先使用的數據持久化技術無疑是JDBC
能夠說JDBC(Java Data Base Connectivity)是學習其他數據持久化技術的基礎
Java中訪問數據庫使用的就是JDBC。基本操作有CRUD(Create-Read-Update-Delete)
JDBC定義了數據庫的連接。SQL語句的運行以及查詢結果集的遍歷,一般操作過程例如以下:
1. 註冊驅動:DriverManager.registerDriver(driver);
2. 建立連接:Connection conn = DriverManager.getConnection(url, "username","password");
3. 獲取對象:Statement stmt = conn.createStatement();
4. 運行查詢:ResultSet rs = stmt.executeQuery(sqlstring);
5. 處理結果:while (rs.next()){doing something about the result}
6. 釋放連接:rs.close(); stmt.close();conn.close();
總結:在初學階段,無疑是必須學會使用原生態的JDBC進行數據庫編程
長處:JDBC為數據庫編程提供了可能,規範了數據庫的連接和操作方式
缺點:JDBC API和SQL語句與Servlet和JSP夾雜在一起
每次進行數據庫操作都要進行對象的創建與銷毀
二、JDBC高級應用
1. 使用DAO模式
大量進行JDBC編程後,就積累了不少經驗和發現不少缺點,於是對JDBC進行分層和模塊化
而DAO(Data Access Object)和POJO(Plain Old Java Object)則是JDBC下經常使用的模式
在DAO模式出現之前,操作數據庫的代碼與業務代碼均出如今Servlet或者JSP中
SQL語句、Java語句和Html語句夾雜在一起了,導致開發效率非常底下
而使用了DAO模式後,全部的JDBC API和SQL語句均移到了DAO層
實現分層後Servlet、JSP僅僅與Java Bean、DAO層交互,而不會有JDBC API和SQL語句
這無疑添加了程序的清晰性、可讀性。並且其可重用性比較好
2. 使用DBCP
在JDBC編程中。每一次的數據操作,都要創建並銷毀conn對象、stmt對象和rs對象
繁瑣的創建和銷毀這些對象無疑會消耗一定的時間和IO資源,在並發訪問時尤其明顯
使用數據源DBCP(DataBase connection pool)技術能夠解決這一問題
數據源一般配置在xml文件裏,使用數據源會自己主動進行優化和管理,一般配置例如以下:
<property name="driverClassName" value="driverClassName"></property> <property name="url" value="jdbc url"></property> <property name="username" value="username"></property> <property name="password" value="password"></property>
總結:DAO模式攻克了JDBC API和SQL語句與JSP的夾雜問題並實現了分層
DBCP則為繁瑣的創建和銷毀對象提供了解決方法
三、使用ORM框架Hibernate進行數據庫編程
1. ORM框架的基本原理
DAO模式無非就是手動將POJO拆分並拼裝成SQL語句和將SQL查詢結果拼裝回POJO
在使用了JDBC高級技術和DAO模式進行編程後。仍然須要編寫大量的SQL語句
而ORM通過xml配置文件或使用Java註解的方式把Java對象映射到數據庫上
這樣ORM(Object-Relative Database-Mapping)框架就能自己主動生成SQL語句
2. 使用ORM框架Hibernate進行數據庫編程
Hibernete是ORM框架的一種,相同可以自己主動生成SQL語句
在DAO模式中,一個簡單的Person POJO例如以下(省略getter和setter方法):
public class Person { private Integer id; private String name; }
相應於數據庫的表person(使用MySQL數據庫)
create table if not exists person ( id int primary key auto_increment, name varchar(20) not null, );
使用Java註解後Person POJO實體類能映射到數據庫上,並能自己主動生成SQL語句
代碼例如以下(省略getter和setter方法):
@Entity @Table(name = "person") public class Person{ @Id @GeneratedValue(strategy= IDENTITY) private Integer id; @Column(name = "name") private String name; }
Hibernate使用Session和HQL語句進行數據庫的相關操作。如查詢數據的操作例如以下:
Session session = HibernateSessionFactory.getSessionFactory().openSession(); String queryString = "select p.id,p.name from Person p"; //查詢並輸出全部的記錄 List<Object[]> personList = session.createQuery(queryString).list(); for(Object[] row : personList){ for(Object obj : row) System.out.print(" " + obj); System.out.println(); } session.close();
總結:ORM這類的框架攻克了DAO層須要編寫大量的SQL語句的問題
(Hibernate使用HQL攻克了數據庫的移植問題)
長處:無需再編寫大量的SQL語句並攻克了數據庫移植問題
缺點:在數據庫事務操作上仍然要編寫較多的代碼
四、使用JPA規範進行數據庫編程
1. 使用JPA規範
因為人們使用各種不同的數據庫如Oracle、DB2、MySQL和SQL Server等進行數據存儲
所以進行數據庫連接的方式必定多種多樣。而JDBC則規範了數據庫的連接方式
相同的道理,各種ORM框架的出現必定會使開發和維護的難度升級
所以Java官方又推出了JPA規範。旨在規範各種ORM框架。使其有統一的接口和方法
使用JPA規範進行數據庫編程僅僅需指定一種ORM框架作為底層的實現,如Hibernate
假設須要更換其他的ORM框架則僅僅需在配置文件裏改動,類似於更換其他的數據庫
而JPA規範則使用EntityManager進行相關的數據庫操作。如查找操作例如以下:
public boolean findPersonByName(String name) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence-unitname"); EntityManager em = emf.createEntityManager(); Person person = em. findPersonByName(name); if (a == null) return false; return true; }
總結:JPA須要指定一種ORM框架作為底層的實現
JPA也是使用Java註解配置POJO,使用EntityManager進行相關的數據庫操作
長處:JPA規範旨在規範各種ORM框架,使其有統一的接口和方法
缺點:仍然須要對事務管理進行編程
五、使用SpringDAO進行數據庫編程
SpringDAO對JDBC進行了封裝,結合DAO模式進行使用
SpringDAO規範使用JDBCTemplate進行相關的數據庫操作。如查找操作,代碼例如以下:
public int getPersonCount(){ String sql = "select count(*) from person"; return getJdbcTemplate().queryForInt(sql); }
總結:SpringDAO對JDBC進行了封裝,隱藏了JDBC API,僅僅需使用getJdbcTemplate()方法
類似於使用DAO模式,僅僅是封裝了JDBC和提供了事務管理,降低了代碼量
長處:可以通過使用Spring進行事務管理
隱藏和封裝了JDBC API
缺點: 類似於使用DAO模式,仍然須要編寫和使用大量的SQL語句
六、使用SpringORM進行數據庫編程
SpringORM就是為了解決SpringDAO的缺點。讓其完好起來
這樣一來,SpringORM就有了全部的長處,包含可以使用DAO模式進行分層
可以使用ORM框架解決編寫大量的SQL語句的問題
隱藏和封裝了JDBC API。僅僅需使用getHibernateTemplate()方法,降低了代碼量
可以使用HQL解決數據庫的移植問題,而且通過使用Spring進行事務管理
總結:使用SpringORM進行數據持久化編程是相對照較理想的
補充:使用SSH框架進行Java Web編程可以做到合理分層
能將業務邏輯、數據持久化和表現邏輯明白分開,思路清晰
表現邏輯層中的Struts2是MVC框架。可以進行頁面導航和實現視圖顯示
在結構上表現為使用action進行頁面導航,使用JSP作為視圖界面
數據持久層中的Hibernate則是持久化ORM框架。可以自己主動生成SQL語句
在結構上表現為使用DAO和POJO(domain)實現數據持久化
業務邏輯層的Spring則能使用簡單的封裝好的JDBC API進行CRUD操作和事務管理
在結構上表現為使用service進行業務管理
數據持久化編程學習總結