zoukankan      html  css  js  c++  java
  • 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一、DAO设计模式概述
    ###<1>概念
    DAO,Data Access Object ,用于访问数据库的对象。
    位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问
    ![](1.png)

    ###<2>作用
    隔离了业务层和数据访问层,将两层进行解耦
    隔离了不同数据库的实现
    增强的程序的可移植性和可扩展性

    ![](2.png)

    ###<3>组成
    1. DAO接口(内存插槽的标准):定义操作数据的接口,CRUD
    2. DAO实现类(不同内存条厂商生成的内存条):DAO接口的实现类,完成具体的数据库操作
    3. 实体类:由属性和各种操作属性的方法组成的类,bean类
    4. 数据库连接和关闭的工具类:专门负责数据库操作的类
    5. DAO工厂类:获取一个具体的DAO实现类

    ###<4>实现
    cn.xdl.dao
    AnimalDao
    AnimalDaoImp
    AniamlDaoFactory

    # 二、DAO优化
    提取公共代码
    1. 创建模版类 JDBCTemple
    <1>将增删改方法提取成一个方法:使用可变参数接收补全sql语句的实参
    public void update(String sql,Object...args)
    for()补全SQL语句,可变参数就是一个数组

    <2>将查询的方法提取成一个公共的方法:使用可变参数接收补全sql语句的实参
    public Obejct query(String sql , ResultSetHandler rsh ,Object ...args);
    创建一个接口:ResultSetHandler 动态的封装返回的数据

    2. 使用工具类
    <1>导入第三方工具包:commons.dbutils.jar
    <2>使用QueryRunner 对象实现数据的各种操作
    在封装数据的使用,使用了反射,需要使用new BeanHandler<>(Animal.class)
    new BeanListHandler<>(Animal.class)

    java实体类的属性名一定要个数据表的字段名称一致

    # 三、JDBC中的事务和连接池
    ###<0>批处理
    void addBatch(String sql)
    将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。

    int[] executeBatch()
    将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

    ###<1>事务

    JDBC的Connection接口提供处理事务的方法:
    void setAutoCommmit(boolean isOpen);
    void rollback();
    void commit();

    步骤:
    1. 取消JDBC事务的自动提交
    2. 执行SQL语句
    3. 如果执行成功,提交更改;如果出现错误,则回滚

    实践:
    public void add(Animal animal){
    Connection conn = null;
    PreparedStatement pst = null;
    try{
    //1. 获取数据库连接对象
    conn = DBUtils.getConnection();

    conn.setAutoCommit(false);//手动提交事务

    //2.执行SQL语句
    String insertSQL = "insert animals value(null,?,?,?,?)";// id num name kind sex
    pst = conn.prepareStatement(insertSQL);
    //补全sql语句
    pst.setInt(1, animal.getNum());
    pst.setString(2, animal.getName());
    pst.setString(3, animal.getKind());
    pst.setString(4, animal.getGender());

    //执行sql
    int resultNum = pst.executeUpdate();


    if(resultNum>0){
    System.out.println("add success");
    }else{
    System.out.println("add error");
    }

    int num = 10/0;

    }catch(Exception e){
    e.printStackTrace();
    try {
    //回滚
    conn.rollback();

    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    } finally{
    try {
    //提交
    conn.commit();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    //3.释放资源
    DBUtils.closeRes(conn, pst, null);
    }
    }

    ###<2>连接池
    使用步骤:
    1. 导入工具包
    2. 编写配置文件
    3. 使用连接池的提供的工具实现连接对象的创建或回收

    public class DBUtils2 {
    //申明连接池对象
    private static DataSource ds;//连接池

    static{
    //从配置文件中获取连接池的配置参数
    InputStream is = DBUtils2.class.getClassLoader().getResourceAsStream("dbcp.properties");

    Properties pro = new Properties();

    try {
    //将连接池的配置参数封装到属性对象中
    pro.load(is);
    //使用第三方的工具,根据配置文件中的配置参数,创建连接池
    ds = BasicDataSourceFactory.createDataSource(pro);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    public static Connection getConnection() throws SQLException{
    //从连接池中获取连接
    return ds.getConnection();
    }

    // 将连接对象返回到连接池中
    public static void closeRes(Connection conn, Statement st, ResultSet rs) {
    try {
    if (rs != null)
    rs.close();
    if (st != null)
    st.close();
    if (conn != null)
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

    不忘初心,方得始终! 坚持!坚持!坚持!!
  • 相关阅读:
    [unity3d程序] 纹理扩散
    深入浅出SharePoint——自定义带ECB列
    深入浅出TFS——工作区Workspace
    深入浅出SharePoint——部署WSP
    深入浅出SharePoint——批处理高效导入数据
    深入浅出SharePoint——Log4net应用
    遍历文件夹及文件
    深入浅出SharePoint——使用CAML定制View
    拷贝文件到另一台电脑
    深入浅出SharePoint——在自定义表单中使用上传附件控件
  • 原文地址:https://www.cnblogs.com/sumboy/p/9058629.html
Copyright © 2011-2022 走看看