1、問題
1、JDBC/ORM框架(如Hibernate)開發中編程模型有哪些缺點? 如JDBC

2、解決方案(模板設計模式,本質:將可變的和不可變的分離)
模板方法模式:定義操作的步驟(固定的),將可變的步驟交給子類處理。
- public interface JdbcOperations {
- //接口定義行為集
- public Object execute() throws SQLException ;
- }
- public abstract class AbstractJdbcOperations implements JdbcOperations {
- @Override
- public final Object execute() throws SQLException {
- Connection conn = DataSourceUtils.getConnection();
- try {
- Object retVal = doInConnection(conn);
- conn.commit();
- return retVal;
- }catch (Exception e) { conn.rollback(); throw e;}
- finally { conn.close(); }
- }
- public abstract Object doInConnection(Connection conn) throws SQLException;
- }
- public class DataSourceUtils {
- public static Connection getConnection() {
- //返回數據庫連接
- return null;
- }
- }
- JdbcOperations select = new AbstractJdbcOperations() {
- @Override
- public Object doInConnection(Connection conn) throws SQLException {
- PreparedStatement pstmt =
- conn.prepareStatement("select * from tbl_user");
- ResultSet rs = pstmt.executeQuery();
- List result = null;
- //處理結果集
- return result;
- }
- };
- select.execute();
缺點:不夠靈活
3、解決方案(模板設計模式+回調,本質:將可變的和不可變的分離,可變通過回調)
回調(命令):由組件定義,但不由組件調用,而是由系統調用
一般用於:可變不可變分離,未知功能。
- public interface JdbcOprations2 {
- //接口定義行為集
- public Object execute(ConnectionCallback callback) throws Exception ;
- }
- public interface ConnectionCallback {
- public Object doInConnection(Connection conn) throws SQLException;
- }
- public class JdbcTemplate implements JdbcOprations2 {
- @Override
- public Object execute(ConnectionCallback callback) throws Exception {
- Connection conn = DataSourceUtils.getConnection();
- try {
- Object retVal = callback.doInConnection(conn);
- conn.commit();
- return retVal;
- }
- catch (Exception e) {
- conn.rollback();
- throw e;
- }
- finally {
- conn.close();
- }
- }
- }
- jdbcTemplate.execute(new ConnectionCallback() {
- @Override
- public Object doInConnection(Connection conn) throws SQLException {
- //可變操作
- return null;
- }
- });
- public interface PreparedStatementCallback {
- public Object doInPreparedStatement(PreparedStatement pstmt)
- throws SQLException;
- }
4、解決方案(Spring JDBC框架)

JdbcTemplate jdbcTemplate =
new JdbcTemplate(ds);
5、異常問題
JDBC/ORM框架(如Hibernate)開發中異常處理有哪些缺點? 不一致的異常類,如JDBC是SQLException 而hibernate是HibernateException,等。
缺點:不一致的異常體系,需要了解每個框架的異常含義 ,Spring的一致的異常體系(DataAccessException)
6、DAO訪問問題
訪問JDBC和訪問Hibernate使用完全不同且根本不類似的API?
為了便於以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate,
Spring
提供了一套抽象
DAO
類供你擴展。
JdbcDaoSupport - JDBC數據訪問對象的基類。
需要一個DataSource,同時為子類提供 JdbcTemplate。
HibernateDaoSupport - Hibernate數據訪問對象的基類。
需要一個SessionFactory,同時為子類提供 HibernateTemplate。
JdoDaoSupport - JDO數據訪問對象的基類。
需要設置一個PersistenceManagerFactory, 同時為子類提供JdoTemplate。
JpaDaoSupport - JPA數據訪問對象的基類。
需要一個EntityManagerFactory,同時 為子類提供JpaTemplate。
一致的DAO抽象
Callback:定義可變行為,即不可預知行為(命令設計模式)
Template:提供模板支持,簡化開發Support:提供對Template的支持,提供一組簡便方法,並提供獲取Template的方法