• 【JDBC Part 1】概述、获取连接、CRUD



    代码已上传: JDBC代码仓库

    01:JDBC概述

    笔记要求:通过看笔记可以写出程序即可。

    • 在Java中,数据库存取技术可分为如下几类:

      • JDBC直接访问数据库

      • JDO (Java Data Object )技术

      • 第三方O/R工具,如Hibernate, Mybatis 等

    • JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。

    • JDBC接口(API)包括两个层次:

      • 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
      • 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。

    JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。

    不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。 ————面向接口编程

    JDBC程序编写步骤

    在这里插入图片描述

    Java与SQL对应数据类型转换表

    在这里插入图片描述

    02:获取数据库连接

    在实际操作中,会将数据库需要的4个基本信息加载到配置文件中。

    说明:使用配置文件的方式保存配置信息,在代码中加载配置文件。使用配置文件的好处:
    ①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
    ②如果修改了配置信息,省去重新编译的过程。

    要素一:Driver接口实现类

    java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。

    • 加载与注册JDBC驱动
      MySQL的驱动: com.mysql.cj.jdbc.Driver
      加载驱动
      需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名 Class.forName(“com.mysql.cj.jdbc.Driver”);
      注册驱动
      DriverManager 类是驱动程序管理器类,负责管理驱动程序使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动。

    通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
    下图是MySQL的Driver实现类的源码:
    在这里插入图片描述

    要素二:URL

    JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到 数据库的连接。
    MySQL的连接URL方式:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8

    jdbc:mysql :协议
    localhost:ip地址
    3306:默认mysql的端口号
    test:test数据库

    要素三:用户名和密码

    user,password可以用“属性名=属性值”方式告诉数据库 。
    最后调用 DriverManager 类的 getConnection() 方法建立到数据库的连接。

    03:使用PreparedStatement实现CRUD操作

    C:create、R:Retrieve、U:Update、D:Delete。

    PrepareStatement的介绍

    • 可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取PreparedStatement 对象
    • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句 。
    • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用PreparedStatement 对象的 setXxx() 方法来设置这些参数.。
    • setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。

    PreparedStatement vs Statement

    • 代码的可读性和可维护性。

    • PreparedStatement 能最大可能提高性能:
      DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。

    • 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。

    • (语法检查,语义检查,翻译成二进制命令,缓存)

    • PreparedStatement 可以防止 SQL 注入

    使用PreparedStatement实现增删改操作的步骤

    1. 获取数据库连接。
    2. 预编译sql语句,返回PreparedStatement。
    3. 填充占位符。
    4. 执行execute()方法执行操作。
    5. 关闭资源。

    使用PreparedStatement实现查找操作

    1. 获取数据库连接。
    2. 预编译sql语句,返回PrepareStatement。
    3. 填充占位符。
    4. 执行executeQuery()方法执行操作,并返回结果集。
    5. 返回结果集的元数据,以便获取列数、列名。
    6. 使用反射,给动态对象的columnName属性赋值为columnValue。以便返回查询结果。(第6条这里用到了ORM思想)

    需要用到ResultSet与ResultSetMetaData:

    Result

    • 查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
    • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现 ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
    • ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象 的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。
    • 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。
      例如: getInt(1), getString(“name”)
      注意:Java与数据库交互涉及到的相关Java API中的索引都从1开始。

    ResultSetMetaData

    • 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
      ResultSetMetaData meta = rs.getMetaData();
      getColumnName(int column):获取指定列的名称
      getColumnLabel(int column):获取指定列的别名
      getColumnCount():返回当前 ResultSet 对象中的列数。
      getColumnTypeName(int column):检索指定列的数据库特定的类型名称。 getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。 isNullable(int column):指示指定列中的值是否可以为 null。
      isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。

    小结

    • 两种思想

    面向接口编程的思想

    ORM思想(object relational mapping)
    一个数据表对应一个java类
    表中的一条记录对应java类的一个对象
    表中的一个字段对应java类的一个属性

    • 两种技术

    JDBC结果集的元数据:ResultSetMetaData
    获取列数:getColumnCount()
    获取列的别名:getColumnLabel()

    通过反射,创建指定类的对象,获取指定的属性并赋值

    • 查找操作的流程示意图:
      在这里插入图片描述
  • 相关阅读:
    天呐,我居然可以隔空作画了
    【SwiftUI模块】0024、SwiftUI创建一个时尚的3D轮播滑块
    逍遥自在学C语言 | 变量、常量与数据类型
    初识Flink 完整使用 (第一章)
    HBase启动问题(一) org/apache/hadoop/hbase/master/ClusterSchema
    分布式系统架构理论与组件
    Python 计算一个n×n矩阵的特征值、特征向量
    基于GCC的工具objdump实现反汇编
    nvm管理node版本
    【产品经理修炼之道】- 企业内部礼品库存管理系统设计(从需求到上线)B端
  • 原文地址:https://blog.csdn.net/weixin_62633072/article/details/125607297