简单实用 利用反射机制写的JAVA数据库访问控制框架

来源:互联网 发布:iis中将端口改为81 编辑:程序博客网 时间:2024/04/30 04:35

javaweb中当bean层的属性值超多的时候写dao层太痛苦,但是也没有用框架,就自己用了反射机制写了个简单的框架  项目中用到最后应该没有什么bug了

不过有一点就是bean的实体类中主键id必须是第一个声明的才行= =、


使用的时候很简单 如果是基本的增删查改 则直接new ObjectDao 操作,参数为Object o的填入实体类实例即可 

例如增加:

ObjectDao objectdao = new ObjectDao();

User u = new User();

objectdao.add(u,ObjectDao.NOTINSERTID);

查找:

List list = object.findAll(new Dept());

以下是代码

ObjectDao.java

package com.dao;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.sql.Date;import java.util.List;import com.pro.bean.Info;public class ObjectDao extends BaseDao {public final static int NOTINSERTID = 1;  //当主键自增时填的参数public final static int INSERTALL = 0;  //当需要整条记录插入时的参数@Overrideprotected List fetchMultiResults(ResultSet rs, Object clas)throws SQLException {// TODO Auto-generated method stubArrayList resultList = new ArrayList();try {while (rs.next()) {Object bean = Class.forName(clas.getClass().getName()).newInstance();populateVO(bean, rs);resultList.add(bean);}} catch (Exception e) {}return resultList;}/** * 插入数据 *  * @param Objcet o * @param insertArg *            (Object.INSERTALL or Object.NOTINSERTID) * @return newid * @throws SecurityException * @throws NoSuchMethodException */public int add(Object o, int insertArg) throws SecurityException,NoSuchMethodException {List params = new ArrayList();String name = o.getClass().getName();String ss[] = name.split("\\.");String tableName = ss[ss.length - 1];String sql = "INSERT INTO " + tableName;/* * + "(cmp,cmpeng,cmppinyin,dept,post,firstname," + * "secondname,firstnamepy,secondnamepy,zipcode1,province1," + * "city1,region1,address1,telfirst1,telsecond1,fax1,mobiletel1," + * "email1,url1,zipcode2,province2,city2,region2,address2,telfirst2," + * "telsecond2,fax2,mobiletel2,email2,url2,important,job,relation," + * "sex,blood,birthday,memo,business,cmpfddate,capital,empnum,bondcode,repname," * + "crtdate,crtuser,crtcmp,uptime,upusr,upcmp)" + * "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," + * "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; */Field field[] = o.getClass().getDeclaredFields();sql += "(";// 拼接 sqlfor (int i = insertArg; i < field.length - 1; ++i) {sql += field[i].getName() + ",";}sql += field[field.length - 1].getName() + ")";sql += "VALUES (";for (int i = insertArg; i < field.length - 1; ++i) {sql += "?,";}for (int i = insertArg; i < field.length; ++i) {String fieldname = field[i].getName();char c = fieldname.charAt(0);fieldname = (c + "").toUpperCase() + fieldname.substring(1);Method f = o.getClass().getDeclaredMethod("get" + fieldname, null);if (f.getName().startsWith("get")&& f.getParameterTypes().length == 0) {try {params.add(f.invoke(o, null));} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}} elseSystem.out.println("ELSExxx " + f.getName());}sql += "?)";System.out.println("sql --> " + sql);int count = super.executeSQL(sql, params);return count;}/* * 删除主键id匹配的条目; */public int delete(int id, Object clas) {String name = clas.getClass().getName();String ss[] = name.split("\\.");String tableName = ss[ss.length - 1];Field field[] = clas.getClass().getDeclaredFields();String pkstr = field[0].getName();String sql = "delete from " + tableName + " where " + pkstr + "=" + id;System.out.println("sql delete id -->" + sql);int count = super.executeSQL(sql, null);return count;}/* * 找到主键匹配条目 */public List find(int id, Object clas) {String name = clas.getClass().getName();String ss[] = name.split("\\.");String tableName = ss[ss.length - 1];Field field[] = clas.getClass().getDeclaredFields();String pkstr = field[0].getName();String sql = "select * from " + tableName + " where " + pkstr + "="+ id;System.out.println("sql find id -->" + sql);return super.findAll(sql, clas);}/* *查找全部 */public List findall(Object clas) {String name = clas.getClass().getName();String ss[] = name.split("\\.");String tableName = ss[ss.length - 1];String sql = "select * from " + tableName;System.out.println("sql findall -->" + sql);return super.findAll(sql, clas);}public int updates(Object o) throws IllegalAccessException,InvocationTargetException, SecurityException, NoSuchMethodException {String name = o.getClass().getName();String ss[] = name.split("\\.");String tableName = ss[ss.length - 1];String sql = "UPDATE " + tableName;/* * + "(cmp,cmpeng,cmppinyin,dept,post,firstname," + * "secondname,firstnamepy,secondnamepy,zipcode1,province1," + * "city1,region1,address1,telfirst1,telsecond1,fax1,mobiletel1," + * "email1,url1,zipcode2,province2,city2,region2,address2,telfirst2," + * "telsecond2,fax2,mobiletel2,email2,url2,important,job,relation," + * "sex,blood,birthday,memo,business,cmpfddate,capital,empnum,bondcode,repname," * + "crtdate,crtuser,crtcmp,uptime,upusr,upcmp)" + * "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," + * "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; */Field field[] = o.getClass().getDeclaredFields();Method methods[] = o.getClass().getDeclaredMethods();String id;sql += " SET ";// 拼接 sqlboolean mark = false;for (int i = 1; i < field.length; ++i) {//System.out.println(field[i].getName());String fieldname = field[i].getName();char c = fieldname.charAt(0);fieldname = (c + "").toUpperCase() + fieldname.substring(1);Method f = o.getClass().getDeclaredMethod("get" + fieldname, null);if (field[i].getType() == int.class){if(mark){ sql = sql+",";}else{mark = true;}sql +=  field[i].getName() + "=" + f.invoke(o, null);}else if (f.invoke(o, null) != null){if(mark){ sql = sql+",";}else{mark = true;}sql += field[i].getName() + "='" + f.invoke(o, null) + "'";}elsecontinue;if (i == field.length - 1)break;}if (field.length == 0)return 0;String fieldname = field[0].getName();char c = fieldname.charAt(0);fieldname = (c + "").toUpperCase() + fieldname.substring(1);Method f = o.getClass().getDeclaredMethod("get" + fieldname, null);System.out.println("fieldname:"+fieldname+" method "+f.getName());sql += " WHERE " + field[0].getName() + " = "+ f.invoke(o, null);System.out.println("sql update --> " + sql);int count = super.executeSQL(sql, null);return count;}protected void populateVO(Object bean, ResultSet rs) throws SQLException,IllegalArgumentException, IllegalAccessException,InvocationTargetException, SecurityException, NoSuchMethodException {Field field[] = bean.getClass().getDeclaredFields();Method f = null;for (int i = 0; i < field.length; i++) {String fieldname = field[i].getName();char c = fieldname.charAt(0);fieldname = (c + "").toUpperCase() + fieldname.substring(1);f = bean.getClass().getDeclaredMethod("set" + fieldname,field[i].getType());if (field[i].getType() == int.class) {f.invoke(bean, rs.getInt(field[i].getName()));}if (field[i].getType() == Date.class) {f.invoke(bean, rs.getDate(field[i].getName()));}if (field[i].getType() == float.class) {f.invoke(bean, rs.getFloat(field[i].getName()));}if (field[i].getType() == String.class) {f.invoke(bean, rs.getString(field[i].getName()));}//添加其他类型}}}

BaseMethod.java

package com.dao;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.dao.DBConnection;public abstract class BaseDao {protected Connection conn;protected PreparedStatement stmt;protected ResultSet rst;protected CallableStatement calltmt;protected final void getConnection() throws SQLException {conn = DBConnection.getConnection();}protected final void closeAll() {if (rst != null) {try {rst.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {rst = null;}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {stmt = null;}}if (stmt != null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {conn = null;}}}protected final int executeSQL(String sql,List params){int count = 0;ResultSet rs = null;try {this.getConnection();stmt = this.conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//返回自增idsetPreparedStatement(params);count = stmt.executeUpdate();rs = stmt.getGeneratedKeys();rs.next();count = rs.getInt(1);System.out.println("--------------------------new id="+count);} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll();}return count;}public void setPreparedStatement(List params) throws SQLException {if (params != null && params.size() > 0) {for (int i = 0; i < params.size(); i++) {stmt.setObject(i + 1, params.get(i));}}}public List findAll(String sql,Object clas) {List pslist = null;try {this.getConnection();stmt= conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs = stmt.executeQuery();pslist = fetchMultiResults(rs,clas);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {this.closeAll();}return pslist;}protected abstract List fetchMultiResults(ResultSet rs,Object clas)throws SQLException;}

但是java反射机制的效率不是很高 比直接方法调用差一些 

有篇文章讲了效率问题 可以研究下

java反射效率点击打开链接


0 0
原创粉丝点击