基于JDBC封裝的BaseDao(實(shí)例代碼)
更新時(shí)間:2016年07月15日 09:32:56 投稿:jingxian
下面小編就為大家?guī)?lái)一篇基于JDBC封裝的BaseDao(實(shí)例代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
最近閑暇時(shí)萌發(fā)寫(xiě)一寫(xiě)dao的封裝的例子,就將以前寫(xiě)的整理一下。
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語(yǔ)句insert insert into table name(id,name,email) values(?,?,?,
for(int j = 0; j < list.size(); j++) {
sql += "?,";
}
//去掉SQL語(yǔ)句最后一個(gè),符號(hào)insert insert into table name(id,name,email) values(?,?,?);
sql = sql.substring(0, sql.lastIndexOf(",")) + ")";
//到此SQL語(yǔ)句拼接完成,打印SQL語(yǔ)句
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 ";
//通過(guò)子類的構(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();
//過(guò)濾取得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)為小寫(xiě)
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"想符合(大小寫(xiě)不敏感),則視為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語(yǔ)句
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 ";
//通過(guò)子類的構(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();
//過(guò)濾取得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)為小寫(xiě)
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ù)庫(kù)字段順序不一致(比如:list的第一個(gè)方法是setDate,而數(shù)據(jù)庫(kù)按順序取的是"123"值)
//所以數(shù)據(jù)庫(kù)字段采用名字對(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;
}
/**
* 過(guò)濾當(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>();
//過(guò)濾當(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)文章
Java中ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式
這篇文章主要介紹了maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
IDEA連接達(dá)夢(mèng)數(shù)據(jù)庫(kù)的詳細(xì)配置指南
達(dá)夢(mèng)數(shù)據(jù)庫(kù)(DM Database)作為國(guó)產(chǎn)關(guān)系型數(shù)據(jù)庫(kù)的代表,廣泛應(yīng)用于企業(yè)級(jí)系統(tǒng)開(kāi)發(fā),本文將詳細(xì)介紹如何在IntelliJ IDEA中配置并連接達(dá)夢(mèng)數(shù)據(jù)庫(kù),助力開(kāi)發(fā)者高效完成數(shù)據(jù)庫(kù)開(kāi)發(fā)工作,需要的朋友可以參考下2025-03-03
Java動(dòng)態(tài)代理的應(yīng)用詳解
本篇文章介紹了,Java動(dòng)態(tài)代理的應(yīng)用詳解,需要的朋友參考下2013-05-05
郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過(guò)程與概念詳解(一)
你真的了解郵件收發(fā)原理嗎?這篇文章主要為大家詳細(xì)介紹了郵件發(fā)送基本過(guò)程與概念,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

