package com.steven.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
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.steven.dbc.DatabaseConnection;
/**
* DAO数据操作的辅助类
*
* @author Steven
*
*/
public class DaoHandle {
private static Connection con;
private static PreparedStatement pstmt;
private static ResultSet rs;
/**
* 执行所有的DML操作
*
* @param sql
* @param parameters
* @return
*/
public static int executeDML(String sql, Object[] parameters) {
int count = -1;
// 获取连接
con = DatabaseConnection.getConnection();
if (con != null) {
try {
// 获取处理器对象
pstmt = con.prepareStatement(sql);
// 注入参数
for (int i = 0; i < parameters.length; i++) {
// 根据参数的类型判断调用注入方法
// 参数类型不安全
pstmt.setObject(i + 1, parameters[i]);
}
// 执行SQL语句
count = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DatabaseConnection.closeAll(con, pstmt, null);
}
}
return count;
}
/**
* 查询获取单个对象
*
* @param <T>
* @param sql
* @param paramters
* @param objClass
* @return
*/
public static <T> T executeQueryForSingle(String sql, Object[] parameters,
Class<T> objClass) {
T t = null;
// 获取连接
con = DatabaseConnection.getConnection();
if (con != null) {
try {
// 获取处理器
pstmt = con.prepareStatement(sql);
// 注入参数
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
pstmt.setObject(i + 1, parameters[i]);
}
}
// 执行查询
rs = pstmt.executeQuery();
// 获取结果集的元数据
ResultSetMetaData metaData = rs.getMetaData();
// 获取所有列名
String[] colNames = getColNames(metaData);
// 获取所有列的数据类型
// int[] colTypes = getColTypes(metaData);
// 使用反射获取当前类的方法
Method[] methods = objClass.getDeclaredMethods();
// 获取结果集的数据
while (rs.next()) {
// 获取类的实例
t = objClass.newInstance();
// 循环判断每列的数据类型
for (int i = 0; i < colNames.length; i++) {
// 获取每列的结果
Object value = null;
// 进行所有参数类型的赋值,不能保证类型安全
value = rs.getObject(i + 1);
// 遍历每个方法
for (Method m : methods) {
if (value != null) {
// 如果是和该列同名的set方法,则调用该方法
if (m.getName().equalsIgnoreCase(
"set" + colNames[i])) {
// 进行对set方法的调用,向其中置值
m.invoke(t, value);
}
}
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DatabaseConnection.closeAll(con, pstmt, rs);
}
}
// 返回对象
return t;
}
/**
* 通过元数据获取列名数组
*
* @param metaData
* @return
*/
private static String[] getColNames(ResultSetMetaData metaData) {
String[] colNames = null;
try {
// 获取结果集的列数
int colCount = metaData.getColumnCount();
// 创建数组
colNames = new String[metaData.getColumnCount()];
// 遍历每列
for (int i = 1; i <= colCount; i++) {
// 获取列名
colNames[i - 1] = metaData.getColumnLabel(i);
}
} catch (SQLException e) {
e.printStackTrace();
}
return colNames;
}
/**
* 根据元数据获取所有列的数据类型
*
* @param metaData
* @return
*/
private static int[] getColTypes(ResultSetMetaData metaData) {
int[] colNames = null;
try {
// 获取列数
int colCount = metaData.getColumnCount();
// 创建数组
colNames = new int[colCount];
for (int i = 1; i <= colCount; i++) {
// colNames[i-1] = metaData.getColumnTypeName(i);
colNames[i - 1] = metaData.getColumnType(i);
}
} catch (SQLException e) {
e.printStackTrace();
}
return colNames;
}
/**
* 查询多行对象
*
* @param <T>
* @param sql
* @param paramters
* @param objClass
* @return
*/
public static <T> List<T> executeQueryForMultiple(String sql,
Object[] parameters, Class<T> objClass) {
List<T> list = new ArrayList<T>();
// 获取连接
con = DatabaseConnection.getConnection();
if (con != null) {
try {
// 获取处理器
pstmt = con.prepareStatement(sql);
if (parameters != null) {
// 注入参数
for (int i = 0; i < parameters.length; i++) {
pstmt.setObject(i + 1, parameters[i]);
}
}
// 执行查询
rs = pstmt.executeQuery();
// 获取结果集的元数据
ResultSetMetaData metaData = rs.getMetaData();
// 获取所有列名
String[] colNames = getColNames(metaData);
// 获取所有列的数据类型
// int[] colTypes = getColTypes(metaData);
// 使用反射获取当前类的方法
Method[] methods = objClass.getDeclaredMethods();
// 获取结果集的数据
while (rs.next()) {
T t = null;
// 获取类的实例
t = objClass.newInstance();
// 循环判断每列的数据类型
for (int i = 0; i < colNames.length; i++) {
// 获取每列的结果
Object value = null;
// 进行所有参数类型的赋值,不能保证类型安全
value = rs.getObject(i + 1);
// 遍历每个方法
for (Method m : methods) {
if (value != null) {
// 如果是和该列同名的set方法,则调用该方法
if (m.getName().equalsIgnoreCase(
"set" + colNames[i])) {
// 进行对set方法的调用,向其中置值
m.invoke(t, value);
}
}
}
}
// 向集合中添加数据
list.add(t);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
DatabaseConnection.closeAll(con, pstmt, rs);
}
}
// 返回集合
return list;
}
/**
* 返回数据表中数据的条数
*
* @param sql
* @param paramters
* @return
*/
public static int executeQueryForCount(String sql, Object[] parameters) {
int count = 0;
// 获取连接
con = DatabaseConnection.getConnection();
try {
// 获取处理器
pstmt = con.prepareStatement(sql);
if (parameters != null) {
// 注入参数
for (int i = 0; i < parameters.length; i++) {
pstmt.setObject(i + 1, parameters[i]);
}
}
// 执行查询
rs = pstmt.executeQuery();
// 遍历查找的结果集
while (rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DatabaseConnection.closeAll(con, pstmt, rs);
}
return count;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
JDBC轻量型封装实例
共24个文件
java:8个
class:8个
sql:2个
4星 · 超过85%的资源 需积分: 10 72 下载量 38 浏览量
2013-12-22
16:22:43
上传
评论
收藏 689KB ZIP 举报
温馨提示
本资源属于基本的JDBC操纵数据库增删改查代码的轻量型封装的实现,具体的使用过程大家可以参照以下博文的讲解: http://blog.csdn.net/songdeitao/article/details/17484635
资源推荐
资源详情
资源评论
收起资源包目录
JDBC.zip (24个子文件)
JDBC
bin
mysql.sql 354B
jdbc.properties 106B
com
steven
dbc
DatabaseConnection.class 3KB
dao
iface
IUserDao.class 253B
IBaseDao.class 423B
impl
UserDao.class 3KB
test
CRUDTest.class 2KB
entity
User.class 2KB
util
PropertiesLoad.class 3KB
DaoHandle.class 7KB
mysql-connector-java-5.1.7-bin.jar 693KB
.settings
org.eclipse.jdt.core.prefs 629B
src
mysql.sql 354B
jdbc.properties 106B
com
steven
dbc
DatabaseConnection.java 2KB
dao
iface
IBaseDao.java 656B
IUserDao.java 124B
impl
UserDao.java 2KB
test
CRUDTest.java 2KB
entity
User.java 1KB
util
PropertiesLoad.java 5KB
DaoHandle.java 7KB
.project 380B
.classpath 374B
共 24 条
- 1
资源评论
- 欧阳-赤子之心2017-11-27不错,对我的学习有帮助
- jackming222014-04-02适合初学者
行走木马
- 粉丝: 51
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功