本文主要内容:实现对数据库中表数据的CRUD操作
1.获取数据库连接与关闭的通用方法
/**
* 操作数据库的工具类
*/
public class JDBCUtils {
/**
* 获取连接
* @return 返回一个连接对象
* @throws Exception 解决可能出现的错误
*/
public static Connection getConnection() throws Exception{
//1. 读取配置文件中的基本信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc2.properties");
Properties pros = new Properties();
if (is != null) {
pros.load(is);
}
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//2. 加载驱动
Class.forName(driverClass);
//3. 获取连接
return DriverManager.getConnection(url, user, password);
}
//关闭连接方法
public static void closeResource(Connection conn, Statement ps) {
try {
if(ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//此重写closeResource()方法加上了对查询操作中结果集资源关闭的操作
public static void closeResource(Connection conn, Statement ps, ResultSet rs) {
try {
if(ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. 数据库表中增删改的通用方法
//通用的增删改操作
public void update(String sql, Object...args){ //sql中占位符的个数与可变形参的长度相同
Connection coon = null;
PreparedStatement ps = null;
try {
//1. 获取数据库连接
coon = JDBCUtils.getConnection();
//2. 预编译sql语句,返回PrepareStatement实例
ps = coon.prepareStatement(sql);
//3. 填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]); //小心参数声明错误
}
//4.执行
ps.execute(); //补充:ps.executeUpdate();是用返回值的execute()返回,返回值为影响的行数,应用于判断用户是否添加成功
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 资源关闭
JDBCUtils.closeResource(coon, ps);
}
}
//测试通用方法
@Test
public void testUpdate1(){
String sql = "delete from student where id = ?";
update(sql, 6); //删除编号为6的学生
}
3.数据库表中查的通用方法
/**
* 针对任意表的通用操作
* 说明:此处的任意表需要定义好对应的具体的JavaBean类,如:Student类
* JavaBean类需要属性声明与数据库具体列名相同,如不相同,需要在sql语句中将查询字段起别名
*/
public class PrepareStatementQuery {
//针对不同表查询一条记录
public <T> T Query(Class<T> clazz, String sql, Object...args){
Connection coon = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
coon = JDBCUtils.getConnection();
ps = coon.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果的元数据:ResultSetMetaData
ResultSetMetaData rsm = rs.getMetaData();
//通过ResultSetMetaData获取结果集的列数
int columnCount = rsm.getColumnCount();
if (rs.next()) {
T t = clazz.getDeclaredConstructor().newInstance();
//处理结果集一行数据的每一个列
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名:getColumnName():只能获得列名,不能获得sql起的别名
//getColumnLabel():在sql有别名的情况下,可以获得别名,无别名的情况下,可以获得原列名
String columnName = rsm.getColumnLabel(i + 1);
//给stu对象指定的columnName对象,复制为columnValue:通过反射
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(coon, ps, rs);
}
return null;
}
//针对不同表查询多条记录
public <T> List<T> MultiplyQuery(Class<T> clazz, String sql, Object...args){
Connection coon = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
coon = JDBCUtils.getConnection();
ps = coon.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果的元数据:ResultSetMetaData
ResultSetMetaData rsm = rs.getMetaData();
//通过ResultSetMetaData获取结果集的列数
int columnCount = rsm.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<>();
while (rs.next()) {
T t = clazz.getDeclaredConstructor().newInstance();
//处理结果集一行数据的每一个列
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名:getColumnName():只能获得列名,不能获得sql起的别名
//getColumnLabel():在sql有别名的情况下,可以获得别名,无别名的情况下,可以获得原列名
String columnName = rsm.getColumnLabel(i + 1);
//给stu对象指定的columnName对象,复制为columnValue:通过反射
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(coon, ps, rs);
}
return null;
}
@Test //测试查询一条记录
public void test(){
String sql = "select id, gender from student where id = ?";
Student stu = Query(Student.class, sql, 7);
System.out.println(stu);
}
@Test //测试查询多条记录
public void test1(){
String sql = "select id, gender from student where id < ?";
List<Student> list = MultiplyQuery(Student.class, sql, 7);
list.forEach(System.out::println);
}
}