博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射应用
阅读量:6288 次
发布时间:2019-06-22

本文共 9235 字,大约阅读时间需要 30 分钟。

一大段很坑爹的代码,总之我自己也不想看第二遍了,但是还是多少有些可取之处的。

对于单表的增删改查做的基本上通用了,并且希望在多表操作的时候也一样好用,只不过后来没时间继续做了。对于多表的部分,想尽办法在避免了。当时遇到的一个 比较严重的bug就是 主键id 那块儿,出了点儿问题,后来就单独设置了一个主键的字段用以标识。这样的代价就是 要多传递 一个 参数 进来。

开始用反射写出对于单表操作,甚至部分多表以后,还是 挺自大的,直到看见了hibernate 可以 对中间表操作以后就怂了。但是老实讲,这些东西还是比较有可取之处的。至少很不错的拼接了数据库查询语句。用了一些反射。如果有兴趣欢迎探讨,当时在制作的时候还是写了一些注释的,希望不会那么难看,当然这套东西针对 的 mysql数据库。

有兴趣可以看看。

 

这个应用主要是针对,数据库存取数据的,毕竟我们在操作的时候不希望每次都写一个 死的东西,来单独进行增删改查,那么为了实现通用就要传一个 通用的东西,反射能够最大限度的满足我们这个 需要,也为了最终实现,可复用可扩展,可维护,灵活性好这个终极目标,对于增删该查的操作,只要传递当前类的对象,其他的dao层继承了baseDao,然后就可以直接调用通过 addItem(Object) 或者 deleteItem(Object)就可以实现了。

【刚想起来

但是这段程序,并跑不起来,因为 下面还有一层封装的是jdbc,这里面调用了预状态通道,也就是连接数据库的部分。在jdbc里面再把剩余的部分发上来吧。下面这段代码,讲真,前不着村后不着店,就是一个 baseDao。不能针对业务层封装进行持久化,也不能连接数据库完成存取任务】

 

package com.venushalo.dao;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.letben.tag.PageBean;import com.venushalo.util.JDBCTemplate;/** * v 1.0 有三个 查询方法,查询所有用户,根据id查询一个 用户,根据用户名和密码 查询一个用户 * v 2.0 增加了 增删改三个 方法 * v 3.0 不断做了各种修改,忘记都做了什么了 * v 4.0 就算目前这个 版本吧。 * v 5.0 jdbc模板里面,不能关闭资源,要在 这里面关闭。 * v 5.1 真实关闭资源。 * v 5.2 得到 表中元组数量判定是否是 子表。 * v 5.21 修复了一个小bug。分页查询结果为零时,返回1避免报错。//事实上这个 bug应该由分页来实现,并且也已经实现了 *  * javaBean名:User. * @author Letben  * TaughtBy Salmon * */public class BaseDao {    /*     * 得到列表,查询某一个id都是十分必要的。     * 可以做login的,     * id的,     * allObject全部列表的。     * 修改的话,就aoe修改。     * 删除做一个@deprecated。表示不建议使用。     * insert?     *      * 用就用,不用就放里面,他只是一个方法。     *      * */    protected JDBCTemplate jt;    /**     * 构造方法,得到JDBC模板     */    public BaseDao(){        jt = new JDBCTemplate();    }    /**     * 没有实现     * 因为不建议删除所以我们这样写了一句话,以强调,你确定要删除,但是我们仍然允许使用。     * 最好提供一个重载,利用id     * TODO     * @param object     * @return     */    @Deprecated    public boolean deleteItem(Object object){        return false;    }    /**     * sql = "delete from c对应的表 where idInTable=id";     * sql = "delete from user_tb where user_id=1";     * 可是这样都不知道从哪个表里面删,还需要传一个Class     * 因为不建议删除所以我们这样写了一句话,以强调,你确定要删除,但是我们仍然允许使用。     * @param id     * @return     */    @Deprecated    public boolean deleteItem(Class c,String id,String primaryIdInTable){                //sql = "delete from user_tb where user_id=?";        String tableName = getTableName(c);        String sql = "delete from "+tableName+" where "+primaryIdInTable+"=?";        List params = new ArrayList();        params.add(id);        System.out.println(sql.toString());        boolean flag = jt.updateData(sql, params);        jt.closeRes();        return flag;    }    /**     * 更新一个对象,只要传入一个对象。这是 那个 有bug的方法啊!!!,如果 id不重复的话 这样修改 是可以的。     * 消除了外键关键字的bug。     * 并未考虑到如果当前对象不存在的情况。     * @param object     * @return     */    public boolean updateItem(Object object){
//传一个对象,就能够修改对象的值,当然前提是,这个对象是完整的。 //update user_tb set user_name=?,user_password=?,user_type=?,user_age=?,user_address where user_id=? //看来需要修改addItem里面的方法了。因为感觉这个不能,在用list一个一个添加了。 试试看 StringBuffer sql = new StringBuffer("update "); Class c = object.getClass(); String tableName = getTableName(c); sql.append(tableName+" set ");//update user_tb set //拼出来需要属性,这样的话就得拿到 数据库中的列名,也就是对应bean中的 属性名。 Method[] methods = c.getMethods(); List fieldNames = new ArrayList(); List fieldValues = new ArrayList(); for (Method method : methods) { String methodName = method.getName(); if(methodName.startsWith("get")&&!methodName.equalsIgnoreCase("getclass")){
//从object属性里面取得值。不过是用get好还是 set好?针对于修改来讲,我认为是set好,因为那个getAllPrice()方法,allPrice并非是一个可以被设置的值。一定要取到可以被设置的方法。 String fieldName = methodName.substring(3);//属性名 fieldNames.add(fieldName); try { fieldValues.add(method.invoke(object, new Object[]{}));//不过,还是有bug那就只能不允许getAllPrice()的出现或者 自定义标签来实现,后面慢慢再想办法。 } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } String fieldId = null; String fieldIdValue = null; int commaCount=0; int fieldCount = fieldNames.size(); for(int i=0;i
int //Integer.class -> class java.lang.Integer method.invoke(object, new Object[]{resultSet.getInt(fieldName)}); }else if(parameterTypes[0]==double.class){ method.invoke(object, new Object[]{resultSet.getDouble(fieldName)}); }else{ System.out.println("还有属性没有考虑到。属性名称为: "+method.getName()+" 。参数类型为: "+parameterTypes[0]); } } }//for完一圈儿,说明对象已经完整赋过值了 return object; /* * 简体版 object = c.newInstance();//初始化异常,非法权限异常 //接下来就是对应赋值 //跟c.getDeclaredMethods()的区别? Method[] methods = c.getMethods(); for (Method method : methods) { String methodName = method.getName(); if(methodName.startsWith("set")){ String fieldName = methodName.substring(3); Class[] parameterTypes = method.getParameterTypes();//我们的get就都只有一个参数 if(parameterTypes[0]==String.class){ method.invoke(object, new Object[]{resultSet.getString(fieldName)}); }else if(parameterTypes[0]==int.class){ method.invoke(object, new Object[]{resultSet.getInt(fieldName)}); }else{ System.out.println("未考虑到的属性"); } } } */ } /** * 为了逻辑删除后面加一个 whereClause,也可以传 null * 单表传递类名,得到数量。 * @param c * @param whereClause * @return */ public int getAllObjectsCount(Class c,String whereClause) { String tableName = getTableName(c); String sql=null; if(whereClause==null){ sql = "select count(*) from "+tableName; }else { sql = "select count(*) from "+tableName+" "+whereClause; } System.out.println(sql); ResultSet resultSet = jt.query(sql, null); int count = 0; try { if(resultSet.next()){ count = resultSet.getInt(1); } } catch (SQLException e) { System.out.println("查询所有元组数量时,出现异常"); e.printStackTrace(); }finally{ jt.closeRes(); } return count; } /** * 多表查询元组总数量。 * @param childTableName * @param whereClause * @param isChildTable * @return */ public int getAllObjectsCount(String childTableName,String whereClause,boolean isChildTable) { String sql =null; if(isChildTable){ sql = "select count(*) from ("+childTableName+") alias "+whereClause; }else { sql = "select count(*) from "+childTableName+" "+whereClause; } System.out.println(sql); ResultSet resultSet = jt.query(sql, null); int count = 0; try { if(resultSet.next()){ count = resultSet.getInt(1); } } catch (SQLException e) { System.out.println("查询所有元组数量时,出现异常"); e.printStackTrace(); }finally{ jt.closeRes(); } return count; } /** * 分页得到条目信息。 select alias.* from ( "+childTableName+" ) alias limit 0,3 * @param childTableName 子表 * @param c 子表对应的javabean * @param pageBean 分页情况 * @param isChildName 是否是子表 * @return */ public List getAllInfosByPage(String childTableName, Class c, PageBean pageBean,boolean isChildTable) { String sql=null; if(isChildTable){ sql = "select alias.* from ( "+childTableName+" ) alias limit "+(pageBean.getCurrentPage()-1)*pageBean.getPageSize()+" ,"+pageBean.getPageSize()+" "; }else{ sql = "select alias.* from "+childTableName+" alias limit "+(pageBean.getCurrentPage()-1)*pageBean.getPageSize()+" ,"+pageBean.getPageSize()+" "; } System.out.println(sql); ResultSet resultSet = jt.query(sql, null); Object object=null; try { object = c.newInstance(); } catch (InstantiationException | IllegalAccessException e1) { System.out.println("分页查询时 创建对象出现异常"); e1.printStackTrace(); } List objects = new ArrayList(); try { while(resultSet.next()){ object = setValueForObject(object, c, resultSet); objects.add(object); object = null; } } catch (Exception e) { System.out.println("分页获取信息时 出现异常"); e.printStackTrace(); }finally{ jt.closeRes(); } return objects; }}

 

转载于:https://www.cnblogs.com/letben/p/5184760.html

你可能感兴趣的文章
支持 web sftp的Jumpserver 1.4.2 发布
查看>>
企业环境下MySQL5.5调优
查看>>
【阿里云MVP Meetup 第四期】产业中的“图像识别”分享与探索,干货来袭!
查看>>
集体通宵发版怎么破?阿里敏捷教练开出四道“药方”
查看>>
git常用命令
查看>>
3.07-JS合并两个JSON对象
查看>>
VUE2.0 实现移动端在固定区域内的滚动效果
查看>>
angularjs入门(一)
查看>>
环境变量PATH、cp命令、mv命令、cat命令、tac命令、more、less、head、tail
查看>>
bandit系列0--10
查看>>
文本过滤之grep,egreo及fgrep 三剑客及正则表达式
查看>>
实现Singleton模式在C#
查看>>
服务发现:Zookeeper vs etcd vs Consul
查看>>
微软企业项目管理系统技术研讨会
查看>>
Kafka设计篇之消息传输的事务定义
查看>>
我的友情链接
查看>>
使用windows 7 系统安装盘 DOS普通用户提权为管理员
查看>>
老男孩教育每日一题第115天:如何在centos 6下面实现命令补全?效果如下
查看>>
国内可用的yum源
查看>>
linux df -h 命令卡住 解决方法
查看>>