基于JDBC封裝的BaseDao(實(shí)例代碼)
最近閑暇時(shí)萌發(fā)寫一寫dao的封裝的例子,就將以前寫的整理一下。
public class BaseDao<T> { Connection conn; PreparedStatement st; ResultSet rs; JdbcUtil jdbcUtil = new JdbcUtil(); int result = 0; private Class<T> persistentClass; @SuppressWarnings("unchecked") public BaseDaoUtil(){ conn = jdbcUtil.getConnection(); ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); persistentClass = (Class<T>) type.getActualTypeArguments()[0]; } /** * 保存 * @param entity * @return */ public int save(T entity) throws Exception{ String sql = "INSERT INTO "+ entity.getClass().getSimpleName().toLowerCase() +" ("; List<Method> list = this.matchPojoMethods(entity,"get"); Iterator<Method> iter = list.iterator(); Object obj[] = new Object[list.size()]; int i = 0; //拼接字段順序 insert into table name(id,name,email, while(iter.hasNext()) { Method method = iter.next(); sql += method.getName().substring(3).toLowerCase() + ","; if (method.getReturnType().getSimpleName().indexOf("Date") !=-1) { SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); obj[i] = sbf.format(method.invoke(entity, new Object[]{})); }else { obj[i] = method.invoke(entity, new Object[]{}); } i++; } //去掉最后一個(gè),符號(hào)insert insert into table name(id,name,email) values( sql = sql.substring(0, sql.lastIndexOf(",")) + ") values("; //拼裝預(yù)編譯SQL語句insert insert into table name(id,name,email) values(?,?,?, for(int j = 0; j < list.size(); j++) { sql += "?,"; } //去掉SQL語句最后一個(gè),符號(hào)insert insert into table name(id,name,email) values(?,?,?); sql = sql.substring(0, sql.lastIndexOf(",")) + ")"; //到此SQL語句拼接完成,打印SQL語句 System.out.println(sql); try { st = conn.prepareStatement(sql); for (int j = 0; j < obj.length; j++) { st.setObject(j+1, obj[j]); } result = st.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } jdbcUtil.getClose(rs, st, conn); return result; } /** * 刪除 * @param object * @return * @throws SQLException */ public int deleteId(Object object) throws Exception{ String sql = "delete from "+ persistentClass.getSimpleName().toLowerCase() +" where "; //通過子類的構(gòu)造函數(shù),獲得參數(shù)化類型的具體類型.比如BaseDAO<T>也就是獲得T的具體類型 T entity = persistentClass.newInstance(); //存放Pojo(或被操作表)主鍵的方法對(duì)象 Method idMethod = null; List<Method> list = this.matchPojoMethods(entity, "set"); Iterator<Method> iter = list.iterator(); //過濾取得Method對(duì)象 while(iter.hasNext()) { Method tempMethod = iter.next(); if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { idMethod = tempMethod; } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod = tempMethod; } } //第一個(gè)字母轉(zhuǎn)為小寫 sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?"; System.out.println(sql); st = conn.prepareStatement(sql); //判斷id的類型 if(object instanceof Integer) { st.setInt(1, (Integer)object); } else if(object instanceof String){ st.setString(1, (String)object); } result = st.executeUpdate(); jdbcUtil.getClose(rs, st, conn); return result; } /** * 修改 * @param entity * @return * @throws Exception */ public int update(T entity) throws Exception{ String sql = "update "+ entity.getClass().getSimpleName().toLowerCase() +" set "; List<Method> list = this.matchPojoMethods(entity, "get"); //裝載參數(shù) Object obj[] = new Object[list.size()]; int i = 0; //臨時(shí)Method對(duì)象,負(fù)責(zé)迭代時(shí)裝method對(duì)象. Method tempMethod = null; //由于修改時(shí)不需要修改ID,所以按順序加參數(shù)則應(yīng)該把Id移到最后. Method idMethod = null; Iterator<Method> iter = list.iterator(); while(iter.hasNext()) { tempMethod = iter.next(); //如果方法名中帶有ID字符串并且長(zhǎng)度為2,則視為ID. if(tempMethod.getName().lastIndexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{}); //把ID字段的對(duì)象存放到一個(gè)變量中,然后在集合中刪掉. idMethod = tempMethod; iter.remove(); //如果方法名去掉set/get字符串以后與pojo + "id"想符合(大小寫不敏感),則視為ID } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))) { obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{}); idMethod = tempMethod; iter.remove(); } } //把迭代指針移到第一位 iter = list.iterator(); while(iter.hasNext()) { tempMethod = iter.next(); sql += tempMethod.getName().substring(3).toLowerCase() + "= ?,"; obj[i] = tempMethod.invoke(entity, new Object[]{}); i++; } //去掉最后一個(gè),符號(hào) sql = sql.substring(0,sql.lastIndexOf(",")); //添加條件 sql += " where " + idMethod.getName().substring(3).toLowerCase() + " = ?"; //SQL拼接完成,打印SQL語句 System.out.println(sql); st = conn.prepareStatement(sql); for (int j = 0; j < obj.length; j++) { st.setObject(j+1, obj[j]); } result = st.executeUpdate(); jdbcUtil.getClose(rs, st, conn); return result; } public T findById(Object object) throws Exception{ String sql = "select * from "+ persistentClass.getSimpleName().toLowerCase() +" where "; //通過子類的構(gòu)造函數(shù),獲得參數(shù)化類型的具體類型.比如BaseDAO<T>也就是獲得T的具體類型 T entity = persistentClass.newInstance(); //存放Pojo(或被操作表)主鍵的方法對(duì)象 Method idMethod = null; List<Method> list = this.matchPojoMethods(entity, "set"); Iterator<Method> iter = list.iterator(); //過濾取得Method對(duì)象 while(iter.hasNext()) { Method tempMethod = iter.next(); if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { idMethod = tempMethod; } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod = tempMethod; } } //第一個(gè)字母轉(zhuǎn)為小寫 sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?"; System.out.println(sql); st = conn.prepareStatement(sql); //判斷id的類型 if(object instanceof Integer) { st.setInt(1, (Integer)object); } else if(object instanceof String){ st.setString(1, (String)object); } rs = st.executeQuery(); //把指針指向迭代器第一行 iter = list.iterator(); //封裝 while(rs.next()) { while(iter.hasNext()) { Method method = iter.next(); if(method.getParameterTypes()[0].getSimpleName().indexOf("String") != -1) { //由于list集合中,method對(duì)象取出的方法順序與數(shù)據(jù)庫字段順序不一致(比如:list的第一個(gè)方法是setDate,而數(shù)據(jù)庫按順序取的是"123"值) //所以數(shù)據(jù)庫字段采用名字對(duì)應(yīng)的方式取. this.setString(method, entity, rs.getString(method.getName().substring(3).toLowerCase())); } else if(method.getParameterTypes()[0].getSimpleName().indexOf("Date") != -1){ this.setDate(method, entity, rs.getDate(method.getName().substring(3).toLowerCase())); }else { this.setInt(method, entity, rs.getInt(method.getName().substring(3).toLowerCase())); } } } jdbcUtil.getClose(rs, st, conn); return entity; } /** * 過濾當(dāng)前Pojo類所有帶傳入字符串的Method對(duì)象,返回List集合. */ private List<Method> matchPojoMethods(T entity,String methodName) { //獲得當(dāng)前Pojo所有方法對(duì)象 Method[] methods = entity.getClass().getDeclaredMethods(); //List容器存放所有帶get字符串的Method對(duì)象 List<Method> list = new ArrayList<Method>(); //過濾當(dāng)前Pojo類所有帶get字符串的Method對(duì)象,存入List容器 for(int index = 0; index < methods.length; index++) { if(methods[index].getName().indexOf(methodName) != -1) { list.add(methods[index]); } } return list; } /** * 參數(shù)類型為String時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set */ public String setString(Method method, T entity, String arg) throws Exception{ return (String)method.invoke(entity, new Object[]{arg}); } /** * 參數(shù)類型為Date時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set */ public Date setDate(Method method, T entity, Date arg) throws Exception{ return (Date)method.invoke(entity, new Object[]{arg}); } /** * 參數(shù)類型為Integer或int時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set */ public Integer setInt(Method method, T entity, Integer arg) throws Exception{ return (Integer)method.invoke(entity, new Object[]{arg}); } }
以上這篇基于JDBC封裝的BaseDao(實(shí)例代碼)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA2022.2的簡(jiǎn)介、下載與安裝、配置教程
IDEA是JetBrains公司推出一個(gè)集成開發(fā)工具,是Java開發(fā)工具中的翹楚,基于這個(gè)開發(fā)工具可以快速開發(fā)我們的Java相關(guān)項(xiàng)目,本文重點(diǎn)給大家介紹IDEA2022.2的簡(jiǎn)介、下載與安裝、初步配置,感興趣的朋友一起看看吧2022-11-11Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹,Java深入到一定程度,就不可避免的碰到設(shè)計(jì)模式(design pattern)這一概念,了解設(shè)計(jì)模式,將使自己對(duì)java中的接口或抽象類應(yīng)用有更深的理解,需要的朋友可以參考下2015-03-03spring boot整合redis實(shí)現(xiàn)shiro的分布式session共享的方法
本篇文章主要介紹了spring boot整合redis實(shí)現(xiàn)shiro的分布式session共享的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01springboot整合xxl-job的實(shí)現(xiàn)示例
本文主要介紹了springboot整合xxl-job的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot Session共享實(shí)現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實(shí)現(xiàn)圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Java Character類對(duì)單個(gè)字符操作原理解析
這篇文章主要介紹了Java Character類對(duì)單個(gè)字符操作原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03