- 浏览: 45249 次
- 性别:
文章分类
最新评论
现在所学的东西,有很多的共性。Dao层对于臃肿,很多都是ctrl+c和ctrl+v 完成的,这种事情纯粹就是苦力代码。利用双周的时间,用反射机制实现了sql自动生成,简化list封装。
大家看看还有什么需要改进的地方吧。
sql工具类
反射工具类:ReflecTionUtil
大家看看还有什么需要改进的地方吧。
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】Map.Entry 类使用简介
2012-05-10 11:12 519本文转自:http://www.cnblogs.com/guo ... -
【J2SE】Static Nested Class、Inner Class、Anonymous Inner Class
2012-05-05 11:58 0本文转自:http://blog.csdn.net/welco ... -
【J2SE】Anonymous Inner Class (匿名内部类)
2012-05-05 11:56 0本文转自:http://www.iteye ... -
【J2SE】生成者、消费者问题
2012-05-05 11:04 837本文转自:《Java JDK 实例宝典》 解决生产者消费者问 ... -
【J2SE】Java 运行时异常
2012-05-05 10:39 0本文转自:http://amyer.ite ... -
【J2SE】再谈线程:生产者与消费者
2012-05-04 23:36 0本文转自:http://www.blogjava.net/li ... -
【J2SE】Java线程:并发协作-生产者消费者模型
2012-05-04 23:34 0本文转自:http://lavasoft.blog.51cto ... -
【J2SE】线程7种状态的相互转换
2012-05-04 22:48 682本文转自:http://www.blogj ... -
【J2SE】详解java类的生命周期
2012-05-12 21:23 679本文转自:http://www.2cto.com/kf/20 ... -
Java文件操作大全
2012-05-02 13:29 0本文转自:http://www.blog ... -
【基础】Java Annotation详解
2012-05-02 11:50 0本文转自:http://www.blogjava.net/c ... -
【J2SE】Java JDBC数据库连接池总结
2012-05-03 23:21 892本文转自:http://www.blogj ... -
【基础】JAVA中String与StringBuffer的区别
2012-05-01 20:28 0String和StringBuffer的区别,网上资料可以说是 ... -
【J2SE】Java常见异常小结
2012-05-12 21:22 825本文重在Java中异常机制 ... -
【基础】Java异常处理及异常机制介绍
2012-05-01 19:54 0当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内 ... -
【基础】Java中finalize()
2012-05-01 19:39 0垃圾回收器要回收对象的时候,首先要调用这个类的finalize ... -
【基础】finally的一些测试
2012-05-01 16:37 0finally是在执行returen的中间执行。 pac ... -
【J2SE】Java之Path、CLASSPATH的概念解析
2012-05-03 23:17 792本文转自:http://blog.sin ... -
【J2SE】Java 反射机制简述
2012-05-03 23:19 668本文转自:http://zk1878.iteye.com/b ... -
【J2SE】Java中生成对象的4方式
2012-05-01 12:46 0本文转自:http://blog.sina.com.cn/s/ ...
相关推荐
《基于J2SE的图书管管理系统》是一款利用Java标准版(J2SE)技术平台开发的图书管理软件,旨在提供高效、便捷的图书借阅、归还、查询以及库存管理功能。这款系统深入体现了Java语言的强大特性和面向对象的设计理念,...
数据库操作通过JDBC(Java Database Connectivity)进行,可以执行SQL语句,进行数据的增删改查。分页、文件上传、图表打印和报表生成是常见的Web应用功能。 远程方法调用(RMI)、企业级JavaBean(EJB)和Web服务...
4. **Hibernate框架**:对象关系映射(ORM),实体类,SessionFactory,Session,Query语言,以及事务管理。 5. **Spring Boot**:快速开发工具,自动配置,起步依赖,以及微服务概念的引入。 6. **Spring Cloud**...
4. **多线程**:Java 提供了 Thread 类和 Runnable 接口来实现并发,还包括同步机制如 synchronized 关键字、Lock 接口、条件变量等。 5. **网络编程**:Socket 编程、ServerSocket、URL、URLConnection 等用于网络...
- **实体类与数据表映射**:通过设计Java类来映射Oracle数据库中的表结构,实现ORM(Object-Relational Mapping)。 ### 3. MVC设计模式 - **Model-View-Controller(MVC)**:是一种软件设计模式,用于将业务逻辑...
- **类与对象**:理解面向对象编程的基本概念,包括封装、继承和多态。 - **异常处理**:学习如何使用try-catch-finally语句处理程序运行时可能出现的异常。 - **集合框架**:熟悉ArrayList、LinkedList、HashSet...
- **Hibernate基础开发步骤**: 包括配置Hibernate、创建实体类、执行CRUD操作等。 - **Hibernate基本接口**: 如`Session`、`SessionFactory`等,用于与数据库进行交互。 - **普通属性映射、关联关系映射**: ...
了解JDBC基础,包括连接数据库、执行SQL语句和处理结果集。学习使用连接池(如C3P0、DBCP、HikariCP)提高性能,DataSource和RowSet提供更高效的数据处理。掌握不同数据库(如Oracle和MySQL)的JDBC特定操作。 4. *...
1. **J2SE**:Java Standard Edition,学习Java的基础,包括面向对象编程的三大特性(封装、继承、多态),内存分析,递归,集合(Set, List, Map及其子类)、泛型、自动装箱与拆箱,以及注解(Annotation)。...
在学生信息管理系统中,我们可以创建如“学生”、“班级”、“教师”等类,每个类包含属性(如姓名、学号、成绩等)和方法(如注册、修改信息等),实现数据和操作的封装。 3. **J2SE平台** J2SE是Java的标准化...
Hibernate的核心在于将Java类与数据库表进行映射,使得开发人员可以使用面向对象的方式处理数据库,而无需直接编写SQL语句。 1. **Hibernate基本概念** - Hibernate是一个开源的ORM框架,它利用Java Reflection...
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。...18.3.1 实体类 18.3.2 数据处理 18.3.3 权限处理
3. **数据库**:掌握至少一种数据库,如Oracle或MySQL,学习SQL语句,包括多表连接、子查询、索引、序列和约束。理解树状结构存储,以及存储过程和触发器的编写。 4. **JDBC**:学习JDBC基础,包括如何建立数据库...
- **基本类型转包装类:** 如 `int` 转 `Integer`,可以通过自动装箱或使用构造函数 `new Integer(int)` 实现。 **4. 日期时间处理** - **获取当前时间戳:** 使用 `System.currentTimeMillis()` 获取当前时间的...
7. **实体类与数据访问对象(DAO)**:实体类代表数据库中的表,而DAO层则封装了对数据库的操作,提供增删改查等方法,两者结合实现了业务逻辑与数据操作的解耦。 8. **安全性**:银行系统需要考虑用户数据的安全,...
EJB 包括会话 Bean 和实体 Bean 两种类型,其中会话 Bean 用于封装业务逻辑,而实体 Bean 用于持久化数据。它们都有自己的生命周期管理机制,由容器自动管理。 3. **设计模式:** - **问题**:Java 常见的设计模式...
- `Statement`与`PreparedStatement`的区别主要在于预编译SQL语句的能力和防止SQL注入的功能。 10. **代码审查示例** - 检查空指针异常。 - 类型转换错误。 - SQL注入风险等。 #### 二、JSP&Servlet技术 1. *...
- **类与对象**:理解面向对象编程的基本概念,包括封装、继承和多态。 - **异常处理**:掌握try-catch-finally语句块,了解Checked和Unchecked异常的区别。 - **集合框架**:理解ArrayList、LinkedList、HashMap...