sql语句分类
SQL语句可以分为DQL和非DQL两种;
- 非DQL(增、删、改): 返回int类型值
- DQL(查):返回一个list集合
代码
package com.utils;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 封装dao数据库重复代码!
*
* todo:
* 封装两个方法:简化DQL、非简化DQL
*/
public abstract class BaseDao {
/**
* 封装简化非DQL语句
* @param sql 带占位符的SQL语句
* @param params 占位符的值
* @return 受影响行数
*/
public int executeUpdate(String sql, Object... params) throws Exception {
Connection connection = JdbcUtilsV2.getConnection();
PreparedStatement statement = connection.prepareStatement(sql);
for (int i = 1; i <= params.length; i++) {
statement.setObject(i, params[i-1]);
}
int rows = statement.executeUpdate();
statement.close();
// 是否关闭连接要看是否开启了事务,如果事务为true 则表示未开启 关闭即可 否则不用管
if (connection.getAutoCommit()) {
JdbcUtilsV2.freeConnection();
}
return rows;
}
/**
* 封装DQL语句 查询结果可能有一条或者多条数据,而记录会映射成具体的实体类,然后这这些实体类放进一个List中返回
* 记录映射成具体的实体类时需要用到反射技术,给对应的字段赋值,因为实体类不确定,所以需要设计泛型方法,
* 参数需要具体的实体类、sql语句、占位符对应的值
* @param clazz 具体的实体类
* @param sql sql语句
* @param params 占位符对应的值
* @param <T> 泛型
* @return List<T>
*/
public <T> List<T> executeUpdate(Class<T> clazz, String sql, Object... params) throws SQLException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Connection connection = JdbcUtilsV2.getConnection();
PreparedStatement statement = connection.prepareStatement(sql);
if (params != null && params.length != 0){
for (int i = 1; i <= params.length; i++) {
statement.setObject(i, params[i-1]);
}
}
ResultSet resultSet = statement.executeQuery();
ArrayList<T> list = new ArrayList<>();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while (resultSet.next()){
T t = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {
String key = metaData.getColumnLabel(i);
Object value = resultSet.getObject(i);
// 使用反射给对象赋值
Field field = clazz.getDeclaredField(key);
// 属性可以是私有的
field.setAccessible(true);
field.set(t, value);
}
list.add(t);
}
resultSet.close();
statement.close();
if (connection.getAutoCommit()){
JdbcUtilsV2.freeConnection();
}
return list;
}
}