java回炉学习(十一)

Java回炉学习(十一)

1. JDBC介绍

  1. JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。

  2. Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。

  3. 说明JDBC是Java提供一套用于数据库操作的接口API, ava程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。

在这里插入图片描述

  1. 获取数据库连接的五种方式:方式 4: 使用 Class.forName 自动完成注册驱动,简化代码 //这种方式获取连接是使用的最多,推荐使用 Class.forName("com.mysql.jdbc.Driver");

    //使用反射加载了 Driver类
            //在加载 Driver类时,完成注册
                源码: 1. 静态代码块,在类加载时,会执行一次.
                2. DriverManager.registerDriver(new Driver());
                3. 因此注册driver的工作已经完成
                static {
                    try {
                        DriverManager.registerDriver(new Driver());
                    } catch (SQLException var1) {
                        throw new RuntimeException("Can't register driver!");
                    }
                }
    

2. ResultSet数据集

  • 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
  • ResultSet对象保持个光标指向其当前的数据行。最初, 光标位于第一行之前next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集
  • 底层是一个arraylist存储每一行,每一行为一个elementdata数组
  • 在这里插入图片描述

3. PreparedStatement

  1. PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数. setXxx()方法有两个参数,第一一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
  2. 调用executeQuery),返回ResultSet对象
  3. 调用executeUpdate():执行更新,包括增、删、修改
  4. 预处理的好处:1. 不再使用+拼接sq|语句,减少语法错误 2. 有效的解决了sql注入问题! 3. 大大减少了编译次数,效率较高

4. JDBC小结

在这里插入图片描述

在这里插入图片描述

5. 事务

  1. JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
  2. JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务调用Connection的setAutoCommit(false)可以取消自动提交事务
  3. 在所有的SQL语句都成功执行后,调用Connection的commit();方法提交事务
  4. 在其中某个操作失败或出现异常时,调用Connection的rollback();方法回滚事务
  5. 批处理
    • 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
    • 许多条语句一次性提交给数据库批量处理通常情况下比单独提交处理更有效率。addBatch(:添加需要批量处理的SQL语句或参数;executeBatch(:执行批量处理语句: clearBatch():清空批处理包的语句
    • JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements-true
    • 批处理往往和PreparedStatement-起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高

6. 数据库连接池

  1. 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码(0.05S ~ 1s时间)。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
  2. 每一次数据库连接,使用完后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
  3. 传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃。
  4. 解决传统开发中的数据库连接问题,可以采用数据库连接池技术( connection pool)
  5. JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现[提供jar]
  6. C3P0数据库连接池,速度相对较慢,稳定性不错(hibernate, spring);DBCP数据库连接池,速度相对c3p0较快,但不稳定
  7. Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差点;BoneCP数据库连接池,速度快
  8. Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3P0、 Proxool优点于一身的数据库连接池

7. Apache-DBUtils

  1. 关闭connection后, resultSet结果集无法使用resultSet不利于数据的管理

  2. commons-dbutils是Apache组织提供的一个开源JDBCI具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量

  3. QueryRunner类:该类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理使用QueryRunner类实现查询

  4. ResultSetHandler接口:该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。

  5. 在这里插入图片描述

  6. apache- dbutils + Druid简化了JDBC开发,但还有不足:

    • SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查
    • 对于select操作,如果有返回值,返回类型不能固定,需要使用泛型
    • 将来的表很多,业务需求复杂,不可能只靠一个Java类完成
    • 引出=》BasicDAO画出示意图,看看在实际开发中,应该如何处理
    • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程哥哥吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值