在练习使用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层的代码书写过程中,每一个方法都要重新获取连接,最后关闭连接,而不是直接在类中声明,在方法中不声明。方法中的获得连接和释放连接要有始有终。