生活随笔
收集整理的這篇文章主要介紹了
JDBC自定义框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自定義JDBC框架:
定義必要的信息、獲取數據庫的連接、釋放資源都是重復的代碼,在操作JDBC時通常都是執行SQL語句就可以了,所以需要抽取出來一個模板類來封裝一些方法(Update、Query),專門執行增刪改查的SQL語句,簡化使用步驟。
DataBaseMetaData:數據庫的源信息
java.sql.DataBaseMetaData:封裝了整個數據庫的綜合信息
例如:
String getDatabaseProductName():獲取數據庫產品的名稱 int getDatabaseProductVersion():獲取數據庫產品的版本號
ParameterMetaData:參數的源信息
java.sql.ParameterMetaData:封裝的是預編譯執行者對象中每個參數的類型和屬性 這個對象可以通過預編譯執行者對象中的getParameterMetaData()方法來獲取
核心功能:
int getParameterCount():獲取sql語句中參數的個數
ResultSetMetaData:結果集的源信息
java.sql.ResultSetMetaData:封裝的是結果集對象中列的類型和屬性 這個對象可以通過結果集對象中的getMetaData()方法來獲取
核心功能:
int getColumnCount():獲取列的總數 String getColumnName(int i):獲取列名
查詢的方法:
查詢一條記錄并封裝對象的方法:queryForObject() 查詢多條記錄并封裝到集合的方法:queryForList() 查詢聚合函數并返回單條數據的方法:queryForScalar()
JDBCTemplate類增刪改功能的編寫
public class JDBCTemplate { private DataSource dataSource
; private Connection connection
; private PreparedStatement ps
; private ResultSet resultSet
; public JDBCTemplate ( DataSource dataSource
) { this . dataSource
= dataSource
; } public int update ( String sql
, Object . . . objects
) { int result
= 0 ; try { connection
= dataSource
. getConnection ( ) ; ps
= connection
. prepareStatement ( sql
) ; ParameterMetaData parameterMetaData
= ps
. getParameterMetaData ( ) ; int count
= parameterMetaData
. getParameterCount ( ) ; if ( count
!= objects
. length
) { throw new RuntimeException ( "參數個數不匹配" ) ; } for ( int i
= 0 ; i
< objects
. length
; i
++ ) { ps
. setObject ( i
+ 1 , objects
[ i
] ) ; } result
= ps
. executeUpdate ( ) ; } catch ( SQLException sqlException
) { sqlException
. printStackTrace ( ) ; } finally { DataSourceUtils . close ( connection
, ps
) ; } return result
; }
}
JDBCTemplate類查詢功能的編寫:
public class Student { private Integer sid
; private String name
; private Integer age
; private Date birthday
; public Student ( ) { } public Student ( Integer sid
, String name
, Integer age
, Date birthday
) { this . sid
= sid
; this . name
= name
; this . age
= age
; this . birthday
= birthday
; } public Integer getSid ( ) { return sid
; } public void setSid ( Integer sid
) { this . sid
= sid
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public Integer getAge ( ) { return age
; } public void setAge ( Integer age
) { this . age
= age
; } public Date getBirthday ( ) { return birthday
; } public void setBirthday ( Date birthday
) { this . birthday
= birthday
; } @Override public String toString ( ) { return "Student{" + "sid=" + sid
+ ", name='" + name
+ '\'' + ", age=" + age
+ ", birthday=" + birthday
+ '}' ; }
}
public interface ResultSetHandler < T > { < T > T handler ( ResultSet rs
) ;
}
public class BeanHandler < T > implements ResultSetHandler < T > { private Class < T > beanClass
; public BeanHandler ( Class < T > beanClass
) { this . beanClass
= beanClass
; } @Override public T handler ( ResultSet rs
) { T bean
= null ; try { bean
= beanClass
. newInstance ( ) ; if ( rs
. next ( ) ) { ResultSetMetaData rsmd
= rs
. getMetaData ( ) ; int columnCount
= rsmd
. getColumnCount ( ) ; for ( int i
= 1 ; i
<= columnCount
; i
++ ) { String columnName
= rsmd
. getColumnName ( i
) ; Object columnValue
= rs
. getObject ( columnName
) ; PropertyDescriptor pd
= new PropertyDescriptor ( columnName
. toLowerCase ( ) , beanClass
) ; Method writeMethod
= pd
. getWriteMethod ( ) ; writeMethod
. invoke ( bean
, columnValue
) ; } } } catch ( Exception e
) { e
. printStackTrace ( ) ; } return bean
; }
}
public class BeanListHandler < T > implements ResultSetHandler < T > { private Class < T > beanClass
; public BeanListHandler ( Class < T > beanClass
) { this . beanClass
= beanClass
; } @Override public List < T > handler ( ResultSet rs
) { List < T > list
= new ArrayList < > ( ) ; try { while ( rs
. next ( ) ) { T bean
= beanClass
. newInstance ( ) ; ResultSetMetaData rsmd
= rs
. getMetaData ( ) ; int columnCount
= rsmd
. getColumnCount ( ) ; for ( int i
= 1 ; i
<= columnCount
; i
++ ) { String columnName
= rsmd
. getColumnName ( i
) ; Object columnValue
= rs
. getObject ( columnName
) ; PropertyDescriptor pd
= new PropertyDescriptor ( columnName
. toLowerCase ( ) , beanClass
) ; Method writeMethod
= pd
. getWriteMethod ( ) ; writeMethod
. invoke ( bean
, columnValue
) ; } list
. add ( bean
) ; } } catch ( Exception e
) { e
. printStackTrace ( ) ; } return list
; }
}
public class ScalarHandler < T > implements ResultSetHandler < T > { @Override public Long handler ( ResultSet rs
) { Long value
= null ; try { if ( rs
. next ( ) ) { ResultSetMetaData rsmd
= rs
. getMetaData ( ) ; String columnName
= rsmd
. getColumnName ( 1 ) ; value
= rs
. getLong ( columnName
) ; } } catch ( Exception e
) { e
. printStackTrace ( ) ; } return value
; }
}
public class JDBCTemplate { private DataSource dataSource
; private Connection con
; private PreparedStatement pst
; private ResultSet rs
; public JDBCTemplate ( DataSource dataSource
) { this . dataSource
= dataSource
; } public Long queryForScalar ( String sql
, ResultSetHandler < Long > rsh
, Object . . . objs
) { Long result
= null ; try { con
= dataSource
. getConnection ( ) ; pst
= con
. prepareStatement ( sql
) ; ParameterMetaData pData
= pst
. getParameterMetaData ( ) ; int parameterCount
= pData
. getParameterCount ( ) ; if ( parameterCount
!= objs
. length
) { throw new RuntimeException ( "參數個數不匹配" ) ; } for ( int i
= 0 ; i
< objs
. length
; i
++ ) { pst
. setObject ( i
+ 1 , objs
[ i
] ) ; } rs
= pst
. executeQuery ( ) ; result
= rsh
. handler ( rs
) ; } catch ( Exception e
) { e
. printStackTrace ( ) ; } finally { DataSourceUtils . close ( con
, pst
, rs
) ; } return result
; } public < T > List < T > queryForList ( String sql
, ResultSetHandler < T > rsh
, Object . . . objs
) { List < T > list
= new ArrayList < > ( ) ; try { con
= dataSource
. getConnection ( ) ; pst
= con
. prepareStatement ( sql
) ; ParameterMetaData pData
= pst
. getParameterMetaData ( ) ; int parameterCount
= pData
. getParameterCount ( ) ; if ( parameterCount
!= objs
. length
) { throw new RuntimeException ( "參數個數不匹配" ) ; } for ( int i
= 0 ; i
< objs
. length
; i
++ ) { pst
. setObject ( i
+ 1 , objs
[ i
] ) ; } rs
= pst
. executeQuery ( ) ; list
= rsh
. handler ( rs
) ; } catch ( Exception e
) { e
. printStackTrace ( ) ; } finally { DataSourceUtils . close ( con
, pst
, rs
) ; } return list
; } public < T > T queryForObject ( String sql
, ResultSetHandler < T > rsh
, Object . . . objs
) { T obj
= null ; try { con
= dataSource
. getConnection ( ) ; pst
= con
. prepareStatement ( sql
) ; ParameterMetaData pData
= pst
. getParameterMetaData ( ) ; int parameterCount
= pData
. getParameterCount ( ) ; if ( parameterCount
!= objs
. length
) { throw new RuntimeException ( "參數個數不匹配" ) ; } for ( int i
= 0 ; i
< objs
. length
; i
++ ) { pst
. setObject ( i
+ 1 , objs
[ i
] ) ; } rs
= pst
. executeQuery ( ) ; obj
= rsh
. handler ( rs
) ; } catch ( Exception e
) { e
. printStackTrace ( ) ; } finally { DataSourceUtils . close ( con
, pst
, rs
) ; } return obj
; }
}
測試自定義JDBC框架的使用:
public class JDBCTemplateTest { JDBCTemplate template
= new JDBCTemplate ( DataSourceUtils . getDataSource ( ) ) ; @Test public void selectScalar ( ) { String sql
= "SELECT COUNT(*) FROM student" ; Long count
= template
. queryForScalar ( sql
, new ScalarHandler < Long > ( ) ) ; System . out
. println ( count
) ; } @Test public void selectAll ( ) { String sql
= "SELECT * FROM student" ; List < Student > list
= template
. queryForList ( sql
, new BeanListHandler < Student > ( Student . class ) ) ; for ( Student stu
: list
) { System . out
. println ( stu
) ; } } @Test public void selectOne ( ) { String sql
= "SELECT * FROM student WHERE sid=?" ; Student stu
= template
. queryForObject ( sql
, new BeanHandler < Student > ( Student . class ) , 1 ) ; System . out
. println ( stu
) ; } @Test public void insert ( ) { String sql
= "INSERT INTO student VALUES (?,?,?,?)" ; Object [ ] params
= { 5 , "周七" , 27 , "2007-07-07" } ; int result
= template
. update ( sql
, params
) ; System . out
. println ( result
) ; } @Test public void delete ( ) { String sql
= "DELETE FROM student WHERE sid=?" ; int result
= template
. update ( sql
, 5 ) ; System . out
. println ( result
) ; } @Test public void update ( ) { String sql
= "UPDATE student SET age=? WHERE name=?" ; Object [ ] params
= { 33 , "張三" } ; int result
= template
. update ( sql
, params
) ; System . out
. println ( result
) ; }
}
創作挑戰賽 新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔 為你收集整理的JDBC自定义框架 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。