`

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

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

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


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;
	}
}


分享到:
评论

相关推荐

    基于J2SE的图书管管理系统

    《基于J2SE的图书管管理系统》是一款利用Java标准版(J2SE)技术平台开发的图书管理软件,旨在提供高效、便捷的图书借阅、归还、查询以及库存管理功能。这款系统深入体现了Java语言的强大特性和面向对象的设计理念,...

    J2SE讲解文档

    数据库操作通过JDBC(Java Database Connectivity)进行,可以执行SQL语句,进行数据的增删改查。分页、文件上传、图表打印和报表生成是常见的Web应用功能。 远程方法调用(RMI)、企业级JavaBean(EJB)和Web服务...

    MLDN笔记 含J2SE,Web和框架部分

    4. **Hibernate框架**:对象关系映射(ORM),实体类,SessionFactory,Session,Query语言,以及事务管理。 5. **Spring Boot**:快速开发工具,自动配置,起步依赖,以及微服务概念的引入。 6. **Spring Cloud**...

    j2se资源集(精华)

    4. **多线程**:Java 提供了 Thread 类和 Runnable 接口来实现并发,还包括同步机制如 synchronized 关键字、Lock 接口、条件变量等。 5. **网络编程**:Socket 编程、ServerSocket、URL、URLConnection 等用于网络...

    J2SE的项目:人事管理系统原工程

    - **实体类与数据表映射**:通过设计Java类来映射Oracle数据库中的表结构,实现ORM(Object-Relational Mapping)。 ### 3. MVC设计模式 - **Model-View-Controller(MVC)**:是一种软件设计模式,用于将业务逻辑...

    MLDN笔记(含J2SE,Web和框架部分)

    - **类与对象**:理解面向对象编程的基本概念,包括封装、继承和多态。 - **异常处理**:学习如何使用try-catch-finally语句处理程序运行时可能出现的异常。 - **集合框架**:熟悉ArrayList、LinkedList、HashSet...

    java学习之路

    - **Hibernate基础开发步骤**: 包括配置Hibernate、创建实体类、执行CRUD操作等。 - **Hibernate基本接口**: 如`Session`、`SessionFactory`等,用于与数据库进行交互。 - **普通属性映射、关联关系映射**: ...

    java自学路线图java自学路线图.doc

    了解JDBC基础,包括连接数据库、执行SQL语句和处理结果集。学习使用连接池(如C3P0、DBCP、HikariCP)提高性能,DataSource和RowSet提供更高效的数据处理。掌握不同数据库(如Oracle和MySQL)的JDBC特定操作。 4. *...

    java 学习的顺序(初学者)

    1. **J2SE**:Java Standard Edition,学习Java的基础,包括面向对象编程的三大特性(封装、继承、多态),内存分析,递归,集合(Set, List, Map及其子类)、泛型、自动装箱与拆箱,以及注解(Annotation)。...

    学生信息管理系统

    在学生信息管理系统中,我们可以创建如“学生”、“班级”、“教师”等类,每个类包含属性(如姓名、学号、成绩等)和方法(如注册、修改信息等),实现数据和操作的封装。 3. **J2SE平台** J2SE是Java的标准化...

    Hibernate技术.PPT

    Hibernate的核心在于将Java类与数据库表进行映射,使得开发人员可以使用面向对象的方式处理数据库,而无需直接编写SQL语句。 1. **Hibernate基本概念** - Hibernate是一个开源的ORM框架,它利用Java Reflection...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。...18.3.1 实体类 18.3.2 数据处理 18.3.3 权限处理

    JAVA自学之路 七路线图明细

    3. **数据库**:掌握至少一种数据库,如Oracle或MySQL,学习SQL语句,包括多表连接、子查询、索引、序列和约束。理解树状结构存储,以及存储过程和触发器的编写。 4. **JDBC**:学习JDBC基础,包括如何建立数据库...

    Java程序员笔试题

    - **基本类型转包装类:** 如 `int` 转 `Integer`,可以通过自动装箱或使用构造函数 `new Integer(int)` 实现。 **4. 日期时间处理** - **获取当前时间戳:** 使用 `System.currentTimeMillis()` 获取当前时间的...

    java银行管理系统

    7. **实体类与数据访问对象(DAO)**:实体类代表数据库中的表,而DAO层则封装了对数据库的操作,提供增删改查等方法,两者结合实现了业务逻辑与数据操作的解耦。 8. **安全性**:银行系统需要考虑用户数据的安全,...

    Java面试宝典1,找工作的好帮手

    EJB 包括会话 Bean 和实体 Bean 两种类型,其中会话 Bean 用于封装业务逻辑,而实体 Bean 用于持久化数据。它们都有自己的生命周期管理机制,由容器自动管理。 3. **设计模式:** - **问题**:Java 常见的设计模式...

    Java 面试宝典

    - `Statement`与`PreparedStatement`的区别主要在于预编译SQL语句的能力和防止SQL注入的功能。 10. **代码审查示例** - 检查空指针异常。 - 类型转换错误。 - SQL注入风险等。 #### 二、JSP&Servlet技术 1. *...

    Java方向面试题,超全的。

    - **类与对象**:理解面向对象编程的基本概念,包括封装、继承和多态。 - **异常处理**:掌握try-catch-finally语句块,了解Checked和Unchecked异常的区别。 - **集合框架**:理解ArrayList、LinkedList、HashMap...

Global site tag (gtag.js) - Google Analytics