JDBC基础

1、JDBC简介

  1. JDBC(Java DataBase Connectivity :Java语言连接数据库)是套JAVA语言提供的(JDK自带)一套使用JAVA语言访问和处理存储在数据库中数据的API(类库:Application Programming Interfaces 应用程序编程接口 )。

  2. JDBC的核心API在java.sql包和javax.sql包。

  3. JDBC体系组成:

    1. 标准: java.sql包 和 javax.sql.包

    2. 实现: 各个厂商提供的 驱动

2、JDBC的本质

JDBC是SUN公司制定的一套接口(interface) java.sql.*; (这个软件包下有很多接口)

接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。

为什么要面向接口编程? 解耦合:降低程序的耦合度,提高程序的扩展力。 多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)

为什么SUN制定一套JDBC接口呢? 因为每一个数据库的底层实现原理都不一样。 Oracle数据库有自己的原理。 MySQL数据库也有自己的原理。 MS SqlServer数据库也有自己的原理。 .... 每一个数据库产品都有自己独特的实现原理。

JDBC的本质到底是什么? 一套接口。

3、三方责任

  1. JAVA(SUN公司)官方:

    1. 制定一套JAVA语言连接数据库的标准(接口集),即:java.sql包+javax.sql包

  2. 数据库厂商

    1. 负责编写JDBC接口的实现类

    2. 这些对JDBC接口的实现都是以jar包的形式存在的,【驱动包 mysql-connector-java-8.0.24.jar】

    3. 驱动不是Java官方提供的,而是各大数据库厂商提供的,下载驱动需要去数据库官网下载

    4. 真正干活的

  3. 我们Java程序员(开发人员)

    1. 学习标准

    2. 使用驱动

4、JDBC编程六步

第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)

第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)

第三步:获取数据库操作对象(专门执行sql语句的对象)

第四步:执行SQL语句(DQL DML....)

第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)

第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)

  //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://localhost:3306/exec?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useServerPrepStmts=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true ";
        String user = "root";
        String pwd = "123456";
        Connection con = DriverManager.getConnection(url, user, pwd);
        //3.创建执行SQL的Statement执行器
        Statement sta = con.createStatement();
        //4.执行SQL
        ResultSet rs = sta.executeQuery("select * from student");
        //5.处理结果集
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String email = rs.getString("email");
            String birth = rs.getString("birth");
            String age = rs.getString("age");
            String phone = rs.getString("phone");
            System.out.println(id+"'\t"+name+"\t"+age+"\t"+email+"\t"+birth+"\t"+phone);
        }
        //6.关闭资源
        rs.close();
        sta.close();
        con.close();

5、核心API

1.java.sql.Driver

2.java.sql.DriverManager

  • 驱动管理器:管理驱动和对外提供数据库连接

  • 获取连接的方法:

  • 管理驱动的方法:

3.java.sql.Connection

  • 和数据库的连接

  • 可以 使用Connection对象来创建SQL语句的执行器

4.java.sql.Statement/PreparedStatement

  • 代表SQL执行器:运行SQL(普通的Statement/预编译的Statement/CallableStatement)

  • 执行的方法:

    • execute

    • executeUpdate

    • executeQuery()

    • executeBatch()

5.java.sql.ResultSet

  • 从 数据库返回的结果集

6、JDBC流程细节

1.注册驱动

  • Class.forName("包名+类名")

    • Class是一个描述类的类,其中静态方法forName,作用是加载指定名字的类。

    • 当类加载时,静态代码会执行。在静态代码块中把驱动对象注册到DriverManager中。

    • 而DriverManager中的registerDriver就是把驱动对象放到内部的一个 集合中

  • DriverManager.getConnection

    • 每一次getConnection,都是从集合中遍历查找合适的驱动对象,执行connect方法

    • getConnection(url,Properties)

    • getConnection(url,user,password)

    • Properties类是来自java.util包的一个常见读取/存放JAVAbean配置信息的类,一般读取:key=value格式的java配置文件。

    • 两种加载资源的方式:

  • connection.createStatement()/connection.prepareStatement(sql)

    • 创建执行SQL的Statement执行器

  • 执行SQL

    • execute()

      • 可以执行任意的SQL

      • 返回值是boolean类型,以执行的SQL语句是否返回ResultSet为标准,如果返回结果集则为true,否则我false

    • executeUpdate()

      • 执行DDL:返回0

      • 执行DML:返回数据库受影响行数

      • DQL:不能执行DQL(select)

    • executeQuery()

      • 只能执行DQL

    • executeBatch()

      • addBatch():把命令添加到批处理的命令队列中

      • executeBatch():执行批处理命令队列

  • 处理结果集

    • ResultSet表示结果集,一般在执行SQL查询语句生成

    • ResultSet有一个指向当前行的光标,光标一开始是指向结果的第一个元素的上方,所以需要执行next()方法将光标下移。

    • 如果没有使用next方法

    • 默认情况下结果集只能遍历一遍,指针移动到了最后,如果继续尝试获取数据

    • 从结果集中获取数据,可以根据列名或者列的下标获取(列名或者列的下标要和执行的SQL语句保持一致)

7、PreparedStatement 和Statement的区别

  • Statement: 执行静态SQL的对象,即没有参数的SQL

  • PreparedStatement可以执行带有参数的SQL,支持?占位符

  • 在开发中,一般推荐使用PreparedStatement, 两个好处:

    • 防止SQL注入

    • 支持预编译,执行效率高于Statement

  • 有些情况下不能使用?占位符

    • 表名的位置是参数,不能使用?占位符 (select * from ?=>select * from 'student')

    • 模糊查询like中不能使用?占位符 (select * from xxx where name like '%?%')

    • order by 排序时,后面的排序字段不能使用?,会导致排序无作用

8、获取数据库在的主键

  • 默认在使用JDBC执行添加时,不会自动返回 主键值 ,需要使用开发开启

  • 在Statement接口中,定义了两个常量分别代表 是否 启动自动生成的 主键

  • 当需要返回自动增长的主键时,可以开发开关。

9、JDBC控制事务

JDBC中的事务的提交模式默认是自动提交 ,即,当执行完一条SQL,立刻 提交。
如果需要开启事务,即多条语句一块执行 ,需要首先关闭自动提交:Connection.setAutoCommit(false)

sql1,sql2...sqln

提交事务:Connection.commit()
回滚事务:Connection.rollback()

10、元数据 MetaData Class

  • 获取元数据对象 getMetaData();

  • JDBC中通过了两个元数据接口用来获取关于数据的数据:

    • DatabaseMetaData: 用来获取关于数据库本身的信息

    • ResultSetMetaData:用来获取结果集中列的信息。MyBatis、Hibernate、Spring

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值