【JDBC】 API解析(上)

212 阅读3分钟

「这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战

1、注册驱动:

Class.forName("com.mysql.jdbc.Driver");

注册驱动的书写方法,表面上没有使用 DriverManager类,选中Driver,ctrl+b看源码可知

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

它使用了 DriverManager.registerDriver()的方法

在MySQL5之后的驱动包,可以省略注册驱动的步骤

自动加载jar包中的META-INF/services/java.sql.Driver文件的驱动类

2、获取连接

static Connection getConnection(String url,String user,String password)

参数

1、url:连接路径

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....

举例:jdbc:mysql://127.0.0.1:3306/db1(本机127.0.0.1,本机域名:localhost)

细节: 如果连接的是本机mysql服务器,并且mysql默认端口号是3306 ,则url可以简写为:jdbc:mysql://数据库名称?参数键值对如:jdbc:mysql:///db1

配置userSSL=false参数,禁用安全连接方式,解决警告提示

2、user:用户名

3、password:密码

解决警告提示:

?userSSL=false

String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";

二、Connection

Connection(数据库连接对象)作用:

1、获取执行SQL的对象

2、管理事务

1、获取执sql对象

  • 普通执行SQL对象

Statement createStatement()

  • 预编译SQL的执行SQL对象:防止SQL注入

PrepareStatement prepareStatement(sql)

  • 执行存储过程对象

CallableStatement prepareCall(sql)

2、事务管理

mysql事务管理

开启事务:BEGIN;/START TRANSACTION(start transaction)

提交事务:COMMIT;

回滚事务:ROLLBACK;

(MySQL默认自动提交事务)

JDBC事务管理:

Connection接口中定义了3个对应的方法

开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务,false为手动提交事务(开启事务)

提交事务:commit()

回滚事务:rollback()

演示jdbc的事务

复制前面弄过的类到包下

package com.jdbc;

import com.mysql.jdbc.Connection;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCConnectionDemo {
    public static void main(String[] args) throws Exception {
        //1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
       //2、获取连接
         //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
        String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
        //username是你的mysql用户名
        String username="root";
        //password是你的mysql密码
        String password="123456";
        Connection conn= (Connection) DriverManager.getConnection(url, username, password);
        //3、定义sql
        String sql1="update emp set salary=6666 where ename='zhangsan'";
        String sql2="update emp set salary=6666 where ename='lisi'";
        //4、获取执行sql的Statement对象
        Statement stat=conn.createStatement();
         
      //选中要处理的异常部分,ctrl+alt+t快捷键生成
        try {
            //开启事务
           conn.setAutoCommit(false);
           //执行sql
            int count1=stat.executeUpdate(sql1);
            //处理结果
            System.out.println("影响的行数:"+count1);

            //执行时sql
            int count2=stat.executeUpdate(sql2);
            //处理结果
            System.out.println("影响的行数:"+count2);

            //提交事务
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            //回滚事务(回到开启事务之前,即什么也没处理前)
             conn.rollback();
        }finally {
            //7、释放资源(先开后释放)

            stat.close();
            conn.close();
        }

    }
}

运行之前数据库emp表:

运行结果:

运行之后数据库emp表:

try之中的发生了异常 ,就会 被catch捕获,发生回滚,回滚到还没有开启事务之前,就是数据没有修改之前,若是没有用事务,就会导致可能一个成功一个失败,这是我们不愿意看到的。 启用了事务,用了回滚事务,可以保证多个事务要么同时成功,要么同时失败。

三、Statement

Statemen作用:

1、执行sql语句

int executeUpdate(sql): 执行DML(对数据的增删改)、**DDL(对表和库的增删改)**语句

返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0

ResultSet executeQuery(sql):执行**DQL(对数据的查询操作)**语句

返回值:ResultSet结果对象