package com.hd.dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
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.List;
import com.Jdbc.Tool.DbTool;
import com.hd.bean.JavaBean;
/**
* 增删查改实现
*
* @author 2017
*
*/
public class basedao {
/**
* 查询query
*
* @param <T>
*
* @param sql
* @param params
* @return
*/
// TODO 查询
public static <T> List<T> query(String sql, Class<T> cls, Object... params) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
try {
// 获取链接通道
conn = DbTool.getConnection();
// 到取sql语句到数据库中 获取到执行对象ps
ps = conn.prepareStatement(sql);
// 判断?是否为null
if (params != null) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
// 执行sql语句
rs = ps.executeQuery();
// 遍历ResultSet集合
while (rs.next()) {
// 获取数据库集合对象
ResultSetMetaData meta = rs.getMetaData();
// 获取集合的所有列数
int columnCount = meta.getColumnCount();
// class对应的对象中必须有一个无参构造函数对象
T obj = cls.newInstance();
// 循环取出每一列的数据
for (int i = 0; i < columnCount; i++) {
// 根据列数获取每一列对应的名称(必须是小写)
String columnName = meta.getColumnName(i + 1).toLowerCase();
// 根据每一列的对应名称获取value值
Object value = rs.getObject(columnName);
if (value == null) {
continue;
}
// hasFile()来判断Javabean中的成员属性是否匹配oracle中的
if (hasFile(cls, columnName)) {
// 获取当前对象中的列所对应的---成员属性对象
Field member = cls.getDeclaredField(columnName);
// 设置成员属性的可访问
member.setAccessible(true);
// 由于jdbc是用BigDecimal类型接受数据的
// 和javaBean的int类型不匹配,所有需要转型
// 判断value 值是否属于BigDecimal类型
if (value instanceof BigDecimal) {
// 如果属于BigDecimal类型的则强转为BigDecimal
BigDecimal valueB = (BigDecimal) value;
// 判断接受数据的成员属性是否是int类型的数据
if (member.getType().getName().equals("int")) {
// 将整形数据赋值给成员
member.set(obj, valueB.intValue());
} else {
// 将小数类型赋给成员
member.set(obj, valueB.doubleValue());
}
} else {
// 用成员属性对象把获取到的数据保存起来
member.set(obj, value);
}
}
}
list.add(obj);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
DbTool.close(conn, ps, rs);
}
return null;
}
/**
* 判断javaBean中的成员属性是否和 列数获取每一列对应的名称相同,相同则添加数据
*
* @param cls
* @param columnName
* @return
*/
// TODO 判断成员属性
private static <T> Boolean hasFile(Class<T> cls, String columnName) {
// 获取对象中所有的成员属性对象
Field[] declaredFields = cls.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getName().equals(columnName)) {
return true;
}
}
return false;
}
/**
* 更新
*
* @param <T>
*
* @param sql
* @param params
*/
// TODO 更新
public static <T> void Update(String sql,Object... params) {
Connection conn = null;
PreparedStatement ps = null;
try {
// 获取链接通道
conn = DbTool.getConnection();
if (sql != null) {
// 到取sql语句到数据库中 获取到执行对象ps
ps = conn.prepareStatement(sql);
if (params != null) {
for (int s = 0; s < params.length; s++) {
ps.setObject(s + 1, params[s]);
}
}
int len = ps.executeUpdate();
System.out.println("改变的行数为" + len + "行");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DbTool.close(conn, ps);
}
}
/**
* 增加insert
*
* @param <T>
*/
// TODO 增加
public static <T> void insert(String sql,Object... params) {
// 为释放资源准备
Connection conn = null;
PreparedStatement ps = null;
try {
// 获取连接通道对象
conn = DbTool.getConnection();
// 执行sql语句
ps = conn.prepareStatement(sql);
// 把params拼接入sql语句
if (params != null) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
// 用JavaBean获取数据
int indexOf = sql.indexOf("(");
System.out.println(indexOf);
int len = ps.executeUpdate();
System.out.println("改变的行数为" + len + "行");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
DbTool.close(conn, ps);
}
}
/**
* 删除delete
*/
//TODO 删除delete
public static <T> void delete(String sql,Object... params) {
// 为释放资源准备
Connection conn = null;
PreparedStatement ps = null;
try {
// 获取连接通道对象
conn = DbTool.getConnection();
// 执行sql语句
ps = conn.prepareStatement(sql);
// 把params拼接入sql语句
if (params != null) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
// 用JavaBean获取数据
int len = ps.executeUpdate();
System.out.println("改变的行数为" + len + "行");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
DbTool.close(conn, ps);
}
}
}