本帖最后由 小石姐姐 于 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.
|
|