• Java数据库连接-JDBC


    什么是JDBC

    在Java开发中不可避免的要使用数据,在没有学习数据库前我们的数据都是保存在数组和集合中,学习完数据库后,把数据都保存在数据库中。而Java连接数据库时由于市面上的数据库较多,连接时语句不同。于是SUN公司决定开发一Java语言为接口的数据库应用程序开发接口-jdbc。

    JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。

                    

    从上图可以看出,应用程序使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。由于不同数据库厂商提供的数据库驱动不同,因此,为了使应用程序与数据库真正建立连接,JDBC不仅需要提供访问数据库的API,还需要封装与各种数据库服务器通信的细节为了帮助大家更好地理解应用程序如何通过JDBC访问数据库.

    JDBC的实现包括三部分。

    (1)JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql. Driver Manager类实现。

    (2)JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql. Driver接口。

    (3)JDBC驱动器:它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。

    JDBC常用API

    1. Driver接口

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

    2. DriverManager类

    Driver Manager类用于加载JDBC驱动并且创建与数据库的连接。

    getConnection()方法 用于建立和数据库的连接,并返回表示连接的 Connection对象

    getConnection(String url,String user,String pwd)

    3.Connection接口

    Connection接口代表Java程序和数据库的连接,Connection实现就像在应用程序中与数据库之间开通了一条渠道。

    重要方法

    createStatement()
    用于创建一个Statement对象来将SQL语句发送到数据库。

    4.Statement接口

    Statement接口用于向数据库发送SQL语句。

    execute(String sql)

    用于执行各种SQL语句,该方法返回一个boolean类型的值,如果为true,表示所执行的SQL语句具备查询结果,可通过Statement的getResultSet方法获得查询结果。
    executeUpdate(String sql)

    用于执行SQL中的Insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录的数目。
    executeQuery(String sql)

    用于执行SQL中的select语句,该方法返回一个表示查询结果的ResultSet对象 。

    5.ResultSet接口

    ResultSet接口表示 select查询语句得到的结果集,该结果集封装在一个逻辑表格中。在 ResultSet接口内部有一个指向表格数据行的游标,ResultSet对象初始化时,游标在表格的第一行之前。

    getXXX

    getString(int columnIndex):用于获取指定字段的String类型的值,参数columnIndex代表字段的索引
    getString(String columnName):用于获取指定字段的String类型的值,参数column Name代表字段的名称
    getInt(int columnIndex):用于获取指定字段的int类型的值,参数columnIndex代表字段的索引

    getInt(String columnName):用于获取指定字段的int类型的值,参数columnName代表字段的名称
    getDate(int columnIndex):用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引
    getDate(String columnName):用于获取指定字段的Date类型的值,参数column Name代表字段的名称

    next():将游标从当前位置向下移一行
    absolute(int row):将游标移动到此Resultset对象的指定行
    afterLast():将游标移动到此ResultSet对象的末尾,即最后一行之后
    beforeFirst():将游标移动到此Resultset对象的开头,即第一行之前
    previous():将游标移动到此ResultSet对象的上一行
    ResultSet接口中定义了大量的getXxx()方法,采用哪种getXxx()方法取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,注意:字段的索引是从1开始编号的

    6. PreparedStatement接口

    PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。

    setXXX

    setInt(int parameterIndex, int x):将指定参数设置为给定的int值

    setFloat(int parameterIndex, float x):指定参数设置为给定的float值

    setString(int parameterIndex, String x):将指定参数设置为给定的String值

    setDate(int parameterIndex, Date x):将指定参数设置为给定的Date值

    addBatch():将一组参数添加到此PreparedStatement对象的批处理命令中

    executeUpdate():在此PreparedStatement对象中执行SQL语句,该语句必须是个DML语句或者是无返回内容的SQL语句,比如DDL语句。

    executeQuery():在此PreparedStatement对象中执行SQL查询,该方法返回的ResultSet对象。

    注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。

    PreparedStatement比Statement好在哪里?

    1提高了代码的可读性和可维护性。虽然使用PreparedStatement来替代Statement会多几行代码,但避免了烦琐麻烦又容易出错的SQl语句拼接,提高了代码的可读性和可维护性。
    2.提高了SQL语句执行的性能。创建Statement对象时不使用SQL语句做参数,不会解析和编译SQl语句,每次调用方法执行SQL语句时都要进行SQl语句解析和编译操作,即操作相同仅仅是数据不同。
    3.提高了安全性。PreparedStatement使用预编译语句,传入的任何数据都不会和已经预编译的SQl语句进行拼接,避免了SQL注入攻击。

    所以一般开发中使用preparedStatement,不使用Statement。

    实现第一个JDBC程序

    1.加载并注册数据库驱动

    1. DriverManager.registerDriver(Driver driver);
    2. Class.forName("DriverName");//使用这个要导入驱动包

    mysql 使用com.mysql.jdbc.Driver 注意mysql6以及之后的版本需要更新到新版驱动,对应的Driver是"com.mysql.cj.jdbc.Driver"

    2.通过DriverManager获取数据库连接

    Connection conn= DriverManager.getConnection(String url, String user, String pass);
    从上述方式可以看出,getConnection()方法中有三个参数,它们分别表示数据库url、登录数据库的用户名和密码。

    JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
     JDBC URL的标准由三部分组成,各部分间用冒号分隔。
      jdbc:<子协议>:<子名称>
      协议:JDBC URL中的协议总是jdbc
      子协议:子协议用于标识一个数据库驱动程序
      子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。

     

    对于 MYSQL 数据库连接,url采用如下形式: jdbc:mysql://localhost:3306/mysql

    3.通过Connection对象获取Statement对象。

    4.使用Statement执行SQL语句

    1.execute():可以执行任何SQL语句。

    2.executeQuery():通常执行查询语句,执行后返回代表结果集的Resultset对象。

    3.executeUpdate():主要用于执行DML和DDL语句。执行DML语句,如INSERT、UPDATE或 DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0。

    5.操作ResultSet结果集。

    1.next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法

    2.getXxx()获取指针指向行,特定列的值。

    6.回收数据库资源。关闭数据库连接,释放资源,包括关闭ResultSet、Statement和Connection等资源。

    代码实现

    1.建立数据库

    1. CREATE DATABASE chapter01;
    2. USE chapter01;
    3. CREATE TABLE users(
    4. id INT PRIMARY KEY AUTO_INCREMENT,
    5. name VARCHAR(40),
    6. password VARCHAR(40),
    7. email VARCHAR(60),
    8. birthday DATE
    9. )CHARACTER SET utf8 COOLLATE utf8_genneral_ci;
    10. 数据库和表创建成功后,再向users表中插入三条数据,SQL语句如下所示。
    11. INSERT INTO users(NAME,PASSWORD,email,birthday)
    12. VALUES('zs','123456','zs@sina.com','1980-12-04');
    13. INSERT INTO users(NAME,PASSWORD,email,birthday)
    14. VALUES('lisi',123456,1isi@sina.com,'1981-12-04');
    15. INSERT INTO users(NAME,PASSWORD,email,birthday)
    16. VALUES('wangwu',123456,'wangwu@sina.com','1979-12-04');

    2、导入数据库驱动

    第一步::在当前项目下创建一个lib的目录:

    第二步:把mysql的驱动jar拷贝到lib目录:

     

    第三步:把lib添加到项目中,作为当前项目的第三方库

     

     

     

     

    3.编写JDBC程序

    1. package cn.itcast.jdbc.example;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. import java.sql.Date;
    8. public class Example01 {
    9. public static void main(String[] args) throws SQLException {
    10. //1.注册数据库的驱动
    11. Class.forName("com.mysql.jdbc.Driver");
    12. //2.通过 DriverManager获取数据库连接
    13. String url="jdbc:mysql://localhost:3306/chapter01";
    14. String usernames="root";
    15. String password="itcast";
    16. Connection conn=DriverManager.getConnection(url, username, password);
    17. //3.通过 Connection对象获取 Statement对象
    18. Statement stmt= conn.createStatement();
    19. //4.使用 Statement执行SQL语句
    20. String sql="select * from users";
    21. ResultSet rs=stmt.executeQuery(sql);
    22. //5、操作 ResultSet结果集
    23. System.out.println("id|name|password|email|birthday");
    24. while (rs.next()) {
    25. int id=rs.getInt("id"); //通过列名获取指定字段的值
    26. String name=rs.getString("name");
    27. String psw=rs.getString("password");
    28. String email=rs.getString("email");
    29. Date birthday=rs.getDate("birthday");
    30. System.out.println(id+"|"+name+"|"+psw+"|"+email+"|"+birthday);
    31. }
    32. //6.回收数据库
    33. rs.close();
    34. stmt.close();
    35. conn.close();
    36. }
    37. }

     新手上路,请多多指教。

     

  • 相关阅读:
    [附源码]Python计算机毕业设计Django点餐系统
    多台的UPS该如何实现系统化的集中监控呢?
    SAP message TK 248 solved
    不仅仅是图书信息管理系统
    go 条件变量
    MySql数字保留两位小数
    浅析Relaxed Ordering对PCIe系统稳定性的影响
    pytorch PythonAPI torch.....................
    pyqt designer的版本问题
    机器学习-数值特征
  • 原文地址:https://blog.csdn.net/weixin_48031392/article/details/126752944