JDBC第二天

4/13/2018 8:34:04 AM

JDBC02

晨测

1. 写出JDBC的组成和其作用
2. 写出使用jdbc的步骤 
3. 写出封装数据库工具类核心代码

回顾

作用:java应用程序和数据库交互的桥梁
步骤:(记住)
    1. 加载数据库驱动
    2. 获取数据库连接对象
    3. 获取Statement对象,执行sql
    4. 释放资源

static{
    //配置参数的获取
}

getConnection(){
    DriverManager.getConnection()
}

closeRes(){
    resultset.close();
    statement.close();
    connection.close();
}

作业

宠物管理系统

MVC模式:
    Model层:模型层
    View层:视图层
    控制层:    控制层 


准备工作:
    create table animals(
        id int primary key auto_increment,
        num int unique,
        name varchar(20) not null,
        kind varchar(10),
        gender enum('公','母')
    )

    cn.xdl.animalclient
            AnimalClient

    cn.xdl.service
            AnimalService  控制执行流程

    cn.xdl.bean  实体模型类、业务模型类
            Animal 存储宠物信息
            AnimalManager   对宠物进行CRUD操作 

    cn.xdl.utils
            DBUtils
            db_config.properties    

    cn.xdl.view
            AnimalView  

今日概要

一、DAO设计模式
二、DAO设计模式的优化
三、JDBC中的事务,连接池的使用

一、DAO设计模式概述

<1>概念

DAO,Data Access Object ,用于访问数据库的对象。
位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问

<2>作用

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

<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();
            }
        }
    }

作业

使用批处理,同时完成多条SQL语句
完善宠物管理系统
加入DAO设计模式
优化DAO设计模式
加入连接池
使用JDBC事务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值