DAO模式 封装的方法
在连接数据库进行操作的时候,便于多次书写繁琐,所以将方法进行封装,然后进行调用,以达到便捷的功能。
DAO模式操作步骤
-
加载驱动
-
连接数据库
-
获取执行sql语句的对象statement
-
执行sql语句
-
(查询)遍历
-
释放资源
封装思路
-
定义一个JDBC工具类(名称自定义)
-
书写第一个方法用来加载驱动并获取连接对象
例如: public static Connection getConnection() throws ClassNotFoundException, SQLException { //加载驱动 Class.forName(driver); //获取连接对象 Connection con = DriverManager.getConnection(url,user,password); //返回连接对象 return con; }
-
书写第二个方法,用来获取执行sql语句的statement对象,这里使用PreparedStatement防止sql注入攻击
例如: public static PreparedStatement getStatement(Connection con,String sql,Object[] sqlParams) throws SQLException { //根据连接对象和sql语句获取statement对象 PreparedStatement ps = con.prepareStatement(sql); //设置参数 if(sqlParams != null && sqlParams.length > 0) { //循环遍历对sql语句里面的空缺参数进行赋值 for (int i = 0; i < sqlParams.length; i++) { ps.setObject(i+1, sqlParams[i]); } } //返回可执行sql语句的对象 return ps; }
-
书写第三个方法,用来进行操作,这里先写了增加、删除、修改的方法
例如: public static int executeUpdate(String sql,Object[] sqlParams) { //声明一个变量,用来保存执行sql之后返回的结果 int rows; //声明数据库需要的对象 Connection con = null; PreparedStatement ps = null; //执行数据库的操作 try { //1.获取连接对象 con = getConnection(); //2.获取可执行sql语句的对象 ps = getStatement(con, sql, sqlParams); //3.执行语句操作 rows = ps.executeUpdate(); //4.返回结果 return rows; } catch (Exception e) { throw new RuntimeException("操作失败!原因:"+e.getMessage(),e); } finally { release(con, ps); } }
-
书写第四个方法,查询方法
例如: public static <T> List<T> executeQuery(String sql,Object[] sqlParams,RowMapper<T> rm){ //声明一个变量,用来保存查询的结果 List<T> list = new ArrayList<>(); //声明数据库查询所需要的对象 Connection con = null; PreparedStatement ps = null; ResultSet rs = null; //执行数据库查询语句 try { //1.连接数据库 con = getConnection(); //2.获取执行sql语句的对象 ps = getStatement(con, sql, sqlParams); //3.执行查询 rs = ps.executeQuery(); //4.处理查询的结果集 while(rs.next()) { //将数据中的一行数据,转换成一个对象 //然后添加到集合中 list.add(rm.mapper(rs)); } } catch (Exception e) { throw new RuntimeException("DAO操作错误!原因:"+e.getMessage(),e); }finally { //释放资源 release(con, ps, rs); } //返回结果 return list; }
-
释放资源,这里我将每个对象分开释放便于理解。
例如: /** * 释放资源 * @param con 连接数据库对象 * @param st 执行sql语句对象 * @param rs 结果集对象 */ private static void release(Connection con,Statement st,ResultSet rs) { closeCon(con); closeSt(st); closeRs(rs); } /** * 释放资源 * @param con 连接数据库对象 * @param st 执行sql语句对象 */ private static void release(Connection con,Statement st) { closeCon(con); closeSt(st); } /** * 关闭连接数据库对象 * @param con */ private static void closeCon(Connection con) { try { if(con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); }finally { con = null; } } /** * 关闭可执行sql语句的对象 * @param con */ private static void closeSt(Statement st) { try { if(st != null) { st.close(); } } catch (SQLException e) { e.printStackTrace(); }finally { st = null; } } /** * 关闭结果集对象 * @param con */ private static void closeRs(ResultSet rs) { try { if(rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally { rs = null; } }
来源:CSDN
作者:weixin_43822525
链接:https://blog.csdn.net/weixin_43822525/article/details/103986979