大四还未毕业,项目也才跟着软件实验室做了两三个,应该算初学者吧,最近空闲时期,把项目的架构好好研究了一番,不过也比较初级的,发现有些地方可以优化,比如字典表的CRUD构建,之前字典表的构建都是完全手写,各种从原先的项目中复制粘贴,然后修改名称,我发现这么做很耗时,于是用反射机制构建了一套通用模块
添加字典表方法
public boolean addDictionaryObject(Object ob) throws Exception{
//通过字典表信息名称查询是否已经存在该字典表信息,如果存在返回false,不存在则进行添加
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
String tableName =className.substring(0,1).toLowerCase()+className.substring(1);
Class b = ob.getClass();
Method tAge = b.getMethod("getName");
Method qAge = b.getMethod("setState", Integer.class);
qAge.invoke(ob, SystemState.USE);
String dictionaryObjectName = (String) tAge.invoke(ob);
List<Object> dictionaryObjectList = (List<Object>) dictionaryObjectDAO.findSpecificByName(dictionaryObjectName,className);
if(dictionaryObjectList.size() == 0){
try {
Class c = Class.forName("com.dictionary.DAO."+className+"DAO");
Object obb = new ClassPathXmlApplicationContext("applicationContext.xml").getBean(tableName+"DAO");
Method sAge = c.getMethod("save", ob.getClass());
sAge.invoke(obb, ob);
// log.info(LogHelper.userLog("insert class<"+className+">["+dictionaryObjectName+"]"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
else
return false;
}
删除字典表方法(批量删除)
public boolean delDictionaryObject(String delData,String className) throws Exception{
String[] ids = delData.split(",");
String objectName ="";
for (int i = 0; i < ids.length; i++) {
Object object =dictionaryObjectDAO.findSpecificById(ids[i], className);
Class c = Class.forName("com.dictionary.domain."+className);
Method rAge = c.getMethod("setState", Integer.class);
Method sAge = c.getMethod("getName");
rAge.invoke(object, SystemState.NOUSE);
String name =(String) sAge.invoke(object);
if(objectName.equals("")){
objectName = objectName + name ;
}
else
objectName = objectName + ","+name ;
}
// log.info(LogHelper.userLog("delete class<"+className+">["+objectName+"]"));
return true;
}
遍历字典表方法
public Map<String, Object> queryDictionaryObject(Integer start, Integer limit,String className){
return dictionaryObjectDAO.queryDictionaryObject(start,limit,className);
}
修改字典表方法
public boolean updateDictionaryObject(Object ob) throws Exception{
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
String tableName =className.substring(0,1).toLowerCase()+className.substring(1);
Class b = ob.getClass();
Method tAge = b.getMethod("getName");
Method rAge = b.getMethod("getId");
String dictionaryObjectName = (String) tAge.invoke(ob);
String dictionaryObjectId = (String) rAge.invoke(ob);
List<Object> dictionaryObjectList = (List<Object>) dictionaryObjectDAO.findSpecificByName(dictionaryObjectName,className);
if(dictionaryObjectList.size() >0){
return false;
}
else{
Object obb = dictionaryObjectDAO.findSpecificById(dictionaryObjectId, className);
if(obb!=null){
Class c = ob.getClass();
Method sAge = c.getMethod("setName", String.class);
Method uAge = c.getMethod("getName");
String obName = (String)uAge.invoke(ob);
sAge.invoke(obb, obName);
//log.info(LogHelper.userLog("修改了角色名为"+roleTemp.getName()+"的名称"));
return true;
}
else
return false;
}
}
通过Id找到字典表对象
public Object findDictionaryObjectById(Object ob,String className) throws Exception{
Class b = ob.getClass();
Method rAge = b.getMethod("getId");
String dictionaryObjectId = (String) rAge.invoke(ob);
return dictionaryObjectDAO.findSpecificById(dictionaryObjectId,className);
}
然后是对应的dao层方法
public Object findSpecificById(String dictionaryObjectId,String className){
try{
String queryString = "from " + className + " as t where t.state="+SystemState.USE+" and " +
"t.id=:dictionaryObjectId";
Query query = getSession().createQuery(queryString);
query.setString("dictionaryObjectId", dictionaryObjectId);
return query.uniqueResult();
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
public List<Object> findSpecificByName(String dictionaryObjectName,String className){
try{
String queryString = "from "+className +" as t where t.name =:name and t.state ="+SystemState.USE;
Query query = getSession().createQuery(queryString);
query.setString("name", dictionaryObjectName);
return query.list();
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
public Map<String, Object> queryDictionaryObject(Integer start, Integer limit , String className){
Map<String, Object> map = new HashMap<String, Object>();
try {
String queryString = "from " +className+ " as t where t.state=:state ";
String countString = "select count(*) from " +className+ " as t where t.state=:state ";
Query queryObject = getSession().createQuery(queryString);
Query countObject = getSession().createQuery(countString);
queryObject.setFirstResult(start);
queryObject.setMaxResults(limit);
queryObject.setInteger("state", SystemState.USE);
countObject.setInteger("state",SystemState.USE);
List<Object> objectList = queryObject.list();
Long count = (Long) countObject.uniqueResult();
map.put("list", objectList);
map.put("count", count);
return map;
} catch (HibernateException e) {
throw e;
}
}
OK,具体的内容都在上面的方法中,这样做的目的就是可以通用所有的字典表,只需要给service传过去一个对象,就能完成CRUD全部操作,action js jsp也都是已经写好了,用的时候直接替换里面已经设定好要替换的名称就行,这样下来,做完一个字典表,只需复制粘贴action,js,jsp,然后替换名称即可,非常方便。