关于报错connection holder is null
在练习使用jsp过程中
package com.cjh.dao.impl;
import com.cjh.pojo.User;
import com.cjh.utils.JdbcUtils;
import com.sun.tracing.dtrace.ArgsAttributes;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import sun.net.idn.Punycode;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @Author: huahua
* @Date: 2020-09-02 21:14
*/
public abstract class BaseDao {
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
/**
* update()方法用来执行Insert、Update、Delete语句
*
* @return 返回-1,执行失败,返回其他表示影响的行数
*/
public int update(String sql, Object... args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.update(conn, sql, args);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(conn);
}
return -1;
}
/**
* 查询返回JavaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 返回的sql语句
* @param args sql对应的参数值
* @param <T> 返回的类型的泛型
* @return
*/
public <T> T queryForOne(Class<T> type, String sql, Object... args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn, sql, new BeanHandler<T>(type), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtils.close(conn);
}
return null;
}
/**
* 查询返回多个JavaBean的sql语句
*
* @param type 返回的对象类型
* @param sql 返回的sql语句
* @param args sql对应的参数值
* @param <T> 返回的类型的泛型
* @return
*/
public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn, sql, new BeanListHandler<T>(type), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtils.close(conn);
}
return null;
}
/**
* 执行返回一行一列的sql语句
* @param sql 返回的sql语句
* @param args sql对应的参数值
* @return
*/
public Object queryForSingleValue(String sql, Object... args){
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn, sql,new ScalarHandler(), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
因为我的偷懒我把 Connection conn = JdbcUtils.getConnection();直接写到了
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
Connection conn = JdbcUtils.getConnection();
写到了类的下面,在方法中没有写 Connection conn = JdbcUtils.getConnection();,以至于我在注册的过程中一直报错:java.sql.SQLException: connection holder is null。在以后关于dao层的代码书写过程中,每一个方法都要重新获取连接,最后关闭连接,而不是直接在类中声明,在方法中不声明。方法中的获得连接和释放连接要有始有终。