1 importjava.lang.reflect.Field;2 importjava.lang.reflect.ParameterizedType;3 importjava.lang.reflect.Type;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6 importjava.util.ArrayList;7 importjava.util.List;8
9 importorg.apache.commons.dbutils.ResultSetHandler;10 importorg.apache.commons.dbutils.handlers.BeanHandler;11
12 importannotation.ColumnInfo;13 importannotation.TableInfo;14
15 importfnz.utils.JdbcUtil2;16
17 public class BaseDao{18
19 private Class clazz; //类的字节码文件
20 private String tableName;//表明
21 private String primaryKey;//主键
22 private Field[] fields;//所有的字段
23 publicBaseDao(){24 Type type = this.getClass().getGenericSuperclass();//当前运行类的父类,即为“BaseDao”,其实就是“参数化类型”ParameterizedType
25 ParameterizedType pt = (ParameterizedType)type;//强制转换为“参数化类型” BaseDao
26 Type types[] = pt.getActualTypeArguments(); //获取“参数化类型”中的实体类
27 clazz = (Class)types[0];28 //tableName = clazz.getSimpleName();//获取类名(不带包名)
29 TableInfo tab = (TableInfo)clazz.getAnnotation(TableInfo.class);30 tableName =tab.TableName();31 primaryKey =tab.PrimaryKey();32 fields =clazz.getDeclaredFields();33 }34
35
36 /**
37 * 主键查询38 *@paramid 主键值39 *@return返回封装后的对象40 *@throwsSQLException41 */
42 publicT getOne(Object id){43 try{44 return JdbcUtil2.getQueryRunner().query("select * from "+tableName+" where "+ primaryKey+" = ?", new MBeanHandler(clazz,mMethod.SELECT),id);45 } catch(SQLException e) {46 e.printStackTrace();47 throw newRuntimeException(e);48 }49 }50
51 /**
52 * 查询全部53 *@return返回所有记录,封装成List54 *@throwsSQLException55 */
56 public ListgetAll(){57 try{58 return JdbcUtil2.getQueryRunner().query("select * from "+tableName, new MBeanListHandler(clazz));59 } catch(SQLException e) {60 e.printStackTrace();61 throw newRuntimeException(e);62 }63 }64 /**
65 * 保存66 *@paramt 要保存的实体对象67 *@return保存后的对象68 */
69 publicT baseSave(T t){70 try{71 List params = new ArrayList();72 for (int i = 0; i < fields.length; i++) {73 fields[i].setAccessible(true);//强制是有字段也可以访问
74 params.add(fields[i].get(t));75 }76 //sql拼接
77 StringBuilder sql = newStringBuilder();78 sql.append("insert into "+tableName+"(");79 for (int j = 0; j < fields.length; j++) {80 String fieldName = fields[j].getAnnotation(ColumnInfo.class).columnName();//获取表字段名
81 if(j == fields.length-1){82 sql.append(fieldName+")");83 }else{84 sql.append(fieldName+",");85 }86 }87 sql.append(" values(");88 for (int k = 0; k < fields.length; k++) {89 if(k == fields.length-1){90 sql.append("?)");91 }else{92 sql.append("?,");93 }94 }95
96 JdbcUtil2.getQueryRunner().insert(sql.toString()97 ,new MBeanHandler(clazz,mMethod.INSERT)98 ,params.toArray());99 } catch(Exception e) {100 e.printStackTrace();101 throw newRuntimeException(e);102 }103 returnt;104 }105
106 /**
107 * 执行更新108 *@paramt 更新对象109 *@return
110 */
111 publicT baseUpdate(T t){112 try{113 List params = new ArrayList();114 Object idParam = null;115 for (int i = 0; i < fields.length; i++) {116 fields[i].setAccessible(true);//强制是有字段也可以访问
117 if(!primaryKey.equals(fields[i].getAnnotation(ColumnInfo.class).columnName())){118 params.add(fields[i].get(t));119 }else{120 idParam =fields[i].get(t);121 }122 }123 params.add(idParam);//id为最后一个参数124 //sql拼接
125 StringBuilder sql = newStringBuilder();126 sql.append("update "+tableName+" set");127 String strWhere = "";128 for (int j = 0; j < fields.length; j++) {129 String fieldName = fields[j].getAnnotation(ColumnInfo.class).columnName();//获取表字段名
130 if(!fieldName.equals(primaryKey)){131 sql.append(" "+fieldName+"=?,");132 }else if(fieldName.equals(primaryKey)){133 strWhere = " where "+primaryKey+"=?";134 }135 }136 int idx = sql.lastIndexOf(",");137 sql = sql.replace(idx, idx+1, "");138 sql.append(strWhere);139
140 JdbcUtil2.getQueryRunner().update(sql.toString(),params.toArray());141 } catch(Exception e) {142 e.printStackTrace();143 throw newRuntimeException(e);144 }145 returnt;146 }147
148 /**
149 * 根据主键删除150 *@paramid 主键id151 *@return
152 */
153 publicBoolean baseDelete(Object id){154 try{155 JdbcUtil2.getQueryRunner().update("delete from "+tableName+" where "+primaryKey+"=?",id);156 } catch(Exception e) {157 e.printStackTrace();158 throw newRuntimeException(e);159 }160 return true;161 }162
163 }164
165 enummMethod{166 SELECT,167 INSERT,168 UPDATE169 }170 /**
171 * 自定义结果集:封装单个Bean对象172 *@authorfnz173 *174 *@param175 */
176 class MBeanHandler implements ResultSetHandler{177 privatemMethod method;178 private Classclazz;179 public MBeanHandler(Classclazz,mMethod method){180 this.clazz =clazz;181 this.method =method;182 }183
184 public T handle(ResultSet rs) throwsSQLException {185 try{186 if(this.method ==mMethod.SELECT){187 if(rs.next()){188 T tobj =clazz.newInstance();189 Field[] fields = clazz.getDeclaredFields();//获取到所有的
190 for(Field field : fields) {191 ColumnInfo col = field.getAnnotation(ColumnInfo.class);//获取实体类字段上的注解ColumnInfo
192 String colName = col.columnName();//得到 实体类字段 对应 表的字段名193 //获取表字段的值
194 rs.findColumn(colName);195 Object value =rs.getObject(colName);196 //封装对象
197 field.setAccessible(true);198 field.set(tobj, value);199 }200 returntobj;201 }202 }else{203 return null;204 }205 } catch(Exception e) {206 e.printStackTrace();207 throw newRuntimeException(e);208 }209 return null;210 }211 }212 /**
213 * 自定义结果集:封装多个Bean对象214 *@authorfnz215 *216 *@param217 */
218 class MBeanListHandler implements ResultSetHandler>{219 //保存传入的要封装的类的字节码
220 private Classclazz;221 public MBeanListHandler(Classclazz) {222 this.clazz =clazz;223 }224 //封装结果集的方法
225 public List handle(ResultSet rs) throwsSQLException {226 try{227 List list = new ArrayList();228 //向下读一行
229 while(rs.next()){230 T tobj =clazz.newInstance();231 Field[] fields = clazz.getDeclaredFields();//获取到所有的
232 for(Field field : fields) {233 ColumnInfo col = field.getAnnotation(ColumnInfo.class);//获取实体类字段上的注解ColumnInfo
234 String colName = col.columnName();//得到 实体类字段 对应 表的字段名235 //获取表字段的值
236 Object value =rs.getObject(colName);237 //封装对象
238 field.setAccessible(true);239 field.set(tobj, value);240 }241 list.add(tobj);242 }243 returnlist;244 } catch(Exception e) {245 throw newRuntimeException(e);246 }247 }248 }