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. php安全的改进以及检测文件是否被篡改

    可以使用svn的check for modifications//查看更改 至于缓存的php模板文件 可以查找以下执行命令的函数是否存在phpinfo,eval,exec,passthru,shell ...

  2. 网页上下载文件提示框(vb.net)

    Public Sub downLoadFile(ByVal fPath As String) Dim fileInfo As System.IO.FileInfo = New System.IO.Fi ...

  3. Apache安全配置方案

    Apache安全配置方案 from:http://drops.wooyun.org/%e8%bf%90%e7%bb%b4%e5%ae%89%e5%85%a8/2727 apache的一些配置主要是通过 ...

  4. ABBYY FineReader 12扫描界面介绍

    ABBYY FineReader 12OCR图文识别软件自身拥有着自己的扫描界面,一般在默认情况下,ABBYY FineReader 使用其自身的扫描界面.本文就解析了ABBYY FineReader ...

  5. ABBYY哪些工具和命令可以进行区域校正

    ABBYY FineReader OCR文字识别软件在运行文档识别过程前,会对文档的逻辑结构进行分析,并检测包含文本.图片.表格.条码的区域.程序将通过该分析来确定区域和识别顺序.此信息有助于重建原始 ...

  6. Apache ab并发负载压力测试

    由于现在网站都需要能够承受高并发要求的能力,所以当我们写完代码后,如果需要上线,最好都经过压力测试后,这样比较好 运行: 在Windows系统下,打开cmd命令行窗口,定位到apache安装目录的bi ...

  7. Mdrill:来自阿里的多维快速查询工具

    mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目.旨在帮助用户在几秒到几十秒的时间内,分析百亿级别的任意维度组合的数据.mdrill是一个分布式的在线分析查询系统,基于h ...

  8. eclipse报An error has occurred,See error log for more details. java.lang.NullPointerException错误

    eclipse报An error has occurred,See error log for more details. java.lang.NullPointerException错误,解决办法: ...

  9. @media_screen

    html,body{ margin:0; padding:0; }body{ background:#0f0;} /* @media screen and (min-width: 800px)and( ...

  10. zend studio 13 curl 请求本机地址 无法跟踪调试的问题解决方案。。。(chrome等浏览器调试原理相同)

    方案如下: <?php $ch = curl_init (); curl_setopt ($ch, CURLOPT_URL, 'http://YOUR-SITE.com/your-script. ...