日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC自定义框架

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 {// 1. 定義參數變量:數據源、連接對象、執行者對象、結果集對象private DataSource dataSource;private Connection connection;private PreparedStatement ps;private ResultSet resultSet;// 2. 通過有參構造為數據賦值public JDBCTemplate(DataSource dataSource) {this.dataSource = dataSource;}// 3. 定義Update方法,參數:sql語句、sql語句中的參數public int update(String sql, Object... objects) {// 4. 定義int變量,用于接收增刪改后影響的行數int result = 0;try {// 5. 通過數據獲取一個數據庫連接connection = dataSource.getConnection();// 6. 通過數據庫連接對象獲取執行者對象,并對sql語句進行預編譯ps = connection.prepareStatement(sql);// 7. 通過執行者對象獲取參數的源信息對象ParameterMetaData parameterMetaData = ps.getParameterMetaData();// 8. 通過參數源信息對象獲取參數的個數int count = parameterMetaData.getParameterCount();// 9. 判斷參數數量是否一致if (count != objects.length) {throw new RuntimeException("參數個數不匹配");}// 10. 為sql語句占位符賦值for (int i = 0; i < objects.length; i++) {ps.setObject(i + 1, objects[i]);}// 11. 執行sql語句并接收結果result = ps.executeUpdate();} catch (SQLException sqlException) {sqlException.printStackTrace();} finally {// 12. 釋放資源DataSourceUtils.close(connection, ps);}// 13. 返回結果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;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';} }
  • ResultSetHandler接口
/*用于處理結果集的接口*/ public interface ResultSetHandler<T> {//處理結果集的抽象方法。<T> T handler(ResultSet rs); }
  • BeanHandler實現類
/*實現類1:用于完成將查詢出來的一條記錄,封裝到Student對象中*/ public class BeanHandler<T> implements ResultSetHandler<T> {//1.聲明對象類型變量private Class<T> beanClass;//2.有參構造對變量賦值public BeanHandler(Class<T> beanClass) {this.beanClass = beanClass;}/*將ResultSet結果集中的數據封裝到beanClass類型對象中*/@Overridepublic T handler(ResultSet rs) {//3.聲明對象T bean = null;try{//4.創建傳遞參數的對象bean = beanClass.newInstance();//5.判斷是否有結果集if(rs.next()) {//6.得到所有的列名//6.1先得到結果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//6.2還要得到有多少列int columnCount = rsmd.getColumnCount();//6.3遍歷列數for(int i = 1; i <= columnCount; i++) {//6.4得到每列的列名String columnName = rsmd.getColumnName(i);//6.5通過列名獲取數據Object columnValue = rs.getObject(columnName);//6.6列名其實就是對象中成員變量的名稱。于是就可以使用列名得到對象中屬性的描述器(get和set方法)PropertyDescriptor pd = new PropertyDescriptor(columnName.toLowerCase(),beanClass);//6.7獲取set方法Method writeMethod = pd.getWriteMethod();//6.8執行set方法,給成員變量賦值writeMethod.invoke(bean,columnValue);}}} catch (Exception e) {e.printStackTrace();}//7.將對象返回return bean;} }
  • BeanListHandler實現類
/*實現類2:用于將結果集封裝到集合中*/ public class BeanListHandler<T> implements ResultSetHandler<T> {//1.聲明對象變量private Class<T> beanClass;//2.有參構造為變量賦值public BeanListHandler(Class<T> beanClass) {this.beanClass = beanClass;}@Overridepublic List<T> handler(ResultSet rs) {//3.創建集合對象List<T> list = new ArrayList<>();try{//4.遍歷結果集對象while(rs.next()) {//5.創建傳遞參數的對象T bean = beanClass.newInstance();//6.得到所有的列名//6.1先得到結果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//6.2還要得到有多少列int columnCount = rsmd.getColumnCount();//6.3遍歷列數for(int i = 1; i <= columnCount; i++) {//6.4得到每列的列名String columnName = rsmd.getColumnName(i);//6.5通過列名獲取數據Object columnValue = rs.getObject(columnName);//6.6列名其實就是對象中成員變量的名稱。于是就可以使用列名得到對象中屬性的描述器(get和set方法)PropertyDescriptor pd = new PropertyDescriptor(columnName.toLowerCase(),beanClass);//6.7獲取set方法Method writeMethod = pd.getWriteMethod();//6.8執行set方法,給成員變量賦值writeMethod.invoke(bean,columnValue);}//7.將對象保存到集合中list.add(bean);}} catch (Exception e) {e.printStackTrace();}//8.返回結果return list;} }
  • ScalarHandler實現類
/*實現類3:用于返回一個聚合函數的查詢結果*/ public class ScalarHandler<T> implements ResultSetHandler<T> {@Overridepublic Long handler(ResultSet rs) {//1.聲明一個變量Long value = null;try{//2.判斷是否有結果if(rs.next()) {//3.獲取結果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//4.獲取第一列的列名String columnName = rsmd.getColumnName(1);//5.根據列名獲取值value = rs.getLong(columnName);}} catch(Exception e) {e.printStackTrace();}//6.將結果返回return value;} }
  • JDBCTemplate類
public class JDBCTemplate {private DataSource dataSource;private Connection con;private PreparedStatement pst;private ResultSet rs;public JDBCTemplate(DataSource dataSource) {this.dataSource = dataSource;}/*專用于執行聚合函數sql語句的方法*/public Long queryForScalar(String sql, ResultSetHandler<Long> rsh, Object...objs) {Long result = null;try{con = dataSource.getConnection();pst = con.prepareStatement(sql);//獲取sql語句中的參數源信息ParameterMetaData pData = pst.getParameterMetaData();int parameterCount = pData.getParameterCount();//判斷參數個數是否一致if(parameterCount != objs.length) {throw new RuntimeException("參數個數不匹配");}//為sql語句中的?占位符賦值for (int i = 0; i < objs.length; i++) {pst.setObject(i+1,objs[i]);}//執行sql語句rs = pst.executeQuery();//通過ScalarHandler方式對結果進行處理result = rsh.handler(rs);} catch(Exception e) {e.printStackTrace();} finally {//釋放資源DataSourceUtils.close(con,pst,rs);}//將結果返回return result;}/*專用于查詢所有記錄sql語句的方法*/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);//獲取sql語句中的參數源信息ParameterMetaData pData = pst.getParameterMetaData();int parameterCount = pData.getParameterCount();//判斷參數個數是否一致if(parameterCount != objs.length) {throw new RuntimeException("參數個數不匹配");}//為sql語句中的?占位符賦值for (int i = 0; i < objs.length; i++) {pst.setObject(i+1,objs[i]);}//執行sql語句rs = pst.executeQuery();//通過BeanListHandler方式對結果進行處理list = rsh.handler(rs);} catch(Exception e) {e.printStackTrace();} finally {//釋放資源DataSourceUtils.close(con,pst,rs);}//將結果返回return list;}/*專用于執行查詢一條記錄sql語句的方法*/public <T> T queryForObject(String sql, ResultSetHandler<T> rsh, Object...objs) {T obj = null;try{con = dataSource.getConnection();pst = con.prepareStatement(sql);//獲取sql語句中的參數源信息ParameterMetaData pData = pst.getParameterMetaData();int parameterCount = pData.getParameterCount();//判斷參數個數是否一致if(parameterCount != objs.length) {throw new RuntimeException("參數個數不匹配");}//為sql語句中的?占位符賦值for (int i = 0; i < objs.length; i++) {pst.setObject(i+1,objs[i]);}//執行sql語句rs = pst.executeQuery();//通過BeanHandler方式對結果進行處理obj = rsh.handler(rs);} catch(Exception e) {e.printStackTrace();} finally {//釋放資源DataSourceUtils.close(con,pst,rs);}//將結果返回return obj;} }
測試自定義JDBC框架的使用:
public class JDBCTemplateTest {//創建JDBCTemplate對象JDBCTemplate template = new JDBCTemplate(DataSourceUtils.getDataSource());@Testpublic void selectScalar() {//查詢student表的記錄條數String sql = "SELECT COUNT(*) FROM student";Long count = template.queryForScalar(sql, new ScalarHandler<Long>());System.out.println(count);}@Testpublic 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);}}@Testpublic void selectOne() {//查詢張三這條記錄String sql = "SELECT * FROM student WHERE sid=?";//通過BeanHandler將結果封裝成一個Student對象Student stu = template.queryForObject(sql, new BeanHandler<Student>(Student.class), 1);System.out.println(stu);}@Testpublic 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);}@Testpublic void delete() {//刪除周七這條記錄String sql = "DELETE FROM student WHERE sid=?";int result = template.update(sql, 5);System.out.println(result);}@Testpublic void update() {//修改張三的年齡為33String sql = "UPDATE student SET age=? WHERE name=?";Object[] params = {33,"張三"};int result = template.update(sql,params);System.out.println(result);} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的JDBC自定义框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。