黑马程序员技术交流社区

标题: [石家庄校区]day11-JDBC高级 [打印本页]

作者: 夕阳下的少年    时间: 2018-5-21 16:39
标题: [石家庄校区]day11-JDBC高级
本帖最后由 小石姐姐 于 2018-5-23 14:56 编辑

                 day11-JDBC高级


### 事务的概念

事务指的是逻辑上的一组操作,组成这组操作哥哥逻辑单元要么全都成功,要么全都失败.

### 事务环境准备

* 创建数据库和表

```html
create datsbase 数据库名字;
use 要切换的数据库
create table 表名(
    id int primary key aut_increment,
    name varchar(20),
    money double
);
//添加数据
insert into 表名 values (null,'aaa',10000);
insert into 表名 values (null,'bbb',10000);
insert into 表名 values (null,'ccc',10000);
```

### 在转账中添加事务管理

1.事务管理的API;

1.`void commit() `:
    (1).使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁.
2.`setAutoCommit(boolean autoCommit)` :

​    (2).将此连接的自动提交模式设置为给定状态
3.`void rollback()`:

​    (3).取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁.

### 连接池的概述

**什么是连接池**

​    连接池是装有连接的容器,使用连接的话,可以从连接池中获取,使用完成之后将连接归还给连接池.

**为什么学习连接池:**

​    连接对象和销毁是需要消耗时间的,在服务器初始化的时候就初始化一些连接.把这些连接放入内存中,使用的时候可以从内存中获取,使用完成后将连接放入连接池中.从内存中获取和归还的效率要远远高于创建你和销毁的效率.(提升性能)

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

**使用接口的实现类完成的构造方法**

`MyDataSource dataSource = new MyDataSource();`这种写法不方便程序的扩展.

**额外提供了方法归还连接**

`DataSource.addBack(conn);`这种方式增加使用连接池的用户的难度.

### 自定义连接池的问题解决

```tex
如果不提供自定义的方法就可以解决这个问题,但是连接要如何归还到连接池?
```

**解决分析的思路**
    在Connection中是有一个close 方法的,colse方法完成了连接的销毁.能不能做一个事情,将原有连接的close方法改为归还.

* 现在要做的事情就是将原有的close方法的逻辑改为归还.(**增强一个类中的方法**);

  * 一种:采用继承的方式:

  ```html
      * 继承这种增强是最简单,但是有使用条件的:必须能够控制这个类的构造!!!!
  class Man{
      public void run(){
          System.out.println(“跑…”);
  }
  }

  class SuperMan extends Man{
      public void run(){
          System.out.println(“飞…”);
  }
  ```

* 二种:采用装饰着模式:

  ```tex
  * 装饰着模式使用条件:
      * 1.增强的类和被增强的类实现相同的接口
      * 2.在增强的类中获得被增强类的引用
          interface Waiter{
          public void server();
      }

      public class Waitress implements Waiter{
          public void server(){
              System.out.println(“服务中…”);
      }
      }

      public class WaitressWrapper implements Waiter{
          private Waiter waiter;
          public WaitressWrapper(Waiter waiter){
              this.waiter = waiter;
      }

          public void server(){
              System.out.println(“微笑…”)
              waiter.server();
      }
      }
  ```

**C3p0连接池的概述:**

```te
    C3p0是一个开源的JDBC连接池,它实现了数据源和JDBC绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目哟Hibernate ,Spring等.
```

**c3p0连接池的使用**

配置文件的方式:

* 配置连接池

```html
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>

      <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///day09</property>
        <property name="user">root</property>
        <property name="password">123</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
      </default-config>

    </c3p0-config>
```

**动态代理**

​    被增强的类实现了接口即可

​    编写代码的时候麻烦



**工具类代码实现**

​    连接池对象应该是一个应用只创建一次就可以了,不需要每次使用都创建一个新的连接池.

### DBUtils的概述

**什么是DBUils**

​    commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC引用程序的开发,同时也不会影响程序的性能.

**为什么要学习DBUtils**
    因为JDBC手写比较麻烦,而且有非常多的代码是类似的。比如获得连接,预编译SQL,释放资源等..那么可以将这些代码抽取出来放到工具类中。将类似的代码进行抽取。大大简化JDBC的编程。

### DBUtils的API的概述

**QueryRunner对象:核心运行类**

* 构造方法:

  * 不带参数的:

    `ueryRunner()`: Constructor for QueryRunner.

  * 带参数的:

    ``**QueryRunner**(DataSource ds):`Constructor for QueryRunner which takes a `DataSource`.

* 方法:

  * 指定的给插入,修改,删除的一个方法

    1.`int update(String sql, Object... params) `:

    ​     Executes the given INSERT, UPDATE, or DELETE SQL statement

    2.`int update(Connection conn, String sql, Object... params)` :

    ​    Execute an SQL INSERT, UPDATE, or DELETE query.

  * 查询

    1.`<T> T`  `**query**(String sql, ResultSetHandler<T> rsh, Object... params)`

    ​     Executes the given SELECT SQL query and returns a result object.

    2.`<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)`

    ​    Execute an SQL SELECT query with replacement parameters.

    在一般情况下如果执行CRUD的操作:

    ​    构造:

    ​    QueryRunner(DataSource ds);

    ​    方法:

    ​    int update(String  sql ,Object....args);

    ​    T query (String sql,ResyltSetHandler rsh , Object....args);

  *  执行批处理的方法

    1.`int[] batch (Connection conn, String sql, Object[][] params)`

    ​    Execute a batch of SQL INSERT, UPDATE, or DELETE queries.

    2.`int[] batch (String sql, Object[][] params)`

    ​     Execute a batch of SQL INSERT, UPDATE, or DELETE queries.     






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2