接上java
上一篇中完成了根据bean自动生成mybatis所需的inter和xml,同时指出了其中的问题,本篇将解决多字段操做时的繁琐问题sql
观察数据库操做行为发现不管是何种操做,都在增删改查四种行为以内数据库
命令模式能很好的解决这个问题mybatis
要点:为适应多类型,本篇将大量使用反射机制,上转型与下转型ide
1,新建接口autoOrder.javaui
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public interface autoOrder { Object execute(Object object); }
2,新建命令请求类this
package plug.gg.commonsAuto; import java.lang.reflect.InvocationTargetException; import java.util.*; public class autoBeanMap { /*** * 命令模式请求类 * */ private Map beanMap=new LinkedHashMap(); /*得到map名*/ public String[] getBeanName(){ Set<String> set=beanMap.keySet(); String[] name=new String[beanMap.size()]; int x=0; for(String key:set){ name[x]=key; x++; } x=0; return name; } /*得到map值*/ public String[] getBeanValue(){ Set<String> set=beanMap.keySet(); String[] value=new String[beanMap.size()]; int x=0; for(String key:set){ value[x]=beanMap.get(key).toString(); x++; } x=0; return value; } /* * 参数设置 * 参数转换 obj->map (字段名:值) * * */ public autoBeanMap(Object obj){ try { for (int i=0;i<obj.getClass().getMethods().length;i++) { if(obj.getClass().getMethods()[i].getName().indexOf("get")>=0){ if(obj.getClass().getMethods()[i].invoke(obj)!=null){ beanMap.put(obj.getClass().getMethods()[i].getName(),obj.getClass().getMethods()[i].invoke(obj)); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } /* * add方法 参数object为mybatis里注入的inter对象 * */ public void add(Object object){ String uuid = null; try { /*得到惟一标识*/ for(int i=0;i<getBeanName().length;i++){ if(getBeanName()[i].toLowerCase().indexOf("uuid")>=0){ uuid=getBeanValue()[i]; continue; } } /*根据惟一标识查询*/ for(int i=0;i<getBeanName().length;i++){ if(getBeanName()[i].toLowerCase().indexOf("uuid")>=0){ /*根据当前时间戳生成uuid*/ uuid=new ceaterTime().ceater(); /*执行mybatis里inter里定义的add方法*/ object.getClass().getMethod("add", String.class, String.class).invoke(object,"uuid", uuid); continue; }else { /*由于xml里的基本sql只能插入一个值,所以第一个值是插入,以后的值是更新*/ if (getBeanName()[i].equals("getClass")) { continue; } else { object.getClass().getMethod("update", String.class, String.class, String.class, String.class).invoke(object, getBeanName()[i].replace("get", "").toLowerCase(), getBeanValue()[i], "uuid", uuid); System.out.println(getBeanName()[i].replace("get", "").toLowerCase()+":"+getBeanValue()[i]); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } /* * delete * */ /*根据惟一标示删除*/ public Object delete(Object object){ try { return object.getClass().getMethod("delete",String.class,String.class).invoke(object,getBeanName()[0].replace("get","").toLowerCase(),getBeanValue()[0]); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } /* *update */ /*调用屡次更新方法*/ public void update(Object object){ String uuid = null; try { for(int i=0;i<getBeanName().length;i++){ if(getBeanName()[i].toLowerCase().indexOf("uuid")>=0){ uuid=getBeanValue()[i]; continue; } } for(int i=0;i<getBeanName().length;i++){ if(getBeanName()[i].toLowerCase().indexOf("uuid")>=0){ uuid=getBeanValue()[i]; continue; }else { if (getBeanName()[i].equals("getClass")) { continue; } else { object.getClass().getMethod("update", String.class, String.class, String.class, String.class).invoke(object, getBeanName()[i].replace("get", "").toLowerCase(), getBeanValue()[i], "uuid", uuid); System.out.println(getBeanName()[i].replace("get", "").toLowerCase()+":"+getBeanValue()[i]); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } /* * * select * */ /*根据惟一标识查询*/ public Object select(Object object){ try { return object.getClass().getMethod("isSelect",String.class,String.class).invoke(object,getBeanName()[0].replace("get","").toLowerCase(),getBeanValue()[0]); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } /* * selectAll * * */ /*查询全部*/ public List selectAll(Object object){ try { return (List) object.getClass().getMethod("allSelect").invoke(object); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } }
3,新建add方法所须要的时间戳调试
package plug.gg.commonsAuto; import java.util.Date; public class ceaterTime { public String ceater(){ String date2=String.valueOf(new Date().getTime()); return date2; } public String ceaterString(){ java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date currentTime = new Date(); String date= formatter.format(currentTime); return date; } }
4,实现接口的实体类code
addorm
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public class autoAdd implements autoOrder { private autoBeanMap beanMap; public void setBeanMap(autoBeanMap beanMap){ this.beanMap=beanMap; } @Override public Object execute(Object object) { beanMap.add(object); return null; } }
delete
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public class autoDelete implements autoOrder { private autoBeanMap beanMap; public void setBeanMap(autoBeanMap beanMap){ this.beanMap=beanMap; } @Override public Object execute(Object object) { return beanMap.delete(object); } }
update
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public class autoUpdate implements autoOrder{ private autoBeanMap beanMap; public void setBeanMap(autoBeanMap beanMap){ this.beanMap=beanMap; } @Override public Object execute(Object object) { beanMap.update(object); return null; } }
seelet
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public class autoSelect implements autoOrder { private autoBeanMap beanMap; public void setBeanMap(autoBeanMap beanMap){ this.beanMap=beanMap; } @Override public Object execute(Object object) { return beanMap.select(object); } }
selectAll
package plug.gg.commonsAuto; import login.bean.user; import java.util.List; public class autoSelectAll implements autoOrder{ private autoBeanMap beanMap; public void setBeanMap(autoBeanMap beanMap){ this.beanMap=beanMap; } @Override public List execute(Object object) { return beanMap.selectAll(object); } }
5,新建命令调用类
package plug.gg.commonsAuto; public class autoBroker { private autoBeanMap beanMap; public autoBroker(autoBeanMap beanMap){ this.beanMap=beanMap; } public autoOrder order(String order){ if(order.equals("add")){ autoAdd add=new autoAdd(); add.setBeanMap(beanMap); return add; } if(order.equals("delete")){ autoDelete delete=new autoDelete(); delete.setBeanMap(beanMap); return delete; } if(order.equals("update")){ autoUpdate update=new autoUpdate(); update.setBeanMap(beanMap); return update; } if(order.equals("select")){ autoSelect select=new autoSelect(); select.setBeanMap(beanMap); return select; } if(order.equals("selectAll")){ autoSelectAll selectAll=new autoSelectAll(); selectAll.setBeanMap(beanMap); return selectAll; } return null; } }
6,步骤控制类
package plug.gg.commonsAuto; public class autoController { public Object getAuto(Object bean,String orders,Object dao){ autoBeanMap beanMap=new autoBeanMap(bean); autoBroker broker=new autoBroker(beanMap); autoOrder order=broker.order(orders); return order.execute(dao); } }
7,目录
8,调试
9,结果
10,成功!
至此最初构想已经基本完成
回顾一下整个过程
1,新建一个bean,会自动根据这个bean生成新建的sql语句
2,没必要理会mybatis所须要的inter和xml配置,会自动根据bean生成相应的xml好intere
3,没必要理会具体的sql语句,只需传入一个bean对象,dao对象和,增删改查命令,一行代码解决全部问题
如今使用mybatis是否是就比之前更加快速的完成一个数据库操做了呢
下一篇将以uml类图的形式概述整个的结构与分析