DAO模式封装

一世执手 提交于 2020-01-22 07:28:24

DAO模式 封装的方法

在连接数据库进行操作的时候,便于多次书写繁琐,所以将方法进行封装,然后进行调用,以达到便捷的功能。

DAO模式操作步骤

  1. 加载驱动

  2. 连接数据库

  3. 获取执行sql语句的对象statement

  4. 执行sql语句

  5. (查询)遍历

  6. 释放资源

封装思路

  1. 定义一个JDBC工具类(名称自定义)

  2. 书写第一个方法用来加载驱动并获取连接对象

     例如:
     public static Connection getConnection() throws ClassNotFoundException, SQLException {
     	//加载驱动
     	Class.forName(driver);
     	//获取连接对象
     	Connection con = DriverManager.getConnection(url,user,password);
     	//返回连接对象
     	return con;
     }
    
  3. 书写第二个方法,用来获取执行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;
     }
    
  4. 书写第三个方法,用来进行操作,这里先写了增加、删除、修改的方法

     例如:
     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);
     	}
     	
     }
    
  5. 书写第四个方法,查询方法

     例如:
     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;
     }
    
  6. 释放资源,这里我将每个对象分开释放便于理解。

     例如:
     /**
      * 释放资源
      * @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;
     	}
     }
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!