JDBC自定义框架
自定義JDBC框架:
定義必要的信息、獲取數(shù)據(jù)庫的連接、釋放資源都是重復(fù)的代碼,在操作JDBC時(shí)通常都是執(zhí)行SQL語句就可以了,所以需要抽取出來一個(gè)模板類來封裝一些方法(Update、Query),專門執(zhí)行增刪改查的SQL語句,簡化使用步驟。
DataBaseMetaData:數(shù)據(jù)庫的源信息
- java.sql.DataBaseMetaData:封裝了整個(gè)數(shù)據(jù)庫的綜合信息
例如:
- String getDatabaseProductName():獲取數(shù)據(jù)庫產(chǎn)品的名稱
- int getDatabaseProductVersion():獲取數(shù)據(jù)庫產(chǎn)品的版本號(hào)
ParameterMetaData:參數(shù)的源信息
- java.sql.ParameterMetaData:封裝的是預(yù)編譯執(zhí)行者對(duì)象中每個(gè)參數(shù)的類型和屬性
- 這個(gè)對(duì)象可以通過預(yù)編譯執(zhí)行者對(duì)象中的getParameterMetaData()方法來獲取
核心功能:
int getParameterCount():獲取sql語句中參數(shù)的個(gè)數(shù)
ResultSetMetaData:結(jié)果集的源信息
java.sql.ResultSetMetaData:封裝的是結(jié)果集對(duì)象中列的類型和屬性
這個(gè)對(duì)象可以通過結(jié)果集對(duì)象中的getMetaData()方法來獲取
核心功能:
- int getColumnCount():獲取列的總數(shù)
- String getColumnName(int i):獲取列名
查詢的方法:
- 查詢一條記錄并封裝對(duì)象的方法:queryForObject()
- 查詢多條記錄并封裝到集合的方法:queryForList()
- 查詢聚合函數(shù)并返回單條數(shù)據(jù)的方法:queryForScalar()
JDBCTemplate類增刪改功能的編寫
public class JDBCTemplate {// 1. 定義參數(shù)變量:數(shù)據(jù)源、連接對(duì)象、執(zhí)行者對(duì)象、結(jié)果集對(duì)象private DataSource dataSource;private Connection connection;private PreparedStatement ps;private ResultSet resultSet;// 2. 通過有參構(gòu)造為數(shù)據(jù)賦值public JDBCTemplate(DataSource dataSource) {this.dataSource = dataSource;}// 3. 定義Update方法,參數(shù):sql語句、sql語句中的參數(shù)public int update(String sql, Object... objects) {// 4. 定義int變量,用于接收增刪改后影響的行數(shù)int result = 0;try {// 5. 通過數(shù)據(jù)獲取一個(gè)數(shù)據(jù)庫連接connection = dataSource.getConnection();// 6. 通過數(shù)據(jù)庫連接對(duì)象獲取執(zhí)行者對(duì)象,并對(duì)sql語句進(jìn)行預(yù)編譯ps = connection.prepareStatement(sql);// 7. 通過執(zhí)行者對(duì)象獲取參數(shù)的源信息對(duì)象ParameterMetaData parameterMetaData = ps.getParameterMetaData();// 8. 通過參數(shù)源信息對(duì)象獲取參數(shù)的個(gè)數(shù)int count = parameterMetaData.getParameterCount();// 9. 判斷參數(shù)數(shù)量是否一致if (count != objects.length) {throw new RuntimeException("參數(shù)個(gè)數(shù)不匹配");}// 10. 為sql語句占位符賦值for (int i = 0; i < objects.length; i++) {ps.setObject(i + 1, objects[i]);}// 11. 執(zhí)行sql語句并接收結(jié)果result = ps.executeUpdate();} catch (SQLException sqlException) {sqlException.printStackTrace();} finally {// 12. 釋放資源DataSourceUtils.close(connection, ps);}// 13. 返回結(jié)果return result;} }JDBCTemplate類查詢功能的編寫:
- 實(shí)體類
- ResultSetHandler接口
- BeanHandler實(shí)現(xiàn)類
- BeanListHandler實(shí)現(xiàn)類
- ScalarHandler實(shí)現(xiàn)類
- JDBCTemplate類
測(cè)試自定義JDBC框架的使用:
public class JDBCTemplateTest {//創(chuàng)建JDBCTemplate對(duì)象JDBCTemplate template = new JDBCTemplate(DataSourceUtils.getDataSource());@Testpublic void selectScalar() {//查詢student表的記錄條數(shù)String sql = "SELECT COUNT(*) FROM student";Long count = template.queryForScalar(sql, new ScalarHandler<Long>());System.out.println(count);}@Testpublic void selectAll() {//查詢所有學(xué)生信息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將結(jié)果封裝成一個(gè)Student對(duì)象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);} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: springmvc重定向到另一个项目_s
- 下一篇: php是不是面向对象编程,PHP面向对象