基于JDBC封装的BaseDao(实例代码)
最近闲暇时萌发写一写dao的封装的例子,就将以前写的整理一下。
publicclassBaseDao<T>{
Connectionconn;
PreparedStatementst;
ResultSetrs;
JdbcUtiljdbcUtil=newJdbcUtil();
intresult=0;
privateClass<T>persistentClass;
@SuppressWarnings("unchecked")
publicBaseDaoUtil(){
conn=jdbcUtil.getConnection();
ParameterizedTypetype=(ParameterizedType)getClass().getGenericSuperclass();
persistentClass=(Class<T>)type.getActualTypeArguments()[0];
}
/**
*保存
*@paramentity
*@return
*/
publicintsave(Tentity)throwsException{
Stringsql="INSERTINTO"+entity.getClass().getSimpleName().toLowerCase()+"(";
List<Method>list=this.matchPojoMethods(entity,"get");
Iterator<Method>iter=list.iterator();
Objectobj[]=newObject[list.size()];
inti=0;
//拼接字段顺序insertintotablename(id,name,email,
while(iter.hasNext()){
Methodmethod=iter.next();
sql+=method.getName().substring(3).toLowerCase()+",";
if(method.getReturnType().getSimpleName().indexOf("Date")!=-1){
SimpleDateFormatsbf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
obj[i]=sbf.format(method.invoke(entity,newObject[]{}));
}else{
obj[i]=method.invoke(entity,newObject[]{});
}
i++;
}
//去掉最后一个,符号insertinsertintotablename(id,name,email)values(
sql=sql.substring(0,sql.lastIndexOf(","))+")values(";
//拼装预编译SQL语句insertinsertintotablename(id,name,email)values(?,?,?,
for(intj=0;j<list.size();j++){
sql+="?,";
}
//去掉SQL语句最后一个,符号insertinsertintotablename(id,name,email)values(?,?,?);
sql=sql.substring(0,sql.lastIndexOf(","))+")";
//到此SQL语句拼接完成,打印SQL语句
System.out.println(sql);
try{
st=conn.prepareStatement(sql);
for(intj=0;j<obj.length;j++){
st.setObject(j+1,obj[j]);
}
result=st.executeUpdate();
}catch(SQLExceptione){
e.printStackTrace();
}
jdbcUtil.getClose(rs,st,conn);
returnresult;
}
/**
*删除
*@paramobject
*@return
*@throwsSQLException
*/
publicintdeleteId(Objectobject)throwsException{
Stringsql="deletefrom"+persistentClass.getSimpleName().toLowerCase()+"where";
//通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型
Tentity=persistentClass.newInstance();
//存放Pojo(或被操作表)主键的方法对象
MethodidMethod=null;
List<Method>list=this.matchPojoMethods(entity,"set");
Iterator<Method>iter=list.iterator();
//过滤取得Method对象
while(iter.hasNext()){
MethodtempMethod=iter.next();
if(tempMethod.getName().indexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){
idMethod=tempMethod;
}elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){
idMethod=tempMethod;
}
}
//第一个字母转为小写
sql+=idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4)+"=?";
System.out.println(sql);
st=conn.prepareStatement(sql);
//判断id的类型
if(objectinstanceofInteger){
st.setInt(1,(Integer)object);
}elseif(objectinstanceofString){
st.setString(1,(String)object);
}
result=st.executeUpdate();
jdbcUtil.getClose(rs,st,conn);
returnresult;
}
/**
*修改
*@paramentity
*@return
*@throwsException
*/
publicintupdate(Tentity)throwsException{
Stringsql="update"+entity.getClass().getSimpleName().toLowerCase()+"set";
List<Method>list=this.matchPojoMethods(entity,"get");
//装载参数
Objectobj[]=newObject[list.size()];
inti=0;
//临时Method对象,负责迭代时装method对象.
MethodtempMethod=null;
//由于修改时不需要修改ID,所以按顺序加参数则应该把Id移到最后.
MethodidMethod=null;
Iterator<Method>iter=list.iterator();
while(iter.hasNext()){
tempMethod=iter.next();
//如果方法名中带有ID字符串并且长度为2,则视为ID.
if(tempMethod.getName().lastIndexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){
obj[list.size()-1]=tempMethod.invoke(entity,newObject[]{});
//把ID字段的对象存放到一个变量中,然后在集合中删掉.
idMethod=tempMethod;
iter.remove();
//如果方法名去掉set/get字符串以后与pojo+"id"想符合(大小写不敏感),则视为ID
}elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){
obj[list.size()-1]=tempMethod.invoke(entity,newObject[]{});
idMethod=tempMethod;
iter.remove();
}
}
//把迭代指针移到第一位
iter=list.iterator();
while(iter.hasNext()){
tempMethod=iter.next();
sql+=tempMethod.getName().substring(3).toLowerCase()+"=?,";
obj[i]=tempMethod.invoke(entity,newObject[]{});
i++;
}
//去掉最后一个,符号
sql=sql.substring(0,sql.lastIndexOf(","));
//添加条件
sql+="where"+idMethod.getName().substring(3).toLowerCase()+"=?";
//SQL拼接完成,打印SQL语句
System.out.println(sql);
st=conn.prepareStatement(sql);
for(intj=0;j<obj.length;j++){
st.setObject(j+1,obj[j]);
}
result=st.executeUpdate();
jdbcUtil.getClose(rs,st,conn);
returnresult;
}
publicTfindById(Objectobject)throwsException{
Stringsql="select*from"+persistentClass.getSimpleName().toLowerCase()+"where";
//通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型
Tentity=persistentClass.newInstance();
//存放Pojo(或被操作表)主键的方法对象
MethodidMethod=null;
List<Method>list=this.matchPojoMethods(entity,"set");
Iterator<Method>iter=list.iterator();
//过滤取得Method对象
while(iter.hasNext()){
MethodtempMethod=iter.next();
if(tempMethod.getName().indexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){
idMethod=tempMethod;
}elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){
idMethod=tempMethod;
}
}
//第一个字母转为小写
sql+=idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4)+"=?";
System.out.println(sql);
st=conn.prepareStatement(sql);
//判断id的类型
if(objectinstanceofInteger){
st.setInt(1,(Integer)object);
}elseif(objectinstanceofString){
st.setString(1,(String)object);
}
rs=st.executeQuery();
//把指针指向迭代器第一行
iter=list.iterator();
//封装
while(rs.next()){
while(iter.hasNext()){
Methodmethod=iter.next();
if(method.getParameterTypes()[0].getSimpleName().indexOf("String")!=-1){
//由于list集合中,method对象取出的方法顺序与数据库字段顺序不一致(比如:list的第一个方法是setDate,而数据库按顺序取的是"123"值)
//所以数据库字段采用名字对应的方式取.
this.setString(method,entity,rs.getString(method.getName().substring(3).toLowerCase()));
}elseif(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);
returnentity;
}
/**
*过滤当前Pojo类所有带传入字符串的Method对象,返回List集合.
*/
privateList<Method>matchPojoMethods(Tentity,StringmethodName){
//获得当前Pojo所有方法对象
Method[]methods=entity.getClass().getDeclaredMethods();
//List容器存放所有带get字符串的Method对象
List<Method>list=newArrayList<Method>();
//过滤当前Pojo类所有带get字符串的Method对象,存入List容器
for(intindex=0;index<methods.length;index++){
if(methods[index].getName().indexOf(methodName)!=-1){
list.add(methods[index]);
}
}
returnlist;
}
/**
*参数类型为String时,为entity字段设置参数,对应set
*/
publicStringsetString(Methodmethod,Tentity,Stringarg)throwsException{
return(String)method.invoke(entity,newObject[]{arg});
}
/**
*参数类型为Date时,为entity字段设置参数,对应set
*/
publicDatesetDate(Methodmethod,Tentity,Datearg)throwsException{
return(Date)method.invoke(entity,newObject[]{arg});
}
/**
*参数类型为Integer或int时,为entity字段设置参数,对应set
*/
publicIntegersetInt(Methodmethod,Tentity,Integerarg)throwsException{
return(Integer)method.invoke(entity,newObject[]{arg});
}
}
以上这篇基于JDBC封装的BaseDao(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。