JDBC 和数据库连接池

1. JDBC 概述

JDBC 为访问不同的数据库提供了统一的接口

    为使用者屏蔽了细节问题

② Java 程序员使用 JDBC,可以连接任何提供了

    JDBC 驱动程序的数据库系统,从而完成对数据库

    的各种操作

③ JDBC 是 Java 提供一套用于数据库操作的接口 API

    Java 程序员只需要面向这套接口编程即可,不同的

    数据库厂商,需要针对这套接口,提供不同实现

2. JDBC 程序编写步骤

注册驱动 - 加载 Driver

    Driver driver = new Driver();

② 获取连接 - 得到 Connection

    String url = "jdbc:mysql://localhost:3306/db02";

        // jdbc:mysql:// 规定好表示协议,

        // 通过 jdbc 的方式连接 mysql

        // localhost 主机,可以是 ip 地址

        // 3306 表示 mysql 监听的端口

        // db02 连接到 mysql dbms 的哪个数据库

        // mysql 的连接本质就是 socket 连接

        Properties properties = new Properties();

        // 将用户名和密码放入到 Properties 对象

        properties.setProperty("user", "root");

        properties.setProperty("password", "123");

        // user 和 password 后面的值可更改

       Connection connection =

       driver.connection(url, properties);

③ 执行增删改查 - 发送 SQL 给 mysql 执行

         String sql = "insert into actor values(null,

         '杨超越',  '女',  '2002-10-06', '13512531251')";
         // Statement 用于执行静态SQL语句并返回

         // 其生成的结果的对象
         Statement statement = connect.createStatement();
         int rows = statement.executeUpdate(sql);

         // 如果是 dml 语句,返回的就是影响行数         
         System.out.println(rows > 0 ? "成功" : "失败");

释放资源 - 关闭相关连接

         statement.close();
         connect.close();

 (2) 数据库连接 5 种方式·

 

 

(3) ResultSet 底层

① 表示数据库结果集,通常通过执行查询

    数据库的语句生成

ResultSet 对象保持一个光标指向其当前

     的数据行。最初,光标位于第一行之前

next 方法将光标移动到下一行,并且由

    于在 ResultSet 对象中没有更多行时返回

    false,因此可以在 while 循环中使用循环

    来遍历结果集

 (4) Statement

Statement 对象,用于执行静态SQL语句

   并返回其生成的结果的对象

② 在连接建立后,需要对数据库进行访问,

   执行 命名或是SQL语句,可以通过

   Statement [存在SQL注入]

   PreparedStatement [预处理]

   CallableStatement [预处理]

③ Statement 对象执行SQL语句,存在SQL注入风险

④ SQL注入是利用某些系统没有对用户输入的数据进

    行充分的检查,而在用户输入数据中注入非法的

    SQL语句段或命令,恶意攻击数据库

⑤ 要防范SQL注入,只要用 PreparedStatement (从

     Statement 扩展而来) 取代 Statement 就可以了

 

    2) PreparedStatement (预处理)

① PreparedStatement 执行的SQL语句中的参数

    用问号(?)来表示,调用 PreparedStatement 对

    象的 setXxx() 方法来设置这些参数.setXxx()

    法有两个参数,第一个参数是要设置的 SQL 语

    句中的参数的索引(从 1 开始),第二个是设置的

    SQL 语句中的参数的值

② 调用 executeQuery()返回 ResultSet 对象

③ 调用 executeUpdate(),执行更新,包括增、

    删、修改

 预处理的好处

不再使用+ 拼接sql语句,减少语法错误

② 有效的解决了sql注入问题

③ 大大减少了编译次数,效率较高

3. JDBC API

JDBC API 一系列的接口,它统一和规范应用程序数据库

连接、执行 SQL 语句,并得到返回结果等各类操作,相关类

和接口在 java.sqljavax.sql 包中

 

JDBC 的相关API小结

① DriverManager 驱动管理类

  getConnection(url, user, pwd):获取连接

② Connection 接口

  createStatement():生成命令对象

  prepareStatement(sql):生成预编译命令对象

③ Statement 接口

  executeUpdate(sql):执行dml语句,返回影响的行数

  executeQuery(sql):执行查询,返回 ResultSet 对象

  execute(sql):执行任意的sql,返回布尔值

④ PreparedStatement 接口 

  executeUpdate(sql):执行dml语句,返回影响的行数

  executeQuery(sql):执行查询,返回 ResultSet 对象

  execute(sql):执行任意的sql,返回布尔

  setXxx(占位符索引,占位符的值):解决SQL注入

  setObject(占位符索引,占位符的值)

⑤ Result(结果集)

  next():向下移动一行,同时如果没有下一行,返回false

  previous():向上移动一行

  getXxx(列的索引 | 列名):返回对应列的值,接收类型

                                           是Xxx

  getObject(列的索引 | 列名):返回对应列的值,接收类型

                                                为Object

 4. JDBCUtils

(1) 封装JDBCUtils工具类

 (2) 使用工具类JDBCUtils

 

5. 事务

① JDBC程序中当一个 Connection对象创建时,

    默认情况下是自动提交事务:每次执行一个

   SQL语句时,如果执行成功,就会向数据库

   自动提交,而不能回滚

② JDBC程序中为了让多个 SQL语句作为一个

    整体执行,需要使用事务

③ 调用 Connection的 setAutoCommit(false)

     可以取消自动提交事务

④ 在所有的 SQL语句都成功执行后,调用

     commit();方法提交事务

⑤ 在其中某个操作失败或出现异常时,调用

     rollback();方法回滚事务

 

6. 批处理

① 当需要成批插入或者更新记录时,可以采用

    Java的批量更新机制,这一机制允许多条语

    句一次性提交给数据库批量处理

    通常情况下比单独提交处理更有效率

② JDBC的批量处理语句包括下面方法:

    addBatch()添加需要批量处理的SQL语句

                         或参数

    executeBatch()执行批量处理语句

    clearBatch()清空批处理包的语句

③ JDBC连接MySQL时,如果要使用批处理功

     能,请在url中加参数

     ?rewriteBatchedStatements=true

④ 批处理往往和 PreparedStatement 一起搭配

     使用,可以既减少编译次数,又减少运行次

     数,效率大大提高

 

7. 连接池

(1) 传统获取Connection问题分析

① 传统的JDBC数据库连接使用 DriverManager

   来获取,每次向数据库建立连接的时候都要将

   Connection 加载到内存中,再验证IP地址,

   用户名和密码(0.05s~1s时间)。

   需要数据库连接的时候,就向数据库要求一个,

   频繁的进行数据库连接操作将占用很多的系统

   资源,容易造成服务器崩溃

② 每一次数据库连接,使用完后都得断开,如果

   程序出现异常而未能关闭,将导致数据库内存

   泄漏,最终将导致重启数据库

③ 传统获取连接的方式,不能控制创建的连接数

   量,如连接过多,也可能导致内存泄漏,MySQ

   L崩溃

④ 解决传统开发中的数据库连接问题,可以采用

   数据库连接池技术 (connection pool)

(2) 数据库连接池基本介绍

① 预先在缓冲池中放入一定数量的连接,

  当需要建立数据库连接时,只需从 "缓

  冲池" 中取出一个,使用完毕之后再放

  回去 

② 数据库连接池负责分配、管理和释放

  数据库连接,它允许应用程序重复使用

  一个现有的数据库连接,而不是重新建

  立一个

③ 当应用程序向连接池请求的连接数超

  过最大连接数量时,这些请求将被加入

  到等待队列中 

(3) 数据库连接池种类

① JDBC 的数据库连接池使用 javax.sql.Da

  taSource 来表示,DataSource 只是一个

  接口,该接口通常由第三方提供实现

  [提供 .jar]

C3P0 数据库连接池,速度相对较慢

  定性不错 (hibernate,spring)

DBCP 数据库连接池,速度相对 c3p0

  快,但不稳定

Proxool 数据库连接池,有监控连接池状

  态的功能,稳定性较 c3p0 差一点

BoneCP 数据库连接池,速度快

Druid(德鲁伊) 是阿里提供的数据库连接池,

  DBCP、C3P0、Proxool 优点于一身的数

  据库连接池 

 1) C3P0 连接池 

 

   2) Druid(德鲁伊) 连接池

 2) 基于 druid 数据库连接池的工具类

 

 

8. Apache-DBUtils

 (1) 返回 resultSet 问题

① 关闭 connection 后,resultSet 结果集无法使用

resultSet 不利于数据的管理 [只能用一次]

③ 使用返回信息也不方便

  

  (2) Apache-DBUtils

  commonds-dbutils 是 Apache 组织提

  供的一个开源JDBC工具类库,它是对

  JDBC的封装,使用 dbutils 能极大简化

  jdbc 编码的工作量

  2) DbUtils

QueryRunner:该类封装了SQL的执行,

  是线程安全的,可以实现增、删、改、查、

  批处理

② 使用 QueryRunner 类实现查询

ResultSetHandler 接口:该接口用于处理

  java.sql.ResultSet,将数据按要求转换为另

  一种形式

ArrayHandler:把结果集中的第一行数据转成

                        对象数组

ArrayListHandler:把结果集中的每一行数据都

                         转成一个数组,再存放到List

BeanHandler:将结果集中的第一行数据封装

                        一个对应的JavaBean实例中

BeanListHandler:将结果集中的每一行数据都

                              封装到一个对应的JavaBean

                              实例中,存放到List里

ColumnListHandler:将结果集中的某一列的数据

                                 存放到List中

KeyedHandler(name):将结果集中的每行数据都

                                     封装到Map里,再把这些

                                     map再存放到一个map里,

                                     其key为指定的key

MapHandler:将结果集中的第一行数据封装到一

                       个Map里,key是列名,values就是

                       对应的值

MapListHandler:将结果集中的每一行数据都封装

                            到一个Map里,然后再存放到List

 

9. DAO 增删改查-BasicDao

 apache-abutils+Druid 简化了JDBC开发,

但还有不足

SQL语句固定的,不能通过参数传入

  通用性不好,需要进行改进,更方便执行

  增删改查

② 对于 select 操作,如果有返回值,返回

  类型不能固定,需要使用泛型

③ 将来的表很多,业务需求复杂,不可能

  只靠一个Java类完成

④ 引出=》BasicDAO 

 (2) BasicDAO 基本说明

① DAO:data access object 数据访问对象

② 这样的通用类,称为 BasicDAO,是专门

  和数据库交互的,即完成对数据库(表)的

  crud 操作

③ 在BasicDAO的基础上,实现一张表对应一

  个DAO,更好的完成功能,比如 Customer 

  -Customer.java 类(javabean)-CustomerD

  ao.java

com.hhh.dao_.utils         //工具类

com.hhh.dao_.domain   //javabean

com.hhh.dao_.dao         //存放XxxDAO 和 BasicDAO

com.hhh.dao_.test         //写测试类 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值