【J2SE】利用反射机制实现的sql语句自动生成、简化实体类封装

[size=medium]现在所学的东西,有很多的共性。Dao层对于臃肿,很多都是ctrl+c和ctrl+v 完成的,这种事情纯粹就是苦力代码。利用双周的时间,用反射机制实现了sql自动生成,简化list封装。

大家看看还有什么需要改进的地方吧。 [/size]

sql工具类



import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class SqlFactory {

/**
* @author fule
* @param args
* 反射工具类 自动生成sql 语句 和参数赋值 实体类中含有id字样的只能唯一
* 对外接口 对象 语句类型 查询参数Map<String,object>字段名 字段值
*
* 如果是查询操作,构造方法传入一个jvm初始化的对象实体,生成语句时调用createQuerySql(map ma)方法
* Map<String,object>字段名 字段值
*
* 其他操作,构造方法传入一个具体对象实体,生成语句时调用createUpdateSql(String type)方法
* type为update delete insert 的字符串
*/

/** 需自动化的对象 **/
private Object obj;

/** 生成的sql语句 **/
private String sql;

/** 参数值 **/
private List objParam = new ArrayList();

/** 保存对象的属性名和属性值 **/
private Map<String, Object> paramMap = new HashMap<String, Object>();


public SqlFactory(Object obj){
/**
* 构造方法
* 自动加载load
*/
try {
this.obj=obj;
load(obj);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("IllegalArgumentException***类反射失败");
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("IllegalAccessException***类反射失败");
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("InvocationTargetException***类反射失败");
}
}

@SuppressWarnings("unchecked")
private void load(Object obj) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
/**
* 获得属性名称和值的集合
*
*/
Class c = obj.getClass();
Method[] methods = c.getMethods();
for (Method m : methods) {

String mName = m.getName();
if (mName.startsWith("get") && !mName.startsWith("getClass")) {
String fieldName = mName.substring(3, mName.length());

Object value = m.invoke(obj, null);
if (value instanceof String) {
paramMap.put(fieldName, "\"" + value + "\"");
} else {
paramMap.put(fieldName, value);
}
}
}
}

public Object[] getSqlParams() {
/**
* 参数值
*/
return objParam.toArray();
}

@SuppressWarnings("unchecked")
public String createQuerySql(Map<String,Object> map){
/**
* 查询单表记录的sql
* map 数据表的字段名 与值
* 不支持分组与多表
*/
Class c = obj.getClass();
String tableName = c.getSimpleName();
String sql="select * from "+tableName;
if(map!=null){
StringBuffer strb = new StringBuffer("select * from "+tableName+" where 1=1");
Set<String> set = map.keySet();
Object[] keys = set.toArray();
int len = keys.length;
for (int i = 0; i < len; i++) {
strb.append(" and "+keys[i]+"=?");
objParam.add(map.get(keys[i]));//将值加入到参数
}
sql = strb.toString();
}
return sql;
}

@SuppressWarnings("unchecked")
public String createUpdateSql(String type) {
/**
* createUpdateSql 自动生成添删改的SQL语句
* 表中 字段名只能有一个包含id的字段
* @param obj 对象
* @param type 传递过来的操作类型 delete update insert
* @return String
*/
Class c = obj.getClass();
String tableName = c.getSimpleName();
StringBuffer strb = new StringBuffer();
Set<String> set = paramMap.keySet();
Object[] keys = set.toArray();
int len = keys.length;
if ("insert".compareToIgnoreCase(type)==0) {
strb.append("insert into " + tableName + "(");
for (int i = 0; i < len; i++) {
if (i < len - 1) {
strb.append(keys[i]);
objParam.add(paramMap.get(keys[i]));
strb.append(",");
} else {
strb.append(keys[i]);
objParam.add(paramMap.get(keys[i]));
strb.append(") values(");
}
}
for (int i = 0; i < len; i++) {
if (i < len - 1) {
strb.append("?" + ",");
} else {
strb.append("?" + ")");
}
}
}
if ("delete".compareToIgnoreCase(type)==0) {
strb.append("delete from " + tableName);
for (int i = 0; i < len; i++) {
if (((String) keys[i]).contains("id")
|| ((String) keys[i]).contains("Id")) {
strb.append(" where " + keys[i] + "=?");
objParam.add(paramMap.get(keys[i]));
}
}
}
if ("update".compareToIgnoreCase(type)==0) {
strb.append("update " + tableName + " ");
for (int i = 0; i < len; i++) {
if (i < len - 1) {
strb.append("set" + keys[i] + "=?");
objParam.add(paramMap.get(keys[i]));
strb.append(",");
} else {
strb.append("set" + keys[i] + "=?");
objParam.add(paramMap.get(keys[i]));
}
}
for (int i = 0; i < len; i++) {
if (((String) keys[i]).contains("id")
|| ((String) keys[i]).contains("Id")) {
strb.append(" where " + keys[i] + "=?");
objParam.add(paramMap.get(keys[i]));
}
}
}
sql = strb.toString();
return sql;
}



/**
* Test
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Users te = new Users();
te.setName("张三");
te.setPass("123456");
te.setId(123);
te.setBir(new Time(new Date().getTime()));
System.out.println("********添删改********");
SqlFactory sf = new SqlFactory(te);
String sql = sf.createUpdateSql("delete");
Object[] oo = sf.getSqlParams();
System.out.println(sql);
System.out.println(Arrays.toString(oo));

System.out.println("********查询********");
SqlFactory sf2 = new SqlFactory(te);//1
Map<String, Object> ma = new HashMap<String, Object>();
ma.put("userName", "张三");
ma.put("userPass", new Time(new Date().getTime()));
String qsql = sf2.createQuerySql(ma);//2
System.out.println(qsql);
Object[] oo2 = sf2.getSqlParams();//3
System.out.println(Arrays.toString(oo2));


String sstr = "setUid";
System.out.println(sstr.substring(3));

}
}

class Users {
private String name;
private String pass;
private int id;
private Time Bir;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Time getBir() {
return Bir;
}

public void setBir(Time bir) {
Bir = bir;
}

public String getPass() {
return pass;
}

public void setPass(String pass) {
this.pass = pass;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Users() {}
}




反射工具类:ReflecTionUtil


package com.util;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;

import javax.servlet.jsp.jstl.sql.Result;

import com.entity.Nr_users;

public class ReflecTionUtil {
/**
* @author fule
* 反射工具类
* 封装数据结果到集合
* 传入result 实体和 实体类具体url
*/
private String[] classMethods = new String[20];// set方法数组
private Class[] classParams = new Class[20];// set方法参数类型
private int classMethodsNum = 0;// 实体类属性个数
private Class cs = null;// 会话管理器
private Object object = null;// 定义对象
private List list = null;// 实体类属性字段名的集合

public void getStandardManager(String url) throws ClassNotFoundException {
cs = Class.forName(url);
}

public void getProtect(String url) throws ClassNotFoundException {
// 实体类变量字段
list = new ArrayList();
this.getStandardManager(url);
Field[] fields = cs.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
list.add(fields[i].getName());
}
}

public void getConsructor(String url) throws ClassNotFoundException {
// set方法和参数类型
this.getStandardManager(url);
Method[] methods = cs.getMethods();
int count = 0;
for (Method m : methods) {
if (m.getName().substring(0, 3).equals("set")) {
Class[] parms = m.getParameterTypes();
classMethods[count] = m.getName();
classParams[count] = parms[0];//
count++;
}
}
classMethodsNum = count;
}

public void getObject(String url) throws SecurityException,
NoSuchMethodException, ClassNotFoundException,
IllegalArgumentException, InstantiationException,
IllegalAccessException, InvocationTargetException {
/**
* 创建类对象
*/
this.getStandardManager(url);
Constructor constructor = cs.getConstructor();
object = constructor.newInstance();
}

public Result checkResult(Result rs) {
/**
* 验证数据库中的数据
*/
for (int i = 0; i < rs.getRowCount(); i++) {
SortedMap map = rs.getRows()[i];
for (int j = 0; j < list.size(); j++) {
Object value = map.get(list.get(j));//testtest
if(value==null){
System.out.println("数据验证失败,检查实体类与数据表规范!");
try {
throw new Exception("数据验证失败,检查实体类与数据表规范!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
map.put(list.get(j), value);
}
}
}
return rs;
}

public List getValue(String url, Result rs) {
/**
* list列表 value
*/
List resultlist = new ArrayList();
try {
this.getObject(url);
this.getConsructor(url);
this.getProtect(url);
rs = checkResult(rs);
for (int i = 0; i < rs.getRowCount(); i++) {
for (int j = 0; j < classMethodsNum; j++) {
Method method = cs.getMethod(classMethods[j],
classParams[j]);

//System.out.println("当前调用set方法:"+method);

//System.out.println("表字段名:"+classMethods[j]
// .substring(3).toLowerCase());//表字段名
String tstr = classMethods[j]
.substring(3).toLowerCase();

///System.out.println("表字段值:"+rs.getRows()[i].get(tstr));
//表字段值
method.invoke(object, rs.getRows()[i].get(tstr));//动态设值
//System.out.println((Nr_users)object);
}
resultlist.add(object);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultlist;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值