• JDBC编程



    重点:

    1. 数据库驱动
    2. JDBC的概念及作用
    3. 掌握JDBC的工作原理
    4. 掌握JDBC中几个常见接口和类
    5. 长我基于数据库的应用程序开发流程

    1.数据库编程的必备条件

    • 编程语言,如Java,C、C++、Python等
    • 数据库,如Oracle,MySQL,SQL Server等
    • 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提
      供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,
      要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc

    MySQL :是一个CS结构的系统,MySQL的客户端是系统自带的客户端是一个控制台程序。当我们敲下SQL语句的时候,都会由客户端把SQL通过网络发送给服务器,而服务器又会通过网络把操作结果返回给客户端。

    编程操作数据库本质上:就是通过代码实现一个MySQL客户端,同样是通过网络和服务器进行交互。写代码操作SQL主要是实现一个客户端,而不是实现服务器,数据库服务器很难实现。 要想自己实现客户端,客户端不是凭空就能实现的,但是数据库会给我们提供一组API来方便我们实现。那么问题来了,数据库的种类很多,不同数据库提供的API都不太一样,准确的来说,MySQL 的API 和 Oracle的API 以及SQL server 的API都差异很大。

    API : application programming interface 应用程序接口

    提供了一组函数/类/方法,让用户去直接使用。

    非常广义的概念,API有的时候也可以称为“接口”(此处的接口和Java语法没有直接关系。

    由于不同版本的数据库提供的API接口不一样,这就给程序员带来了困扰。

    在Java中为了解决这个问题,引入“JDBC”, 即Java Database Connectivity,Java数据库连接,可以理解成是Java自带的一组数据库操作的API,是Java中的数据库连接规范。它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。所以程序猿只需要学习JDBC这一套就够用了,具体某个数据库的API 的细节就不需要程序猿来考虑了。

    那么就需要把不同类的API 转换成JDBC风格的统一API,在Java中,通过数据库驱动程序就可以做到,不同的数据库需要分别提供不同的驱动程序。

    在Java中这样的驱动程序是一个独立的"jar包"。“jar包” 就是把许多 .java文件经过编译变成.class 文件,然后把许多.class文件 打一个压缩包 .jar变成了"jar包"。

    要想使用jar包,就需要把jar包导入到 IDEA 之中,让代码能够访问到jar中的类。

    在idea的工程中,创建一个目录,把jar包拷贝进去。

    配置项目的一些属性,让项目能够找到jar包.

    如此便可以通过 jdbc 来编程。

    2.Java的数据库编程:JDBC

    JDBC,即Java database Connectivity ,Java数据库连接.
    是一种用于执行SQL语句的Java API ,它是Java中的数据库连接规范.
    这个API由java.sql.*,javax.sql.*包内的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.

    image.png

    3.JDBC工作原理

    JDBC为多种关系数据库提供了统一的访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类.

    3.1JDBC访问数据库层次结构

    JDBC包含以下几大角色 : Driver、DriverManager、Connection、Statement、ResultSet。这几大角色之间的层次关系如下图所示:
    image.png

    一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。基本结构图如下:
    image.png

    这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class(此类可以在oracle提供的JDBC jar包中找到),此类实现了java.sql.Driver接口。

    由于驱动本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的:使用Class.forName(“driverName”)。以下是将常用的数据库驱动加载到内存中的代码:

    //加载Oracle数据库驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    
    //加载SQL Server数据库驱动
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    
    //加载MySQL 数据库驱动
    Class.forName("com.mysql.jdbc.Driver");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:Class.forName()将对应的驱动类加载到内存中,然后执行内存中的static静态代码段,代码段中,会创建一个驱动Driver的实例,放入DriverManager中,供DriverManager使用。

    例如,在使用Class.forName() 加载oracle的驱动oracle.jdbc.driver.OracleDriver时,会执行OracleDriver中的静态代码段,创建一个OracleDriver实例,然后调用DriverManager.registerDriver()注册:

    static {
        Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
        try {
            if (defaultDriver == null) {
                //创建一个OracleDriver实例,然后注册到DriverManager中
                defaultDriver = new OracleDriver();
                DriverManager.registerDriver(defaultDriver);
            }
            
        } catch (RuntimeException localRuntimeException) {
        } catch (SQLException localSQLException) {
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.1.1Driver的功能

    java.sql.Driver接口规定了Driver应该具有以下功能:
    image.png

    acceptsURL(String url) 方法用来测试对指定的url,该驱动能否打开这个url连接。driver对自己能够连接的url会制定自己的协议,只有符合自己的协议形式的url才认为自己能够打开这个url,如果能够打开,返回true,反之,返回false;
    例如:oracle定义的自己的url协议如下:
    jdbc:oracle:thin:@//:/ServiceName
    jdbc:oracle:thin:@::
    oracle自己的acceptsURL(String url)方法如下:

    public boolean acceptsURL(String paramString) {
        if (paramString.startsWith("jdbc:oracle:")) {
            return (oracleDriverExtensionTypeFromURL(paramString) > -2);
        }
        
        return false;
    }
    
    private int oracleDriverExtensionTypeFromURL(String paramString) {
        int i = paramString.indexOf(58) + 1;
        
        if (i == 0) {
            return -2;
        }
        int j = paramString.indexOf(58, i);
        
        if (j == -1) {
            return -2;
        }
        if (!(paramString.regionMatches(true, i, "oracle", 0, j - i))) {
            return -2;
        }
        ++j;
        
        int k = paramString.indexOf(58, j);
        
        if (k == -1) {
            return -3;
        }
        String str = paramString.substring(j, k);
        
        if (str.equals("thin")) {
            return 0;
        }
        if ((str.equals("oci8")) || (str.equals("oci"))) {
            return 2;
        }
        
        return -3;
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    由上可知oracle定义了自己应该接收什么类型的URL,自己能打开什么类型的URL连接(注意:这里acceptsURL(url)只会校验url是否符合协议,不会尝试连接判断url是否有效) 。拓展阅读:常用数据库 JDBC URL格式

    connect(String url,Properties info)方法,创建Connection对象,用来和数据库的数据操作和交互,而Connection则是真正数据库操作的开始(在此方法中,没有规定是否要进行acceptsURL()进行校验)。

    3.1.2DriverManager

    事实上,一般我们操作Driver,获取Connection对象都是交给DriverManager统一管理的。DriverManger可以注册和删除加载的驱动程序,可以根据给定的url获取符合url协议的驱动Driver或者是建立Conenction连接,进行数据库交互。
    ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25529268/1658223946303-4654d6c6-2281-40db-bee3-68578d1120e9.png#clientId=ub6b41189-012c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=308&id=uf97239b0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=385&originWidth=663&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56297&status=done&style=none&taskId=u0b1df27d-a170-4389-be6b-74542e97068&title=&width=530.4)
    ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25529268/1658223954827-1a795dfb-26e3-445e-a083-cabc53406611.png#clientId=ub6b41189-012c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=225&id=u185a6734&margin=%5Bobject%20Object%5D&name=image.png&originHeight=281&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=84814&status=done&style=none&taskId=ue7c7611a-ad9e-494e-a77c-ccd8b611887&title=&width=636)
    DriverManager 内部持有这些注册进来的驱动 Driver,由于这些驱动都是 java.sql.Driver 类型,那么怎样才能获得指定厂商的驱动Driver呢?答案就在于: java.sql.Driver接口规定了厂商实现该接口,并且定义自己的URL协议。厂商们实现的Driver接口通过acceptsURL(String url)来判断此url是否符合自己的协议,如果符合自己的协议,则可以使用本驱动进行数据库连接操作,查询驱动程序是否认为它可以打开到给定 URL 的连接。
    • 1
    • 2
    • 3

    使用DriverManager获取指定Driver

    对于驱动加载后,如何获取指定的驱动程序呢?这里,DriverManager的静态方法getDriver(String url)可以通过传递给的URL,返回可以打开此URL连接的Driver。
    比如,我想获取oracle的数据库驱动,只需要传递形如jdbc:oracle:thin:@::或者jdbc:oracle:thin:@//:/ServiceName的参数给DriverManager.getDriver(String url)即可:
    Driver oracleDriver =DriverManager.getDriver("jdbc:oracle:thin:@::");

    实际上,DriverManager.getDriver(String url)方法是根据传递过来的URL,遍历它维护的驱动Driver,依次调用驱动的Driver的acceptsURL(url),如果返回acceptsURL(url)返回true,则返回对应的Driver:

    public static Driver getDriver(String paramString) throws SQLException {
        
        //省略部分代码。。。。
        Iterator localIterator = registeredDrivers.iterator();
        //遍历注册的驱动
        while (localIterator.hasNext()) {
            DriverInfo localDriverInfo = (DriverInfo) localIterator.next();
            if (isDriverAllowed(localDriverInfo.driver, localClass))
                try {
                    //如果accepsURL() 为true,返回对应的driver
                    if (localDriverInfo.driver.acceptsURL(paramString)) {
                        //返回对应的driver
                        return localDriverInfo.driver;
                    }
                } catch (SQLException localSQLException) {
                }
            else
                println("    skipping: "+ localDriverInfo.driver.getClass().getName());
        }
        throw new SQLException("No suitable driver", "08001");
        //-----省略部分代码
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.1.3Connection

    Driver 或者 DriverManager根据连接的url 和参数信息创建Connection实例,用来维持和数据库的数据通信,如果没有销毁或者调用close()对象,此对象和数据库的对象会一直保持连接;

    3.1.4Statement

    Connection创建Statement对象,表示需要执行的sql语句或者存储过程;

    3.1.5ResultSet

    表示Statement执行完SQL语句后返回的结果集。

    3.2基本构成原理

    3.2.1Connection角色

    Connection表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。

    image.png

    在一般实际使用情况下,我们关注的Connection的功能有以下几点:

    1. 创建可以执行sql语句或者存储过程的对象statement,用来和数据库进行交互;
    //加载Oracle数据库驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    
    //根据特定的URL,返回可以接受此URL的数据库驱动对象
    Driver driver = DriverManager.getDriver(URL);
    
    //使用数据库驱动创建数据库连接Connection会话
    Connection connection = driver.connect(URL, props);
    
    //创建静态的sql语句  Statement 对象来将 SQL 语句发送到数据库。
    Statement staticStatement= connection.createStatement();
    
    //创建CallableStatement 对象来调用数据库存储过程。
    CallableStatement callableStatement = connection.prepareCall(sqlString);
    
    //创建参数化的Statement对象
    PreparedStatement preparedStatement = connection.prepareStatement(sqlString);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 控制SQL语句的事务

      Connection默认情况下,对于创建的statement执行的sql语句都是自动提交的,即在statement语句执行完后,自动执行commit操作,将结果影响到物理数据库。为了满足更好地事务控制需求,我们也可以手动地控制事务,手动地对statement 的sql语句执行进行提交(commit)或者回滚(rollback)。

    String sqlString="insert into tableName(column1,column2) values(value1,value2)";
    //加载Oracle数据库驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    
    //根据特定的URL,返回可以接受此URL的数据库驱动对象
    Driver driver = DriverManager.getDriver(URL);
    
    //使用数据库驱动创建数据库连接Connection会话
    connection = driver.connect(URL, props);
    //使用自定义的事务,要设置connection不自动提交
    connection.setAutoCommit(false);
    
    //创建静态的sql语句  Statement 对象来将 SQL 语句发送到数据库。
    Statement staticStatement= connection.createStatement();
    try{
        //执行插入操作
        staticStatement.execute(sqlString);
        staticStatement.getConnection().commit();//和上面的connection等价,statement只有一个创建自身的connection的引用
    }catch(Exception e)
    {
        //有异常,则rollback
        staticStatement.getConnection().rollback();
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    1. 获取数据库连接的元数据,即数据库的整体综合信息。
    DatabaseMetaData databaseMetaData = connection.getMetaData();
    
    • 1

    3.3JDBC工作的基本流程

    一个基本的JDBC工作流程,分为以下几步:
    1.加载特定数据库驱动器实现类,并注册驱动器(Driver会注册到DriverManager中);
    2. 根据特定的URL,返回可以接受此URL的数据库驱动对象Driver;
    3.使用数据库驱动 Driver 创建数据库连接Connection会话;
    4. 使用 Connection对象创建 用于操作sql的Statement对象;
    5. statement对象 .执行 sql语句,返回结果ResultSet 对象;
    6. 处理ResultSet中的结果;
    7. 关闭连接,释放资源。

    public class DBConnection {
        
        static final String  URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
        static final String USER_NAME ="louluan";
        static final String PASSWORD = "123456";
        
        public static void main(String[] args) {
            connectionTest();
        }
        
        public static void connectionTest(){
            
            Connection connection = null;
            Statement statement = null;
            ResultSet resultSet = null;
            
            try {
                //1.加载类,并注册驱动器(Driver会注册到DriverManager中)
                
                //加载Oracle数据库驱动
                Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
                
                //2.根据特定的URL,返回可以接受此URL的数据库驱动对象
                Driver driver = DriverManager.getDriver(URL);
                Properties props = new Properties();
                props.put("user", USER_NAME);
                props.put("password", PASSWORD);
                
                //3.使用数据库驱动创建数据库连接Connection会话
                connection = driver.connect(URL, props);
                
                //4.获得Statement对象
                statement = connection.createStatement();
                //5.执行 sql语句,返回结果
                resultSet = statement.executeQuery("select * from hr.employees");
                //6.处理结果,取出数据
                while(resultSet.next())
                {
                    System.out.println(resultSet.getString(2));
                }
                
                //7.关闭链接,释放资源
            } catch (ClassNotFoundException e) {
                System.out.println("加载Oracle类失败!");
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                //使用完成后管理链接,释放资源,释放顺序应该是: ResultSet ->Statement ->Connection
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    3.4JDBC的优势

    Java语言访问数据库操作完全面向抽象接口编程
    开发数据库应用不用限定在特定数据库厂商的API
    程序的可移植性大大增强

    4.JDBC的使用

    4.1JDBC的开发示例

    1. 准备数据库驱动包,并添加到项目的依赖中:
      在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。再配置该jar
      包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置
      Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的
      jar包都引入作为依赖。

    2. 建立数据库连接

    // 加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法
    区,并执行该类的静态方法块、静态属性。
    Class.forName("com.mysql.jdbc.Driver");
    // 创建数据库连接
    Connection connection =
        DriverManager.getConnection("jdbc:mysql://localhost:3306/test?
    user=root&password=root&useUnicode=true&characterEncoding=UTF-8");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    //MySQL数据连接的URL参数格式如下:
    jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

    1. 创建操作命令(statement)

    Statement statement = connection.createStatement();

    1. 执行sql语句
    ResultSet resultSet = statement.executeQuery(
                  "select id,sn,name,qq_mail,class_id from student");
    
    • 1
    • 2
    1. 处理结果集
    while (resultSet.next()) {
        int id = resultSet.getInt("id");
        String sn = resultSet.getString("sn");
        String name = resultSet.getString("name");
        int classesId = resultSet.getInt("classes_id");
        System.out.println(String.format("Student: id=%d, sn=%s, name=%s,
            classesId=%s", id, sn, name, classesId));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里可以把resultSet当作一个类似于迭代器的东西
    有一个指针指向它的第一行内容,next读取"指针"所在行内容
    然后get通过索引的方式找到对应的值.

    1. 释放资源(关闭结果集,命令,连接)
    //关闭结果集
    if (resultSet != null) {
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭命令
    if (statement != null) {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭连接命令
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5.JDBC常用接口和类

    5.1JDBC API

    Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的.
    所以掌握Java JDBC API (位于java.sql包下)即可掌握Java数据库编程.

    5.2数据库连接Connection

    Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:

    1. 一种是通过DriverManager(驱动管理类)的静态方法获取
    //加载JDBC驱动程序
    Class.forName("com.mysql.jdbc.Driver");
    
    //创建数据库连接
    Connection connection = DriverManager.getConnection(url);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 一种是通过DataSource(数据源)对象获取.实际应用中会使用DataSource对象
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java104?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("2222");
    
    • 1
    • 2
    • 3
    • 4

    以上两种方式的区别是:

    1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接.
    2. DataSource提供连接池的支持.连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收.

    5.3Statement对象

    Statement对象主要是将SQL语句发送到数据库中.
    JDBC API中主要提供了三种Statement对象.

    实际开发中最常用的是PreparedStatement对象,以下对其的总结:

    主要掌握两种执行SQL的方法:

    1. executeQuery()方法执行后返回单个结果集的,通常用于select语句
    2. executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update,insert,delete语句

    ResultSet对象

    ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问

    ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行.
    我们如果想要取得某一条记录,就要使用ResultSet的next()方法.
    如果我们想要得到ResultSet里的所有记录,就应该使用while循环

    6.总结

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class JDBCHello {
        public static void main(String[] args) throws SQLException {
            // 1. 使用 DataSource 描述 MySQL 服务器的位置.
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java104?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("2222");
    
            // 2. 和数据库服务器建立连接~
            Connection connection = dataSource.getConnection();
            // System.out.println(connection);
    
            // 3. 构造 SQL 语句. JDBC 操作数据库, 本质仍然是通过 SQL 来描述数据库操作~~
            //    例如, 进行一个插入数据的操作.
            //    直接用 String 格式的 SQL 还不行, 还需要搭配一个 特殊的类.
            String sql = "insert into student values(1, '张三')";
            PreparedStatement statement = connection.prepareStatement(sql);
    
            // 4. 执行 SQL 语句, insert, update, delete 都是通过 executeUpdate 来执行的.
            //    select 则是通过 executeQuery 来执行的.
            //    executeUpdate 的返回值是一个 整数 表示这个操作影响到几行~
            int n = statement.executeUpdate();
            System.out.println("n = " + n);
    
            // 5. 断开连接, 释放资源
            statement.close();
            connection.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    【Linux基础】3.1任务调度
    c++的库函数std::move() 与 完美转发函数 std:: forward 源码
    3GPP 5G R17标准冻结,RedCap作为重要特性值得关注!
    《六》BFC
    LVS-DR模式单网段和多网段案例实现
    java连接mysql数据库结构表批量生产word文档
    MQ学习之史上最全RabbitMQ(强烈建议收藏)
    Cypress(1)——如何安装及测试类型简要介绍
    淘宝/天猫电商平台获取商品数据按关键字搜索淘宝商品|优惠价|销量|价格|商品推荐案例
    JavaSE题
  • 原文地址:https://blog.csdn.net/qq_63511424/article/details/125883104