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