java连接数据库工具类_java连接数据库JDBC工具类,Java连接数据库通用增删改查

import java.io.InputStream;

import java.lang.reflect.Field;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

import org.apache.log4j.Logger;

/**

* 数据库连接JDBC工具类

*

* @author key

*

*/

public class JDBCUtil {

// 私有构造

private JDBCUtil() {

}

private static String URL = null;//

private static String USERNAME = null;

private static String PASSWORD = null;

private static Connection conn = null;// 连接对象

private static PreparedStatement ps = null;// 执行对象

private static ResultSet rs = null;// 数据库查询结果集

private static ResultSetMetaData rsd = null;// 保存结果集中列的信息

private static Logger log = Logger.getLogger(JDBCUtil.class);

// 静态块,类加载是只执行一次

static {

try {

// 创建输出流对象

InputStream is = JDBCUtil.class

.getResourceAsStream("/mysql.properties");

// 获取properties对象

Properties pts = new Properties();

// 加载配置文件

pts.load(is);

Class.forName(pts.getProperty("forName"));

URL = pts.getProperty("url");

USERNAME = pts.getProperty("user");

PASSWORD = pts.getProperty("password");

} catch (Exception e) {

System.out.println("数据库连接失败!");

e.printStackTrace();

}

}

// static 静态修饰可以不用new也可以获取方法

/**

* @return 数据库连接对象

*/

public static Connection getConnection() {

try {

conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 数据库连接对象

} catch (SQLException e) {

e.printStackTrace();

}

return conn;

}

/**

* 关闭数据库

*

* @param conn

* 连接数据库对象

* @param stat

* 执行对象

*/

public static void Close(Connection conn, Statement stat) {

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

}

}

if (stat != null) {

try {

stat.close();

} catch (SQLException e) {

}

}

}

/**

* 关闭数据库

*

* @param conn

* 数据库连接对象

* @param stat

* 执行者对象

* @param rst

* 查询结果集对象

*/

public static void Close(Connection conn, Statement stat, ResultSet rst) {

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

}

}

if (stat != null) {

try {

stat.close();

} catch (SQLException e) {

}

}

if (rst != null) {

try {

rst.close();

} catch (SQLException e) {

}

}

}

/**

* 通用增删改

*

* @param sql

* 数据库预编译语句

* @param param

* 预编译语句参数

* @return 受影响行数

*/

public static int executeUpdate(String sql, Object[] param) {

Connection conn = getConnection();

ps = null;

int count = 0;

try {

ps = conn.prepareStatement(sql);

setParameter(param);

count = ps.executeUpdate();

} catch (SQLException e) {

log.error(e);

} finally {

Close(conn, ps);

}

return count;

}

/**

* 将数据库中获取的列名格式,以下划线命名的格式转换为Java属性名格式的小驼峰命名的格式

* @param str 以“_”分割出来的str字符串数组

* @return 小驼峰命名格式的字符串

*/

public static String columnFormat(String[] str){

// 定义一个字符串类型的fieldName用来保存转换过的字段名

String fieldName = "";

// 循环这个数组中的字符串(以“_”分割出来的单词),转成java中的属性名(小驼峰命名法),第一个单词不用首字母不用大写,之后的每个单词首字母大写

for (int j = 0; j < str.length; j++) {

// 判断,如果不是第一个那就字符串截取,截取首字母把他转成大写,再拼接起来

if (j != 0) {

str[j] = str[j].substring(0, 1).toUpperCase()

+ str[j].substring(1);

}

// 拼接起来保存到这个变量中,就是类中的属性名(注意这里的必须要保证数据库和java属性名之间的转换规范,把mysql中的字段名转成属性名是见了“_”就去掉“_”然后首字母大写)

fieldName += str[j];

}

return fieldName;

}

/**

* 数据库通用查询

*

* @param sql

* 语句

* @param param

* 语句参数

* @param clz

* 类对象

* @return 对象数组

*/

public static List executeQuery(String sql, Object[] param,

Class clz) {

List list = new ArrayList();// 保存查询的数据库中的对象

Object obj = null;// 声明Object类型的变量,用来引用class对象

try {

// 数据库查询

conn = getConnection();

ps = conn.prepareStatement(sql);

setParameter(param);

// 获取查询结果集

rs = ps.executeQuery();

// 获取结果集中的列信息

rsd = rs.getMetaData();

// 知道列的数量

int columnCount = rsd.getColumnCount();

// 查询行

while (rs.next()) {

obj = clz.newInstance();// 实例化传入的class对象

// 获取列名和值

for (int i = 1; i <= columnCount; i++) {

// 把获取到的字段名全部先转成小写

// 把以“_”分割出来的字符保存到str字符串数组中(因为mysql中的字段名每个单词之间用“_”分割),分割出每个单词

String[] str = rsd.getColumnName(i).toLowerCase()

.split("_");

// 定义一个字符串类型的fieldName用来保存转换过的字段名

String fieldName = columnFormat(str);

// 根据列名获取类对象中的成员变量

Field filed = clz.getDeclaredField(fieldName);

// 如果类对象中的成员变量是用private修饰的,则必须将此改为true,否则报错

filed.setAccessible(true);

String columnName = rsd.getColumnName(i); // 根据获取的列信息获取列名

Object value = rs.getObject(columnName);// 根据列名获取值

// 设置类中的成员变量的值

filed.set(obj, value);

}

// 将对象添加至数组中

list.add(obj);

}

} catch (SQLException e) {

log.error(e);

} catch (NoSuchFieldException e) {

log.error(e);

} catch (SecurityException e) {

log.error(e);

} catch (IllegalArgumentException e) {

log.error(e);

} catch (IllegalAccessException e) {

log.error(e);

} catch (InstantiationException e) {

log.error(e);

} finally {

Close(conn, ps, rs);

}

return list;

}

/**

* 预编译语句参数设置

*

* @param param

* 参数数组

* @throws SQLException

* 预编译语句参数设置异常

*/

public static void setParameter(Object[] param) throws SQLException {

for (int i = 1; i <= param.length; i++) {

ps.setObject(i, param[i - 1]);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值