package com.wzh.jdbc;

import java.lang.reflect.Field;
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.Iterator;
import java.util.List;

public class JDBCTemplate<T> {

public boolean save(final T t) {
String simpleName = t.getClass().getSimpleName();
System.out.println("simpleName" + simpleName);
final StringBuffer sql = new StringBuffer();
final Field[] fields = t.getClass().getDeclaredFields();
sql.append("insert into tb_").append(simpleName).append("(")
.append(fields[0].getName());
for (int i = 1; i < fields.length; i++) {
sql.append(",").append(fields[i].getName());
}
sql.append(") values(?");
for (int i = 1; i < fields.length; i++) {
sql.append(",?");
}
sql.append(")");
System.out.println("SQL - >" + sql.toString());
return template(new Callback<Boolean>() {
@Override
public Boolean doInCallback(Connection conn,
PreparedStatement pstm, ResultSet rs) throws Throwable {
pstm = conn.prepareStatement(sql.toString());
int index = 1;
for (Field field : fields) {
if (!field.getName().equals("UserId")) {
if (!field.isAccessible())
field.setAccessible(true);

//取得字段的值
System.out.println("field get --> "+field.get(t));
pstm.setObject(index, field.get(t));
index++;
}
}
int row = pstm.executeUpdate();
return row != 0 ? true : false;
}
});
}

public boolean delete(Class clazz, final int id) {
String simpleName = clazz.getSimpleName();
System.out.println("simpleName" + simpleName);
final String sql = "delete from tb_" + simpleName + " where id=?";
System.out.println("SQL->" + sql);
return template(new Callback<Boolean>() {
@Override
public Boolean doInCallback(Connection conn,
PreparedStatement pstm, ResultSet rs) throws Throwable {
pstm = conn.prepareStatement(sql);
pstm.setObject(1, id);
int row = pstm.executeUpdate();
return row != 0 ? true : false;
}
});
}

public List<T> findAll(final Class clazz) {
String simpleName = clazz.getSimpleName();
System.out.println("simpleName->" + simpleName);
final StringBuffer sql = new StringBuffer();
// 构建SQL语句 select [所有字段] from tb_class.getName() where id=?
Field[] fields = clazz.getDeclaredFields();
sql.append("select ").append(fields[0].getName());
for (int i = 1; i < fields.length; i++) {
sql.append(",").append(fields[i].getName());
}
sql.append(" from tb_").append(simpleName);
System.out.println("SQL - >" + sql.toString());
return template(new Callback<List<T>>() {
@Override
public List<T> doInCallback(Connection conn,
PreparedStatement pstm, ResultSet rs) throws Throwable {
pstm = conn.prepareStatement(sql.toString());
rs = pstm.executeQuery();
// 返回集合对象
List list = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while (rs.next()) {
Object object = clazz.newInstance();
// 要得到rs返回的所有字段和信息
for (int i = 1; i <= count; i++) {
// 循环拿到列名id
String column = rsmd.getColumnName(i);
Field f = clazz.getDeclaredField(column);
if (!f.isAccessible()) {
f.setAccessible(true);
}
f.set(object, rs.getObject(column));
}
list.add(object);
}
return list;
}
});
}

private Connection conn = null;

public JDBCTemplate() {
super();
conn = ConnectionFactory.GetConnection();
}

protected interface Callback<E> {
E doInCallback(Connection conn, PreparedStatement pstm, ResultSet rs)
throws Throwable;
}

protected <E> E template(Callback<E> callback) throws DataAccessException {
PreparedStatement pstm = null;
ResultSet rs = null;
try {
return callback.doInCallback(conn, pstm, rs);
} catch (Throwable e) {
throw new DataAccessException(e);
} finally {
ConnectionFactory.Close(pstm, rs);
}
}

/**
* 开启事务
* */
public void beginTransaction() {
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* 提交事务
* */
public void commit() {
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* 回滚事务
* */
public void rollback() {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* 关闭连接
* */
public void close() {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

java反射生成ORM的更多相关文章

  1. java反射的应用+mybatis+spring动态生成数据库表

    最近接触了一个类似于代码生成工具的活.思路是,通过java的反射机制得到类的字段和字段类型, 从而可以创建一个map集合存储表名(由类名决定的特殊结构字符串),表字段(由类变量确定),表字段类型(由变 ...

  2. java反射知识点总结

    一.java反射基础 1.1 什么叫java反射? 答:程序运行期间,动态的获取类的基本信息.比如:创建对象,调用类的方法,获得类的基本结构.这样给程序设计提供了很大的灵活性.个人总结就是:根据动态需 ...

  3. java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

    java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...

  4. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

    方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...

  5. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...

  6. 利用反射搭建orm框架

    1思路 根据java反射获取属性上的 注解的value的值 然后拼接成sql去执行 这就是完成了一个orm实体关系映射 package src.Test.Reflect;import java.lan ...

  7. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  8. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  9. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

随机推荐

  1. Memory Barriers ,cache-coherency

    http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf Shared-Memory Synchroniza ...

  2. linux下恢复误删除的文件方法(ext2及ext3)

     linux下恢复误删除的文件方法(ext2及ext3) 2009-12-19 15:23:47 分类: LINUX 如果是ext2文件系统的,直接用debugfs是可以恢复出来的,但对于ext3,d ...

  3. SQL : 在SQL Server 2008(Or Express)中如何Open并编辑数据表【转】

    来源:http://www.cnblogs.com/wsdj-ITtech/archive/2011/04/28/2031601.html 通常在SQL Server 2005中,我们可以通过SQL ...

  4. javascript 函数节流方法

    函数节流可以缓解调用的次数,代码如下: function throttle(method,delay){ var timer=null; return function(){ var context= ...

  5. Python报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

    解决办法: 在报错的页面添加代码: import sys reload(sys) sys.setdefaultencoding('utf8')

  6. Jquary获取页面控件的值

    一 Jquery获得服务器控件值的方法由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<as ...

  7. Jenkins初探

    最近搞搞接口测试,Postman脚本搞好了,但是每次都要手动运行,是不是太low了?Yes,it is. 最近好多人都在用Jenkins搞自动化部署集成之类的,我也凑热闹搞一下. 前提: 1. 已经安 ...

  8. java通过ftp和sftp上传war包上传到Linux服务器实现自动重启tomcat的脚本代码

    ar包自动上传Linux并且自动重启tomcat 用的是jdk1.7出的文件监控 支持ftp和sftp,支持多服务器负载等 配置好config 非maven项目导入直接使用 #\u76D1\u542C ...

  9. Java compiler level does not match the version of the installed Java project facet.问题

    从同事那里拷贝过来的web项目,导入到eclipse中,出现Java compiler level does not match the version of the installed Java p ...

  10. Eclipse 常用快捷键的使用

    Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升.     ...