使用JDBC访问数据库的工具类
包括:
- 得到数据库连接对象
- 关闭连接资源
- 通用的增删改的方法
- 通用的查询方法
package com.cf.utils;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 访问数据库的工具类
*/
public class JdbcUtils {
//可以把几个字符串定义成常量:用户名,密码,URL,驱动类
private static final String USER = "root";
private static final String PWD = "root";
private static final String URL = "jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true";
private static final String DRIVER = "com.mysql.jdbc.Driver";
/**
* 注册驱动,为了兼容1.5以前的版本
*/
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 得到数据库的连接
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PWD);
}
/**
* 关闭连接
* 查询调用这个方法
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 关闭连接
* 增删改没有结果集
*/
public static void close(Connection connection, Statement statement) {
//直接调用上面的方法
close(connection, statement, null);
}
/**
* 通用的增删改的方法
* @param sql 要执行的SQL语句
* @param params 替换占位符的真实地址,在方法内部是一个数组(从0开始)
* @return 影响的行数
*/
public static int update(String sql, Object... params) {
Connection connection = null;
PreparedStatement ps = null;
int row = 0; //影响的行数
try {
//1.创建连接对象
connection = getConnection();
//2.创建预编译的语句对象
ps = connection.prepareStatement(sql);
//2.5 得到参数元数据
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount(); //获取有几个参数
//3.替换占位符为真实的值
for (int i = 0; i < count; i++) {
ps.setObject(i + 1, params[i]); //一定是个对象类型
}
//4.执行SQL语句
row = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(connection, ps); //调用自己的方法
}
return row;
}
/**
* 通用的查询方法
* @param sql 要执行的SQL语句
* @param clazz 要实例化的类型,如:Student.class, Employee.class
* @param params 替换占位符的真实值
* @return 封装好的集合对象
*/
public static <T> List<T> query (String sql, Class<T> clazz, Object...params) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
List<T> list = new ArrayList<>();
try {
//1.创建连接对象
connection = getConnection();
//2. 创建预编译的语句对象
ps = connection.prepareStatement(sql);
//2.5 得到参数元数据
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount(); //获取有几个参数
//3.替换占位符为真实的值
for (int i = 0; i < count; i++) {
ps.setObject(i + 1, params[i]); //一定是个对象类型
}
//4.执行查询操作
resultSet = ps.executeQuery();
//5.遍历整个结果集,封装到集合中,每个元素是一个对象
while(resultSet.next()) {
//每条记录封装成一个对象,创建一个对象
T obj = clazz.getConstructor().newInstance();
//先得到实体类中有哪些属性
Field[] fields = clazz.getDeclaredFields(); //得到所有成员变量,包含私有的
//遍历每个成员变量,进行赋值
for (Field field : fields) {
//私有的要暴力
field.setAccessible(true);
//列名=属性名
String name = field.getName();
//要赋值的对象,值
field.set(obj, resultSet.getObject(name)); //从结果集中获取数据
}
//6.添加到集合中
list.add(obj);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
//关闭资源
close(connection, ps, resultSet);
}
return list;
}
}
参数说明:
说明1: 关于URL 中的generateSimpleParameterMetadata=true
解释: MySQL驱动对参数元数据的数据类型支持不理想,需要如此配置才能得到参数的MySQL数据类型,而且只能得到VARCHAR类型,如果不配置这个参数则会出现异常.
说明2: 关于参数列表中Object... params
解释: 可变形参,jdk1.5引入,在方法内部是一个数组(从0开始)