JDBC连接

759 阅读11分钟

连接数据库操作的方式

第一种:使用MySQL客户端

通过MySQL Client输入用户名和密码进行数据库连接,连接成功之后通过SQL语句向数据库发送命了(insert,update,delete,select),数据库接收命名之后对SQL语句进行(安全性分析,语法分析,语法编译,生成一个SQL语句执行计划并执行,返回一个结果集给客户端),客户端得到数据库返回的结果集![2021-03-29_095943]

2021-03-29_095943.png

第二种:使用Java代码进行数据库操作

除了使用MySQL客户端之外,还提供使用Java代码操作数据库的途径,已得到数据返回结果集,Java就对这套操作数据库过程提供了一个规范,只要满足这套规范就可以对数据库进行CRUD操作,这个套规范就叫做 Java Database Connectivity 简称JDBC

PS:JDBC操作是数据库的原始操作也是基础,在后续学习MyBatis这个框架的时候也是以JDBC为基础进行二次封装提供数据库操作方式

什么是JDBC

JDBC是一种用于执行SQL语句的Java API,它可以为多种关系型数据库提供一套统一的访问,它是由一组用Java语言编写的类和接口组成,JDBC属于一套规范(属于一套接口),每个数据库产商都会在这个基础之上一共自身连接数据库的方式,这个方式就叫做"数据库连接驱动"

2021-06-03_092359.png

JDBC就是编写一条可以直接用Java代码连接数据库并发送SQL语句让数据库执行,并接受数据库操作之后的的返回值,连接数据库JDBC是不提供连接数据库的驱动,数据库的驱动就需要由各大数据库厂商进行提供

MySQL的连接驱动

1. mysql-connector-java-5.1.x --->这个版本驱动适合MySQL5.x版本的数据库

2. mysql-connector-java-8.0.x --->这个版本驱动适合MySQL8.x版本的数据库

JDBC的核心API

类型类的全限定名称(包名+类名)说明
classjava.sql.DriverManager管理多个数据库驱动连接的类,提供获取数据库连接方式
classjava.sql.SQLExceptionJDBC连接数据库时抛出所有异常根异常
interfacejava.sql.Connection代表一个数据库连接对象
interfacejava.sql.Statement代表一个SQL语句对象并发送语句到数据库
interfacejava.sql.ResultSet代表一个查询语句的结果集对象

特别注意:

开发JDBC程序时使用都是java原生sql包,所以使用类和接口都是出至于java.sql包下,千万不到导入com.mysql开头包下类或接口,因为这个包是各大数据库厂商提供的驱动连接里面的实现类和接口,并不是作为JDBC开发所使用

开发第一个JDBC连接程序

步骤(使用的是IDEA编译器)

1.现在IDEA中先创建一个工程

2.在IDEA创建好的功能内部创建一个文件夹名字lib(Library缩写)代表我们要使用jar包

3.将MySQL的连接驱动jar拷贝粘贴到lib文件夹的内部

4.需要将lib文件夹中MySQL的驱动连接jar添加到工程中才可以使用

4.1先找到当前MySQL驱动包并选中

4.2在选中驱动包的位置单机鼠标右键

4.3在出现的选项卡中 选择 add as Library 出现一个弹窗 ,点击OK即可

5.编写Java代码使用JDBC完成对数据库的连接操作

package com.qfedu.JDBC.FirstJDBCTest;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Objects;
​
//使用JDBC程序连接数据库
public class JDBCConnectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.提供第一种标准连接方式
        //1.1 加载MySQL注册驱动 -->这个方法是以反射的形式将Driver类加载
        Class.forName("com.mysql.jdbc.Driver");
        //1.2获取连接数据库对象(获取Connection对象)
        
       /* Connection是接口,无法直接创建,即无法直接获取到连接对象,并且这个接口中并提供或接口对象的方法
        DriverManager是一个工具类,它可以加载数据库连接驱动并获取一个Connection对象
        通过查看DriverManager的API发现一个静态方法,可以获取到Connection连接对象
        static Connection getConnection(String url, String user, String password)
        这个方法提供了三个参数,这个三个参数都是String类型
        url --> 数据库的连接地址 --> jdbc:mysql://数据库IP地址:数据库端口号/连接数据库的名称
            --> 数据库的IP地址 如果是本机(自己的电脑) --> 可以写成localhost或127.0.0.1
            --> 在实际开发中 这里就需要写MySQL服务器所在的IP地址
        user --> 连接数据库的用户名
        password --> 连接数据库的密码*/
         
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //如果连接成功Connection对象就会真实存在地址,如果连接是connection对象就是null值
        if(Objects.isNull(connection)){
            System.out.println("连接失败:"+connection);
        }else{
            System.out.println("连接成功:"+connection);
        }
​
        /*
        JDBC是随着Java版本更新而更新,现在最新版本JDBC4.0,提供一种全新的连接方式
        可以省略不写加载驱动连接 Class.forName("com.mysql.jdbc.Driver");
        直接使用DriverManager获取Connection连接对象
         */
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //如果连接成功Connection对象就会真实存在地址,如果连接是connection对象就是null值
        if(Objects.isNull(connection)){
            System.out.println("连接失败:"+connection);
        }else{
            System.out.println("连接成功:"+connection);
        }
    }
}
​

PS:个人是比较推荐使用标准方式进行连接

JDBC操作之DDL

需求:通过JDBC程序创建一个Student表,表中有是三个列(id 主键自增长列 name 字符串长度20 age 年龄)

刚刚通过JDBC已经成功的连接了数据库,如果将书写好的SQL语句发送给MySQL执行并且接受返回的信息

JDBC提供了一个专门用来存储和发送SQL语句的接口,这个接口可以接收SQL语句并发送到MySQL上让其执行并得到执行执行之后的返回效果

Statement静态语句

为什么要叫静态语句?

提前写好的SQL语句,语句中参数也是提前写好的,管这个样语句叫做静态语句,而存储这个静态语句的对象就是Statement对象,我们也称之为Statement静态语句对象

Statement接口说明:

这个接口中针对DDL语句操作提供了两个核心方法

int executeUpdate(String sql) 这个方法可以执行SQL中DDL和DML语句操作,这个方法有一个返回值是int类型,通过这个方法的返回值就可以判断DDL和DML语句是否执行操作成功,这个方法值返回的是在MySQL中通过DDL或DML语句操作受到影响行数,只需要判断返回值是否>0就是得知操作是否成功

void close() 在使用JDBC连接数据库并发送SQL语句执行是一个长连接操作,所以需要关闭

因为Statement是接口无法直接创建语句对应,那么如何获取到语句对象?

需要使用到Connection的连接对象,调用提供createStatement()方法获取Statement对象

package com.qfedu.JDBC.DDL;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
​
//通过JDBC向MySQL数据库执行DDL操作
public class CreateTable {
    public static void main(String[] args) throws Exception {
        //1.提供加载MySQL注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取Connection连接对象
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //3.提供静态SQL语句(在写SQL语句时需要注意SQL语句中字符串问题和不用写;)
        String sql = "create table student(" +
                "id int primary key auto_increment," +
                "name varchar(20)," +
                "age int" +
                ")";
        //4.通过Connection对象创建静态语句对象Statement
        Statement statement = connection.createStatement();
        //5.通过Statement对象将SQL语句发送到Mysql数据库中执行并接收方法返回值
        int i = statement.executeUpdate(sql);
        //可以判断这个返回值是否>0 如果>0就证明操作成功,否则就证明操作失败
        //但是有一个特殊的存在使用DDL语言创建表或库 返回值是0 但是创建已经成功了
        System.out.println("返回值是:"+i);
        //6.关闭JDBC连接操作
        statement.close();
        connection.close();
​
​
    }
}
​

JDBC操作之DML操作

DML语句就是对表进行增加insert、删除delete和修改update操作,而且使用Statemnet这个对象的方法都是一样的即"executeUpdate",这个语句会提供返回值如果>0证明操作成功,如果<0证明操作失败

需求:通过JDBC向Student表中添加一条数据

package com.qfedu.JDBC.DML;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
​
//通过JDBC操作向student表中插入一条数据
public class InsertIntoTable {
    public static void main(String[] args) throws Exception {
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接数据库Connection对象
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //3.编写静态SQL语句(SQL语句中的字符串是''括起来)
        String sql = "insert into student(name,age) values('乔峰',36)";
        //4.创建Statement语句发送SQL语句并接收返回值
        Statement statement = connection.createStatement();
        int i = statement.executeUpdate(sql);
        if(i > 0){
            System.out.println("数据插入成功");
        }else{
            System.out.println("数据插入失败");
        }
    }
}
​

需求:通过JDBC操作修改Student中数据将"乔峰"修改为"萧峰"

package com.qfedu.JDBC.DML;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
​
public class UpdateTable {
    public static void main(String[] args) throws Exception {
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //3.编写静态SQL语句
        String sql = "update student set name = '萧峰' where id = 1";
        //4.创建静态语句对象发送SQL语句执行并接收返回值
        Statement statement = connection.createStatement();
        int i = statement.executeUpdate(sql);
        if(i>0){
            System.out.println("数据修改成功");
        }else{
            System.out.println("数据修改失败");
        }
        //5.释放资源
        statement.close();
        connection.close();
​
    }
}
​

需求:通过JDBC将Student表中"萧峰"删除

package com.qfedu.JDBC.DML;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
​
public class DeleteTable {
    public static void main(String[] args) throws Exception {
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //3.编写静态SQL语句
        String sql = "delete from student where name = '萧峰'";
        //4.创建静态语句对象发送SQL语句执行并接收返回值
        Statement statement = connection.createStatement();
        int i = statement.executeUpdate(sql);
        if(i>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        //5.释放资源
        statement.close();
        connection.close();
​
    }
}
​

JDBC操作之DQL

DQL是数据库查询语言,在JDBC中也可以完成DQL语言的操作,在书写DQL语言时进行数据库查询,数据库会返回一个"虚拟表"给客户端以展示数据,那么我们提供JDBC代码查询MySQL数据库返回这个"虚拟表"如何操作?

现在编写JDBC程序都是使用Statement语句语句对象来执行SQL语句,DDL和DML使用方式是executeUpdate,DQL执行语句的方法是什么?

查询StatementAPI查询执行DQL语句方法:

ResultSet executeQuery(String sql) 这个方法是执行DQL语言的方法,这个方法返回了一个ResultSet对象

查询ResultSetAPI发现

ResultSet翻译过来叫做"结果集",它是我们使用DQL语言执行查询之后得到结果,ResultSet就是虚拟表的映射,通过DQL语言执行完毕之后得到"虚拟表","虚拟表"中内容就会被存储在ResultSet这个结果集对象中,所以我们只需要通过ResultSet结果集对象进行操作就可以获取的通过DQL语言查询出来的数据了

通过DQL语言查询出来数据不可能只要一条,可能会多态,既然ResultSet是"虚拟表"的映射,那么ResultSet中就存储在多条数据,如果将ResultSet中的数据取出来?官方为文档中就有了说明,其实ResultSet和我们之前在JavaSE阶段在学习集合时和迭代器是一样的,ResultSet维护一个"光标",只需要移动这个"光标",就可以获取到ResultSet中存储的数据了

ResultSet中核心方法

next() 移动ResultSet的光标,判断是否还有下一行数据,如果有数据则返回true,如果没有没有数据返回false

在读取ResultSet数据时,是以行为单位进行读取,需要以列的方式获取行内数据

getXXXXXX(int columnIndex) 读取光标所在行内列的数据

PS:XXXXXX代表你要获取列的数据类型,例如:列时int类型 读取数据时候就是getInt

参数的传递指定列的 "位置值" 读取对应列的数据,是从左向右读取,左边第一个列就是数字[1],向右主键递增+1



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//使用JDBC操作查询student表中所有数据
public class selectTable {
    public static void main(String[] args)throws  Exception{
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydb1",
                "root",
                "123456"
        );
        //3.书写静态SQL语句
        String sql = "select * from student";
        //4.创建静态语句对象发送SQL语句并接收返回结果集
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        //5.遍历获取resultSet对象中存储的具体数据
        while(resultSet.next()){//移动光标判断是否还有下一行数据
            //循环体的内部读取行内数据,即每一列的数据
            //5.1使用参数为"列位置"的方式获取列中数据
            int id = resultSet.getInt(1);//相当于读取列id的值
            //5.2使用参数为 "列名" 的方式获取列中数据
            String name = resultSet.getString("name");//相当读取列name的值
            int age = resultSet.getInt(3);//相当于读取列age的值
            System.out.println("id:"+id+"\tname:"+name+"\tage:"+age);
        }
        resultSet.close();
        statement.close();
        connection.close();
    }
}