A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 巴拉巴拉x 初级黑马   /  2018-5-21 09:53  /  492 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 巴拉巴拉x 于 2018-5-21 10:12 编辑

JDBC

JDBC的概述

  • 什么是JDBC?
    • Java Data Base Connectivity:java数据库连接.
  • 什么是数据库的驱动
    • 驱动:两个设备(两个应用)之间通信的桥梁.
  • 为什么学习JDBC
    • JDBC就是一组java的接口,提供了驱动规范,各个数据库来实现这个接口,程序员就只学一组API就可以了.

JDBC的入门

  • 环境准备
    • 创建数据库和表
    • 数据库的驱动都是以一个jar包的形式提供的.

JDBC的开发步骤注意导入的sql类.

  • 加载驱动
    • Class.forName("com.mysql.jdbc.Driver");
  • 获得连接
    • Connection conn = DriverManager.getConnection(url,user.password);
    • url--->jdbc:mysql://localhost:3306/数据库.
  • 基本操作
    • Statement statement = conn.createStatement();
    • String sql = "sql语句"
    • ResultSet rs = statement.executeQuery(sql);
    • while(rs.next()){ 获取里面的内容.表里面的内容. }
  • 释放资源
    • rc.close();
    • statement.close();
    • conn.close();

JUnit 测试 来代替main方法入口.JDBC之DriverManager:驱动管理类

  • 驱动管理类
    • 作用:
      • 注册驱动
        • API中有个方法,但是实际开发中一般不会使用这个方法完成驱动注册,在Driver类中有个静态代码块已经注册了一次了,要是再调用方法的话就会重复注册.
        • Class.forName("com.mysql.jdbc.Driver");
      • 获得连接
        • 方法: getConnection(url,user,password)
        • 注意url的写法:jdbc:mysql://localhost:3306/web_test3
        • jdbc:连接数据库的协议
        • mysql:是jdbc的子协议
        • localhost:连接的MySQL数据库服务器的主机地址(连接本机就可以写成localhost),吐过连接的不是本机的,就需要协商连接主机的IP地址
        • 3306:MySQL数据库服务器的端口号
        • web_test3:数据库名称
        • 如果连接的是本机的路径,可以省略localhost:3306.但是/不能省略.\



Java API之Connection

  • 与数据库连接对象
  • 作用
    • 创建执行SQL语句的对象
      • createStatement();返回的是Statement对象,执行SQL语句.
      • prepaerCall();返回的是CallableStatement对象:执行数据库中的存储过程
      • prepareStatement();返回的是PreparedStatement对象,执行SQL的预处理,用来处理SQL的注入漏洞.
    • 管理事务.
      • commit();提交事务的方法
      • rollbacke();回滚事务
      • 停止自动提交的方法.


Java API之Statement

  • 执行SQL语句
    • boolean execute(Stirng sql);
      • 执行查询,修改,添加,删除.
    • ResultSet executeQuery(String sql);
      • 只执行查询(即select语句)
    • int executeUpdate(String sql)
      • 执行修改,添加,删除的sql语句.

  • 执行批处理
    • addBatch();
    • clearBatch();
    • executeBatch();

ResultSet

  • 通过select语句查询的结果才有结果集.就是把查询结果的一个表格,封装成了一个对象.
  • 遍历结果集,用next()方法.用while循环来遍历.
    • next方法返回的是boolean类型的一个值,有下一个数据就返回true,没有则返回false.
  • 表中每个字段都有对应的get方法来获取.getXXX(),有两个重载方法,一个传入一个int类型的参数,一个传入一个String类型的参数.一般使用String参数的,因为列号不确定,String参数传的是字段名,int传的是列所在的位置是第几列.还要一个getObject()方法,可以获取任意类型的结果.
  • 如果传入的参数是String类型的话,在查询语句中有时候会给字段取个别名,那就用别名来作为参数传入方法中.
JDBC的资源释放

  • JDBC 程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet, Statement,Connection
  • Connection对象是非常稀有的(因为他的创建非常占用资源),这个对象一定要做到尽量晚创建,尽早释放掉.因为有个最大值限制,


JDBC的事务环境准备

  • 事务的概念
    • 事务指的是逻辑上的一组操作,组成这组操作各个逻辑单元要么全都成功,要么全都失败

  • 创建数据库
    • create database 数据库名;
    • use 数据库名
    • create table 表名(字段1 字段类型(长度) 约束,字段2 字段类型(长度) 约束);
    • insert into 表名 (字段1,字段2) values(值1,值2);
    • 多条记录就多个命令,不能在后面加逗号,继续加
    • 在doc窗口下的doc命令: start transaction:开启事务.
    • 在java中,事务提交是默认开启的,改为手动提交就认为开启事务了.
    • 事务开启就是在缓存中保存数据,事务提交就是把数据持久化存入硬盘中.
    • setAutoCommit(),吐过参数为true,则自动提交,一个SQL语句提交一次.

  • 事务操作的三个核心操作步骤
    • 开启事务
    • 提交事务
    • 回滚事务
  • 事务管理的核心的思想
    • 业务逻辑的操作要使用同一个Connection对象.


连接池

  • 连接池的概述
    • 什么是连接池
      • 连接池是装有连接的容器,使用连接的话,可以从连接池中进行获取,使用完成之后将连接归还给连接池.

    • 为什么要学习连接池
      • 连接对象创建和销毁需要耗费时间的,在服务器初始化的时候就初始化一些连接.把这些连接放入到内存中,使用的时候直接从连接池中获取,使用完毕就送还回去.


  • 连接池的类
    • DataSource是一个接口
    • 编写一个类,实现上边的接口
    • 重写getConnection方法
    • 初始化多个连接在内存中



自定义连接池的问题及解决分析

  • 问题
    • 使用接口的实现类完成的构造
      • 这种方法不利于程序的扩展

    • 自定义了额外的方法归还连接
      • 增加了使用连接池的用户的使用难度


  • 自定义连接池的解决
    • 尽量不提供自定义的方法解决问题.但是要如何解决这个问题
    • 原来在Connection中有一个close()方法,close()方法完成了连接的销毁,能不能做一个事情,将原有的连接的close()方法改为归还.
    • 现在要做的事情就是将原有的close()方法的逻辑改为归还,(增强一个类中方法)
    • 如何增强一个类中方法
      • 采用继承的方式
        • 这种增强是最简单的,但是有使用条件:必须能够控制这个类的构造!!

      • 采用装饰着模式
        • 全是多态
        • 就是包装..
        • 也有使用条件,
          • 增强的类和被增强的类要实现相同的接口..
          • 在我们的增强类中要获得被增强的类的引用
            • 引用就是对象


        • 为了简化编程,提供一个模板类(模板类原封不动地调用原有方法),然后写一个类继承这个模板,重写需要增强的方法.

      • 动态代理的方式
        • 以后介绍...-_-!!


    • 面向接口编程 就要注意Java的三个特性,封装,多态,继承,面向接口编程就是运用了多态


开源连接池的使用

  • 数据库连接池只关注数据库连接,其他的不管,也管不了

Druid开源连接池,

  • 阿里巴巴旗下的,使用简单,可以与Spring很好的结合
  • 使用前提
    • 先引入驱动包
    • 再引入Druid的jar包
    • DruidDataSourse核心的类

  • 使用
    • 手动设置属性
    • 使用配置方式


C3P0开源连接池的使用

  • 实现了数据源和JNDI绑定.
  • 使用方式
    • 手动设置参数方式
    • 配置文件设置参数方式
      • 核心类:ComboPooledDataSource:
      • 配置文件要放在src目录下,包外面,且名字是固定的:c3p0-config.xml




DBUtils

  • 是Apache公司提供的一个对JDBC进行简单封装的开发工具类库,可以简化JDBC的开发,同时不会影响性能
  • 核心类:QueryRuner
  • 构造方法
  • 成员方法
    • update():两个重载方法
    • query():两个重载方法
    • 在一般情况下如果执行CRUD的操作,会在构造方法中传入一个DataSource对象.这里边已经有了Connection对象
    • 但是在有事务的时候,就不能用上边的构造方法,要用无参构造,然后执行CRUD方法的时候就需要传入Connection对象(从连接池中获得).
    • batch():重载方法执行批处理.
    • 在DbUtils类中有事务处理的方法.
    • 静态提交(quietly)和回滚:就是处理了异常

  • 查询的方法
    • 其中在实现方法中定义的那个类的对象,为什么不能在循环外定义?

  • DVUtils的使用(查询)
  • 封装的都是 结果集 就是select 和 from中间的SQL命令
    • ResultSetHandler的实现类
      • ArrayHandler
        • 将查询到的一条记录封装到一个数组当中,这个数组应该是Object][]

      • ArrayListHandler
        • 将查询到的多条记录,封装到一个装有Object[]的集合当中.

      • BeanHandler
        • 将一条记录封装到一个JavaBean中

      • BeanListHandler
        • 将多条记录封装到一个装有JavaBean的List集合中.
        • 这两个在封装之前要创建一个对应JavaBean的类.
        • 如果表字段的名字和类的成员变量的名字对不上,怎处理,给查询结果的字段起一个别名:select 字段 和这个字段对应类的成员变量.. from 表名
        • 创建对象,默认的是用class对象映射无参构造来创建的
        • 给成员变量赋值用的是set/get方法,有对应字段的get/set方法就可以有返回值,就能把结果集封装到JavaBean中.

      • MapHandler
        • 就是把一条记录封装到一个Map集合中

      • MapListHandler
        • 把多条记录封装到一个装有Map的集合的List集合中,每个Map对应一条记录
        • 打印Map集合是{}
        • 打印JavaBean集合是[]

      • ColumnListHandler
        • 将结果集中的某列封装到一个集合中.
        • 查询结果没有顺序?为什么呢?

      • ScalarHandler
        • 单值封装: 将结果集中的单个值封装
        • 查询结果只有一个值,或者只查一个指定的值(统计的之类的).

      • KeyedHandler
        • 将一条记录封装到一个Map集合中,将多条记录封装到一个装有Map集合Map集合中,外层Map的key的值是可以自定义的.外层Map的key在new KeyedHandler对象的时候把key作为一个参数传进去.





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马