自己写的小应用开发框架,实现简单缓存。js自动验证。所有操作代码自动生成。求优化意见

本系统采用纯jdbc结合mysql。所有简单的增删改查询操作都是用自己写的工具自动生成的。包括带有单选框,多选框,下拉框控件都是自动生成,
自动带有表单js自动验证,table自动格式化样式。分页等功能。编辑页面属性对应的表单属性中文名称也是自动生成,对于简单的增删改操作页面什么都不用改动,生成出来就可以直接使用。

主要结构 (以操作student表为例)
BaseDao
封装了页面访问数据库的所有操作。采用自动映射方式来避免配置文件。
由于极其讨厌配置文件,所以没有采用像hibernate那样靠xml配置文件来定义表和实体之间的关系。
表和实体的对应关系是靠表名和字段名和实体名称和一一对应的,比如student表就对应Student实体,name字段就对应Student的name属性。

CacheDao
继承自BaseDao,如果一个表需要使用查询缓存,表对应的实体类操作dao就继承CacheDao,那么查询这张表时就会自动启用缓存,如果不需要缓存则直接继承BaseDao
StudentDao  表对应的实体dao
Student     表对应的实体,就是属性的get,set方法


BaseDao主要方法--------------------------------------------------------------------

//得到当前session和操作的具体实体和表
public void init() {
request = getContext();
//在这里调用session是因为做系统操作日志的时候需要得到当前操作用户的id,操作用户信息在登录时候保存在session里
session = request.getSession();
application = (ServletContext) session.getServletContext();
// 前2位是Thread和BaseDao,所以从第三位开始
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
for (int i = 2; i < stack.length; i++) {
StackTraceElement ste = stack[i];
baseModelName = ste.getFileName();
//如果tomcat报tableName=  modelName= 1.没有在XxxDao中调用init();方法 2.数据库结构和表结构不对应
if (baseModelName.indexOf("Dao.java") > -1) {
baseModelName = baseModelName.replace("Dao.java", "");
break;
}
}
//从系统缓存中得到操作表的表结构,为自动构造sql语句做准备
if (CacheSystem.tableMap.containsKey(baseModelName)) {
baseTableName = (String) CacheSystem.tableMap.get(baseModelName);
}
}


//所有更新,删除功能调用这个方法,便于统一清除被改变对象的相关缓存
@SuppressWarnings("unchecked")
public int executeUpdate(String sql) {
int result = 0;
Connection conn = null;
Statement stmt = null;
try {
//这个开关是根据是否需要调试打开后台输出调试语句,相当于hibernate的show_sql=true或者show_sql=false
printSql(sql);
conn = JWCConfig.dbconn.getConnection();
stmt = conn.createStatement();
result = stmt.executeUpdate(sql);
if (result > 0) {
sql = sql.toLowerCase();
if (session != null && session.getAttribute("sysUser") != null
&& sql.indexOf("sys_logs") == -1) {
SysUser sysUser = (SysUser) session.getAttribute("sysUser");
int sys_user_id = sysUser.getSysUserId();
//根据sql语句的类型自动加入系统操作日志。
String act = "";
if (sql.indexOf("insert") > -1) {
act = "ADD";
} else if ((sql.indexOf("update") > -1)) {
act = "EDIT";
} else if ((sql.indexOf("delete") > -1)) {
act = "DELETE";
}
StringBuffer sb = new StringBuffer();
sb.append("insert into sys_logs (sys_user_id,ip,act_type,act) values (");
sb.append(sys_user_id);
sb.append(",'");
sb.append(request.getRemoteAddr());
sb.append("','");
sb.append(act);
sb.append("','");
sb.append(sql.replace("'", "\\'"));
sb.append("')");
stmt.executeUpdate(sb.toString());
//清除相关表的对应缓存,目前还没做只更新缓存被修改部分的功能,待后续改进
clearCache(baseTableName);
}
}
} catch (Exception e) {
System.err.println("--------------error sql--------------");
System.err.println(sql);
} finally {
close(stmt,conn);
}
return result;
}


//得到一个结果集
@SuppressWarnings("unchecked")
public ArrayList<Object> getList() {
ArrayList<Object> list = new ArrayList<Object>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//根据init方法中得到的表名和缓存中该表的结构自动构造查询sql语句
String pageSql = "select * from " + baseTableName;
try {
printSql(pageSql);
Class cls = Class.forName(PACKEG_NAME + baseModelName);
conn = JWCConfig.dbconn.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(pageSql);
while (rs.next()) {
Object obj = cls.newInstance();
//根据反射机制自动把结果封装到对用的实体中,组成返回的list
setMethodValue(obj, rs);
list.add(obj);
}
} catch (SQLException e) {
System.err.println("------------BaseDao.getList() exception:"
+ sdf.format(new Date()));
System.err.println("tableName=" + baseTableName + "  modelName="
+ baseModelName);
System.err.println(pageSql);
} catch (Exception e) {
System.out.println(e);
} finally {
close(rs,stmt,conn);
}
return list;
}

CacheDao主要方法--------------------------------------------------------------------
//StudentDao如果继承CacheDao就先调用CacheDao。getList到缓存中查找,如果缓存中没有再到BaseDao中的getList方法到数据库查找
public ArrayList getList() {
Object obj = application.getAttribute("LIST_" + baseTableName);
if (obj != null) {
return (ArrayList)obj;
} else {
ArrayList list = super.getList();
application.setAttribute("LIST_" + baseTableName, list);
return list;
}
}
StudentDao主要方法--------------------------------------------------------------------
public class StudentDao extends CacheDao{
public StudentDao() {
        //什么都不做,直接调用BaseDao的init()方法初始化当前操作具体是那个实体。这个地方设计比较烂,但是没找到更好一点的方法
init();
}

页面需要得到所有数据时候 直接使用List list=StudentDao.getList();
页面需要得到分页数据时候 直接使用List list=StudentDao.getList(int pageno,int pageSize,String sql);

你可能感兴趣的:(DAO,数据结构,sql,框架,Hibernate)