java basedao 查询方法_java 利用注解实现BaseDao 增删查改

该博客介绍了如何在Java中基于注解创建一个BaseDao类,实现基于主键的查询、全量查询、保存、更新和删除等基本数据库操作。通过反射获取实体类信息,动态构建SQL语句,并使用Apache Commons DBUtils进行处理。
摘要由CSDN通过智能技术生成

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值