模仿DBUtils, 完成增删改的功能
public class MyQueryRunner {
private DataSource dataSource;
public MyQueryRunner(DataSource dataSource) {
this.dataSource = dataSource;
}
public int update(String sql,Object... params) throws SQLException {
//执行sql语句
//1. 获得连接
Connection conn = this.prepareConnection();
//2. 预编译sql语句
PreparedStatement pstm = this.prepareSql(sql, conn);
//3. 填充占位符处的参数
this.fillStatement(pstm,params);
//4. 执行sql语句
int rows = pstm.executeUpdate();
//5. 关闭资源
pstm.close();
conn.close();
return rows;
}
private void fillStatement(PreparedStatement pstm, Object... params) throws SQLException {
//1. 判断sql语句的参数个数和传入的参数个数是否一致
//获取参数元数据
ParameterMetaData parameterMetaData = pstm.getParameterMetaData();
//使用参数元数据获取sql语句的参数个数
int parameterCount = parameterMetaData.getParameterCount();
int paramsCount = params.length;
if (parameterCount != paramsCount) {
//说明参数个数有误
throw new RuntimeException("你传入的参数个数有误,期望是:"+parameterCount+",但是你给了:"+paramsCount);
}
//开始遍历设置参数
for(int i=0;i<parameterCount;i++){
pstm.setObject(i+1,params[i]);
}
}
/**
* 预编译sql语句
*/
private PreparedStatement prepareSql(String sql, Connection conn) throws SQLException {
if(conn == null){
//如果连接为空
throw new RuntimeException("执行SQL语句的连接不能为空");
}
return conn.prepareStatement(sql);
}
private Connection prepareConnection() throws SQLException {
if (this.dataSource == null) {
//如果没有连接池则报错
throw new RuntimeException("需要一个连接池来获取连接执行SQL语句!!!");
}
return dataSource.getConnection();
}
/**
* 查询到多条数据封装到List<T>
*/
public <T> List<T> queryList(String sql, Class<T> clazz, Object... params) throws Exception {
//1. 获取连接对象
Connection conn = this.prepareConnection();
//2. 预编译SQL语句
PreparedStatement pstm = this.prepareSql(sql, conn);
//3. 设置参数
this.fillStatement(pstm,params);
//4. 执行SQL语句
ResultSet rst = pstm.executeQuery();
//获取结果集元数据
ResultSetMetaData rstMetaData = rst.getMetaData();
//获取结果集的列数
int columnCount = rstMetaData.getColumnCount();
//1. 获取POJO中的所有方法
Method[] methods = clazz.getMethods();
//声明一个集合存储t
List<T> tList = new ArrayList<>();
while (rst.next()) {
//创建出封装数据的POJO对象
T t = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {
//获取每列的名字(字段名)
String columnName = rstMetaData.getColumnName(i);
//1. 获取每一行数据的各个字段的数据
Object columnValue = rst.getObject(columnName);
//2. 调用对象的对应的set方法,往对象中设置数据
//遍历出POJO的每一个方法
for (Method method : methods) {
//获取方法名
String methodName = method.getName();
//匹配方法名
if (methodName.equalsIgnoreCase("set"+columnName)) {
//说明匹配到了对应的set方法,那么就调用这个set方法,设置columnValue
method.invoke(t,columnValue);
}
}
}
tList.add(t);
}
//关闭资源
rst.close();
pstm.close();
connection.close();
return tList;
}
}