`

反射机制在JDBC连接中的使用

 
阅读更多

1、数据库当中的表设计



 

2、对应数据表的实体Bean (id为主键)

 

 

public class EnginConfigVO {
	int id = 0;
	int THREADS_COUNT;

	/**
	 * @return the id
	 */
	public int primaryGetId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void primarySetId(int id) {
		this.id = id;
	}
	/**
	 * @return the tHREADS_COUNT
	 */
	public int getTHREADS_COUNT() {
		return THREADS_COUNT;
	}

	/**
	 * @param tHREADS_COUNT the tHREADS_COUNT to set
	 */
	public void setTHREADS_COUNT(int tHREADS_COUNT) {
		THREADS_COUNT = tHREADS_COUNT;
	}
}

由于没有像hibernate那样的注解机制,所以只能在主键的setter和getter方法上动动手脚primaryGetId() ,primarySetId(int id)

 

而实体bean的类名在与数据表的匹配上最后多了“vo” 两个字母,所以在下面方法中将这两个字母剪裁掉。

 

反射方法: 

T o 对应的就是实体Bean,这样的方法当然是写在DAO层中,供上层的service调用,传入需要修改的实体Bean

 

public <T> void updatePropertiesValues(T o) {
		StringBuilder sd = new StringBuilder("update ");
		sd.append(o.getClass().getSimpleName().toLowerCase().substring(0, o.getClass().getSimpleName().length()-2)).append(" ");
		sd.append("set ");
		StringBuilder id = new StringBuilder("where ");
		try {
			for(Method m : o.getClass().getDeclaredMethods()) {
				String name = m.getName();
				if (name.startsWith("get")) {
					sd.append(name.substring(3).toLowerCase()).append("=");
					if(m.invoke(o) instanceof String) {
						sd.append("'").append(m.invoke(o)).append("', ");
					}else {
						sd.append(m.invoke(o)).append(", ");
					}
				}
				if(name.startsWith("primaryGet")) {
					id.append(name.substring(10).toLowerCase()).append("=");
					if(m.invoke(o) instanceof String) {
						id.append("'").append(m.invoke(o)).append("';");
					}else {
						id.append(m.invoke(o)).append(";");
					}
				}
			}
			sd.delete(sd.length()-2, sd.length());
			sd.append(" ");
			sd.append(id);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		
		executeTrans(sd.toString());
		
	}

 这样以后便可以拼凑出完整的sql语句,为我们解决了功能相似代码的冗余。。

 

另外在查找时,我们还可以利用发射机制,将数据库返回的resultset 对象包装成List<T>

public static <T> List<T> getObjectsList(ResultSet rs, Class<T> k)
			throws SQLException {
		List<T> bl = new ArrayList<T>();
		if (rs != null) {
			while (rs.next()) {
//				System.out.println("result is not null");
				T o = null;
				try {
					o = k.newInstance();
					for (Method m : k.getDeclaredMethods()) {
						String name = m.getName();
						if (name.startsWith("set")) {
//							System.out.println(rs.getObject(name.substring(3)).getClass().getName());
							m.invoke(o, rs.getObject(name.substring(3)));
						}
					}
					bl.add(o);
				} catch (InstantiationException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
			return bl;
		}
		return null;
	}

这样,我们就可以从底层直接获得包装好的List<T>集合。。不足之处,欢迎大家讨论。。 

 

  • 大小: 26.1 KB
分享到:
评论

相关推荐

    JAVA反射机制和JDBC和各种数据库的连接

    JAVA的反射机制 JDBC连接各种数据库的方法

    反射连接数据库

    利用反射机制连接mysql数据库,不需要输入繁琐的sql语句

    jdbc基础和参考

    JDBC连接数据库的步骤: 1.注册驱动(加载驱动): 注册的方式: 1.使用类加载器(使用反射的方式) Class.forName(driverName); 2.实例化Driver Driver driver = new oracle.jdbc.driver.OracleDriver(); ...

    java面试常见问题.docx

    如何使用JDBC连接数据库? Java中的集合框架是什么?常用的集合类有哪些? 请解释Java中的分布式框架是什么?常用的分布式框架有哪些? 你如何处理数据库连接池中的连接泄漏(Leak)? 你如何解决MyBatis中查询慢的...

    j2ee学习路径 对初学者很有帮助

    反射机制 2:数据库(Oracle或者MySQL) SQL语句 多表连接,内外连接, 子查询等 管理表、视图、索引、序列、约束等 树状结构存储 存储过程、触发器 数据库设计三范式、 3:JDBC JDBC基础 连接池 树状结构存储与...

    Spring.3.x企业应用开发实战(完整版).part2

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 ...

    通用工具类

    8.利用反射机制进行排序工具类,支持数组、List、Set、Map的排序,可以支持多属性排序,支持子对象中的属性排序(例user对象中的role的name属性进行排序,method="role.name") 9.JVM参数获取工具 10.Java对象比较、...

    Java知识集.docx

    Java知识集是Java编程语言的核心概念和技术,涵盖了Java编程语言的基础知识、面向对象编程、数据结构与算法、图形用户界面(GUI)和网络编程等各个方面。...反射机制:包括Class、Method、Field等类的使用。

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    JDBCManager:一款操作数据库的小工具

    导入clone项目后,导入JDBCDao,JDBCHelper,JDBCObject,JDBCSetting四个类即可初始化在JDBCSetting类中修改常量URL,USERNAME,PASSWORD为自己连接sqlserver数据库的参数public class JDBCSetting { static final String...

    java面试常用知识点.docx

    反射机制:Class、Field、Method、Constructor等 注解:自定义注解、注解的应用等 数据库操作:JDBC、ORM框架、连接池等 常用的框架:Spring、SpringMVC、MyBatis、Hibernate等 分布式相关技术:Dubbo、Zookeeper、...

    java必了解的六大问题

    *第五阶段:JDBC编程:包括JDBC原理,JDBC连接库,JDBC API,虽然现在Hibernate比JDBC要方便许多,但是JDBC技术仍然在使用,JDBC思想尤为重要; *第六阶段:JDBC深入理解高级特性:包括数据库连接池,存储过程,...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    Java开发常用jar包

    11.commons-dbcp.jar:是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。 12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作...

    day01.环境变量,HelloWorld,常量

    - **第三部分:JavaSE核心高级应用:**`集合`、`I/O`、`多线程`、`网络编程`、`反射机制`、 - **第四部分:Java新特性:**`Lambda表达式`、`函数式编程`、`新Date/Time API`、`接口的默认、静态和私有方法`、 - **第...

Global site tag (gtag.js) - Google Analytics