懒人系列——增删改查封装(一)

来源:互联网 发布:mac电脑性能在线测试 编辑:程序博客网 时间:2024/06/10 07:45

作为一个懒人就不废话了,新入职的一个小公司数据库表不复杂,查询也基本是单表,但是表的字段很长(想象一下项目就几张表,分表不均)。对于数据库的操作第一个想到的是hibernate,mybatis这些框架(别问我为什么,懒啊),但是想想又没对就几张表的事你给我加个框架???(据说要求jdbc的性能)。用原生的jdbc,意味着大量的代码,意味着。。。最终想起似乎有个叫DBUtils东东据说性能约等于jdbc??(关于DBUtils本人了解其实也不多,毕竟以前都是ORM框架搞事。。。)嗯,选它 了。最后连接池配好走起。

但是,很快问题就来了。十多个字段啊!问号数得我脑袋晕+_+,SQL语句写到一半(我刚刚写到那个属性了来着?心里想着对象操作的好啊!)忍无可忍又无法改数据库的情况下,开始想懒办法了(咳咳,好像绕多了,毕竟第一次写博文有点小紧张)

直接来代码好了:

/** * 更新任意对象(表记录)的所有列(属性) * @param obj 要更新的记录对象(表名) * @return res 影响的列 */public static int newUpdate(Object obj,String sigin){int res = 0;System.out.println("更新 中.......");int num = 0;StringBuffer sqlbuffer =  new StringBuffer();//用于存储字段值//StringBuffer valuebuffer = new StringBuffer();ArrayList<String> valuelist = new ArrayList<String>();sqlbuffer.append("UPDATE ");String signvalue = null;try {Class tableclass = Class.forName(obj.getClass().getName());sqlbuffer.append(tableclass.getSimpleName().toLowerCase()+" SET ");//linux下MySql默认区分大小写Field[] fields = tableclass.getDeclaredFields();for(int i = 0; i < fields.length; i++){fields[i].setAccessible(true);if(sigin.equals(fields[i].getName())){signvalue = fields[i].get(obj) + "";}sqlbuffer.append(fields[i].getName() + " = ");if(i < fields.length - 1){valuelist.add(toString(fields[i].get(obj)));//valuebuffer.append(fields[i].get(obj));sqlbuffer.append("? , ");}else{//valuebuffer.append(fields[i].get(obj));valuelist.add(toString(fields[i].get(obj)));sqlbuffer.append("?");}}String sql = sqlbuffer.toString() + " where "+ sigin +" =  ? ";//valuebuffer.toString();////Object[] param = new Object[valuebuffer.length() + 2];//for(int i = 0; i < param.length; i++){//if(i < valuebuffer.length()){////param[i] = valuebuffer.;////}//}//param[valuebuffer.length()] = sigin;//param[valuebuffer.length() + 1] = signvalue;String[] params = new String[valuelist.size() + 1];for(int i = 0; i < valuelist.size(); i++){params[i] = valuelist.get(i);}params[valuelist.size()] = signvalue;QueryRunner qr = new QueryRunner();res = qr.update(connection, sql, params);System.out.println(sql);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("影响的行:" + res);return res;}
/** * toString防止空指针 */public static String toString(Object obj){String message = null == obj ? "null" : obj + "";return message;}
当然代码还有很大的优化空间(比如那个Class.forname。。。以及存储和循环)。整个代码说起来也简单,通过传入任意映射对象Object,通过class获取其属性列表和值最后和sql进行拼接,第二个参数相当于sql语句中的where 判断,从而完成传入任意映射对象,对数据库对应记录的修改功能(其他的逻辑是一样的就不列举了)

当然,上面的代码肯定只适合单表。那么多表又怎么办呢?其实也很简单,只要排除常规类型获取属性和加join就可以了,这里就不列举了,给个片段就行了(我才不会说是我懒没完善。。。)

for(Field field : fields){field.setAccessible(true);System.out.println(field.getName());System.out.println(field.getType());field.getType().toString();try {Class childc = field.get(obj).getClass();if(childc.getPackage().getName().indexOf("java.lang") < 0){System.out.println("找到关联的类:" + childc.getSimpleName()); Field[] fds = childc.getDeclaredFields();//......


阅读全文
0 0
原创粉丝点击