登录 or

通过反射用一个方法完成所有表的查询

package com.guaguauu.reflect;

import com.guaguauu.entity.Dept;
import com.guaguauu.entity.Emp;
import com.guaguauu.util.DBUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
* 要查询N张表的数据,但是不想写N多的方法,能否写一个方法完成所有表的查询工作
* 将不同的地方写入一个参数列表中
* 统一的查询表的方法
* @param sql 不同的sql语句
* @param params sql语句的参数
* @param clazz sql语句查询返回的对象
* @return
* */
public class BaseDaoImpl {

public List getRows(String sql,Object[] params,Class clazz){
ArrayList list = new ArrayList();
Connection connection = null;
PreparedStatement psmt = null;
ResultSet resultSet = null;
//1.建立连接
connection = DBUtil.getConnection();
//2.创建psmt对象
try {
psmt = connection.prepareStatement(sql);
//3.准备sql语句填充参数
if(params !=null){
for (int i = 0; i < params.length ; i++) {
psmt.setObject(i+1,params[i]);

}
}
//4.开始执行查询,resultset中有返回的结果,需要将返回的结果放置到不同的对象clazz中
resultSet = psmt.executeQuery();
//5.获取结果集的元数据对象
ResultSetMetaData metaData = resultSet.getMetaData();
//6.判断查询到的每一行记录中包含多少个列
int columnCount = metaData.getColumnCount();
//5.循环遍历resuletset
while (resultSet.next()){
//创建放置具体结果属性的对象
Object o = clazz.newInstance();
for (int i = 0; i < columnCount ; i++) {
//从结果集合中获取单一列的值
Object objValue = resultSet.getObject(i+1);
//获取列的名称
String columnName = metaData.getColumnName(i+1).toLowerCase();
//获取类中的属性,跟实体类对象做映射
Field declaredField = clazz.getDeclaredField(columnName);
//获取类中属性对应的set方法
Method method = clazz.getMethod(getSetName(columnName),declaredField.getType());
//java和sql中的常用类型Number相匹配
if (objValue instanceof Number){
Number number = (Number) objValue;
//获取类型名称
String fname = declaredField.getType().getName();
//进行判断
if ("int".equals(fname)||"java.lang.Integer".equals(fname)){
method.invoke(o,number.intValue());
}else if ("long".equals(fname)||"java.lang.Long".equals(fname)){
method.invoke(o,number.longValue());
}else if ("byte".equals(fname)||"java.lang.Byte".equals(fname)){
method.invoke(o,number.byteValue());
}else if ("float".equals(fname)||"java.lang.Float".equals(fname)){
method.invoke(o,number.floatValue());
}else if ("double".equals(fname)||"java.lang.Double".equals(fname)){
method.invoke(o,number.doubleValue());
}else if ("short".equals(fname)||"java.lang.Short".equals(fname)){
method.invoke(o,number.shortValue());
}

}else{method.invoke(o,objValue);}
}
list.add(o);
}

} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.closeConnection(connection,psmt,resultSet);
}

return list;
}

//设置setName方法set后的N要大写,驼峰标识
public String getSetName(String name){
return "set"+name.substring(0,1).toUpperCase()+name.substring(1);
}

public static void main(String[] args) {
// System.out.println(new BaseDaoImpl().getSetName("name"));
BaseDaoImpl baseDao = new BaseDaoImpl();
// List rows = baseDao.getRows("select deptno,empno,ename from emp where deptno = ? ", new Object[]{10}, Emp.class);
// for (Iterator it = rows.iterator();it.hasNext();){
// Emp emp = (Emp) it.next();
// System.out.println(emp);
// }
List rows = baseDao.getRows("select deptno,dname,loc from dept where deptno = ?", new Object[]{10}, Dept.class);
for(Iterator it = rows.iterator();it.hasNext();){
Dept dept = (Dept) it.next();
System.out.println(dept);
}

}


}
已邀请:

hf14 - 站长

赞同来自:

package com.guaguauu.reflect;

import com.guaguauu.util.DBUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class BaseDaoImp {

public List getRowsFields(String sql, Object[] params, Class clazz) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
conn = DBUtil.getConnection();
List listobj = new ArrayList();
try {
ps = conn.prepareStatement(sql);
if (params != null) {
// 传入参数
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
// 提交执行查询
rs = ps.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();
int rowcount = metaData.getColumnCount();//获取列的数量
while (rs.next()) {
Object obj = clazz.newInstance();
// 想办法初始化它里面值,数据库里面查询的数据初始化???
// 获取多少列?
for (int i = 0; i < rowcount; i++) {
Object objvalue = rs.getObject(i + 1);//获取数据库里面相应列的值
//
String colname = metaData.getColumnName(i + 1).toLowerCase();//获取列名
// 获取共有的set方法,然后初始化值
Field field = clazz.getDeclaredField(colname);
Method setMethd = clazz.getMethod(getSetName(colname), field.getType());
// 调用set方法初始化值
if (objvalue != null) {
if (objvalue instanceof Number) {
Number number = (Number) objvalue;
String fname = field.getType().getName();
if ("int".equals(fname) || "java.lang.Integer".equals(fname)) {
setMethd.invoke(obj, number.intValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
} else if ("double".equals(fname) || "java.lang.Double".equals(fname)) {
setMethd.invoke(obj, number.doubleValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
} else if ("long".equals(fname) || "java.lang.Long".equals(fname)) {
setMethd.invoke(obj, number.longValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
} else if ("float".equals(fname) || "java.lang.Float".equals(fname)) {
setMethd.invoke(obj, number.floatValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
} else if ("short".equals(fname) || "java.lang.Short".equals(fname)) {
setMethd.invoke(obj, number.shortValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
}

} else {
setMethd.invoke(obj, objvalue);//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
}
}
}
listobj.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(conn, ps, rs);
}
return listobj;
}

private String getSetName(String colname) {
return "set" + colname.substring(0, 1).toUpperCase() + colname.substring(1);

}

private String getGetName(String colname) {
return "get" + colname.substring(0, 1).toUpperCase() + colname.substring(1);

}


@Override
public Object getRowFields(String sql, Object[] params, Class clazz) {
// TODO Auto-generated method stub
List fields = getRowsFields(sql, params, clazz);
Object obj = null;
if (fields != null && fields.size() > 0) {
obj = fields.get(0);
}
return obj;
}

// 执行 insert delete update
public int executeSql(String sql, Object[] params) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
conn = DBUtil.getConn();
try {
ps = conn.prepareStatement(sql);
if (params != null) {
// 传入参数
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
return ps.executeUpdate();

} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
DBUtil.close(conn, ps, rs);
}
}


public int save(Object obj) {
Class clazz = obj.getClass();
StringBuffer sql = new StringBuffer();
StringBuffer sqlwen = new StringBuffer();
sql.append("insert into ");
String tablename = clazz.getSimpleName().toLowerCase();
sql.append(tablename + "(");
List args = new ArrayList();
try {
Field[] colfields = clazz.getDeclaredFields();//获取类里面所有的属性
for (int i = 0; i < colfields.length; i++) {
Field f = colfields[i];//类里面一个属性
String colname = f.getName();//表里面的列名
if (!"id".equals(colname)) {

Method getmethod = clazz.getMethod(getGetName(colname), null);
Object fieldvalue = getmethod.invoke(obj, null);
args.add(fieldvalue);
sql.append(colname);
sqlwen.append("?");
// 加逗号
if (i < (colfields.length - 1)) {
sql.append(",");
sqlwen.append(",");
}
}
}
System.out.println(sql);
System.out.println(sqlwen);
sql.append(") values (");
sql.append(sqlwen);
sql.append(")");
System.out.println(sql);
System.out.println(args);
return this.executeSql(sql.toString(), args.toArray());
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public <T> T getObjById(Class<T> clazz, int id) {
// TODO Auto-generated method stub
String sql = "select * from " + clazz.getSimpleName().toLowerCase() + " where id = ?";
Object obj = this.getRowFields(sql, new Object[]{id}, clazz);
return (T) obj;
}


public int update(Object obj) {
StringBuilder sb;
List params;
int flag = 0;
try {
sb = new StringBuilder("update " + obj.getClass().getSimpleName().toLowerCase() + " ");
sb.append("set ");
Field[] fs = obj.getClass().getDeclaredFields();
params = new ArrayList();
int j = 0;
for (int i = 0; i < fs.length; i++) {
if (!"id".equalsIgnoreCase(fs[i].getName())) {
sb.append(fs[i].getName() + "=?");
Method m = obj.getClass().getDeclaredMethod(getGetName(fs[i].getName()));
params.add(m.invoke(obj));
if (i < fs.length - 1) {
sb.append(",");
}
j++;
}
}
sb.append(" where id=?");
Method m = obj.getClass().getDeclaredMethod(getGetName("id"));
params.add(m.invoke(obj));
System.out.println(sb);
flag = executeSql(sb.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
public int delete(Object obj) {
//把这个对象对应的记录删掉! 通过ID确定是否对应!!!
//delete from t_user where id=obj.id
Method m = null;
String sql = null;
int flag = 0;
try {
m = obj.getClass().getDeclaredMethod(getGetName("id"));
sql = "delete from " + obj.getClass().getSimpleName().toLowerCase() + " where id=? ";
flag = executeSql(sql, new Object[]{m.invoke(obj)});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
}

hf14 - 站长

赞同来自:

package com.guaguauu.reflect;
 
import com.guaguauu.util.DBUtil;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
 
public class BaseDaoImp {
 
    public List getRowsFields(String sql, Object[] params, Class clazz) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        conn = DBUtil.getConnection();
        List listobj = new ArrayList();
        try {
            ps = conn.prepareStatement(sql);
            if (params != null) {
// 传入参数
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
// 提交执行查询
            rs = ps.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();
            int rowcount = metaData.getColumnCount();//获取列的数量
            while (rs.next()) {
                Object obj = clazz.newInstance();
// 想办法初始化它里面值,数据库里面查询的数据初始化???
// 获取多少列?
                for (int i = 0; i < rowcount; i++) {
                    Object objvalue = rs.getObject(i + 1);//获取数据库里面相应列的值
//
                    String colname = metaData.getColumnName(i + 1).toLowerCase();//获取列名
// 获取共有的set方法,然后初始化值
                    Field field = clazz.getDeclaredField(colname);
                    Method setMethd = clazz.getMethod(getSetName(colname), field.getType());
// 调用set方法初始化值
                    if (objvalue != null) {
                        if (objvalue instanceof Number) {
                            Number number = (Number) objvalue;
                            String fname = field.getType().getName();
                            if ("int".equals(fname) || "java.lang.Integer".equals(fname)) {
                                setMethd.invoke(obj, number.intValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                            } else if ("double".equals(fname) || "java.lang.Double".equals(fname)) {
                                setMethd.invoke(obj, number.doubleValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                            } else if ("long".equals(fname) || "java.lang.Long".equals(fname)) {
                                setMethd.invoke(obj, number.longValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                            } else if ("float".equals(fname) || "java.lang.Float".equals(fname)) {
                                setMethd.invoke(obj, number.floatValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                            } else if ("short".equals(fname) || "java.lang.Short".equals(fname)) {
                                setMethd.invoke(obj, number.shortValue());//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                            }
 
                        } else {
                            setMethd.invoke(obj, objvalue);//第一个参数 此方法是调用的哪个对象里面的,第二个参数,方法调用传入的参数;
                        }
                    }
                }
                listobj.add(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        return listobj;
    }
 
    private String getSetName(String colname) {
        return "set" + colname.substring(0, 1).toUpperCase() + colname.substring(1);
 
    }
 
    private String getGetName(String colname) {
        return "get" + colname.substring(0, 1).toUpperCase() + colname.substring(1);
 
    }
 
 
    @Override
    public Object getRowFields(String sql, Object[] params, Class clazz) {
        // TODO Auto-generated method stub
        List fields = getRowsFields(sql, params, clazz);
        Object obj = null;
        if (fields != null && fields.size() > 0) {
            obj = fields.get(0);
        }
        return obj;
    }
 
    // 执行 insert delete update
    public int executeSql(String sql, Object[] params) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        conn = DBUtil.getConn();
        try {
            ps = conn.prepareStatement(sql);
            if (params != null) {
// 传入参数
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
            return ps.executeUpdate();
 
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.close(conn, ps, rs);
        }
    }
 
 
    public int save(Object obj) {
        Class clazz = obj.getClass();
        StringBuffer sql = new StringBuffer();
        StringBuffer sqlwen = new StringBuffer();
        sql.append("insert into ");
        String tablename = clazz.getSimpleName().toLowerCase();
        sql.append(tablename + "(");
        List args = new ArrayList();
        try {
            Field[] colfields = clazz.getDeclaredFields();//获取类里面所有的属性
            for (int i = 0; i < colfields.length; i++) {
                Field f = colfields[i];//类里面一个属性
                String colname = f.getName();//表里面的列名
                if (!"id".equals(colname)) {
 
                    Method getmethod = clazz.getMethod(getGetName(colname), null);
                    Object fieldvalue = getmethod.invoke(obj, null);
                    args.add(fieldvalue);
                    sql.append(colname);
                    sqlwen.append("?");
// 加逗号
                    if (i < (colfields.length - 1)) {
                        sql.append(",");
                        sqlwen.append(",");
                    }
                }
            }
            System.out.println(sql);
            System.out.println(sqlwen);
            sql.append(") values (");
            sql.append(sqlwen);
            sql.append(")");
            System.out.println(sql);
            System.out.println(args);
            return this.executeSql(sql.toString(), args.toArray());
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    public <T> T getObjById(Class<T> clazz, int id) {
        // TODO Auto-generated method stub
        String sql = "select * from  " + clazz.getSimpleName().toLowerCase() + "  where id = ?";
        Object obj = this.getRowFields(sql, new Object[]{id}, clazz);
        return (T) obj;
    }
 
 
    public int update(Object obj) {
        StringBuilder sb;
        List params;
        int flag = 0;
        try {
            sb = new StringBuilder("update  " + obj.getClass().getSimpleName().toLowerCase() + " ");
            sb.append("set  ");
            Field[] fs = obj.getClass().getDeclaredFields();
            params = new ArrayList();
            int j = 0;
            for (int i = 0; i < fs.length; i++) {
                if (!"id".equalsIgnoreCase(fs[i].getName())) {
                    sb.append(fs[i].getName() + "=?");
                    Method m = obj.getClass().getDeclaredMethod(getGetName(fs[i].getName()));
                    params.add(m.invoke(obj));
                    if (i < fs.length - 1) {
                        sb.append(",");
                    }
                    j++;
                }
            }
            sb.append(" where id=?");
            Method m = obj.getClass().getDeclaredMethod(getGetName("id"));
            params.add(m.invoke(obj));
            System.out.println(sb);
            flag = executeSql(sb.toString(), params.toArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }
    public int delete(Object obj) {
        //把这个对象对应的记录删掉! 通过ID确定是否对应!!!
        //delete from t_user where id=obj.id
        Method m = null;
        String sql = null;
        int flag = 0;
        try {
            m = obj.getClass().getDeclaredMethod(getGetName("id"));
            sql = "delete from  " + obj.getClass().getSimpleName().toLowerCase() + " where id=? ";
            flag = executeSql(sql, new Object[]{m.invoke(obj)});
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return flag;
    }
}

要回复问题请先登录注册