首页 > 其他分享 >JDBC介绍及使用

JDBC介绍及使用

时间:2022-09-30 08:56:16浏览次数:45  
标签:语句 JDBC 数据库 sql 使用 介绍 stu jdbc SQL

JDBC简介

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

简言之,JDBC就是对于java编码来说,在应用程序和数据库之间的一个中间层 API,有了中间层JDBC,你就可以面向JDBC API进行编程,不需要关注底层数据库细节。

在开发业务系统时,经常需要对数据进行持久化操作,将数据保存到硬盘中,比如对数据进行新增、查询、更新和删除。这时候就需要使用数据库,通常使用第三方数据库中间件来进行数据操作,应用程序只需要调用数据库中间件提供的api即可。由于市面上有很多数据库,如果提供的api不同,那么应用程序在使用不同的数据库时需要写不同的代码,带来维护的复杂性。这时候就需要一套标准,由不同的数据库厂家来共同这套遵守标准来提供实现给应用程序调用,jdbc便是这样一套标准。

一句话:JDBC提供了对Java程序员,数据库厂商及第三方中间件厂商的API。

JDBC核心接口和类

主要是java.sql.*中几个核心的类和接口:

① java.sql.DriverManager用来加载不同数据库厂商的JDBC驱动,并为创建新的数据库连接提供支持;

② java.sql.Driver指定数据库的驱动入口,DriverManager将通过该类作为连接数据的参数;

③ java.sql.Connection完成针对某指定数据库的连接功能;

④ java.sql.Statement在一个已经建立的连接中,作为SQL语句执行的容器,它有两个子类:

  java.sql.CallableStatement 用于执行数据库中已经创建好的存储过程。

  java.sql.PreparedStatement用于执行预编译的SQL语句。

⑤ java.sql.ResultSet用于存储执行特定SQL语句后返回的结果集。

下面演示下获取数据库连接的基本步骤,以MySQL为例:

<!--mysql驱动包-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

Java代码如下:

// ① 加载MySQL的JDBC的驱动
Class.forName("com.mysql.jdbc.Driver");

// ② 创建与MySQL数据库的连接类的实例
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);

注意:mysql8使用的驱动名为com.mysql.cj.jdbc.Driver,需要在url上面增加时区的参数,否则也是无法连接的。

8.0:

5.0:

说明:JDBC是使用SPI机制解析的,实现类是在数据库驱动包的META-INF/services/java.sql.Driver文件中声明的。

下面是几种常见的数据库连接:

(1) Oracle

驱动:oracle.jdbc.driver.OracleDriver 

URL:jdbc:oracle:thin:@machine_name:port:dbname 

注:machine_name:数据库所在的机器的名称; port:端口号,默认是1521

示例:jdbc:oracle:thin:@localhost:1521:goods

(2) MySQL

驱动:com.mysql.jdbc.Driver 

URL:jdbc:mysql://machine_name:port/dbname 

注:machine_name:数据库所在的机器的名称; port:端口号,默认3306

示例:jdbc:mysql://localhost:3306/goods

MySQL 8.0 以上的驱动连接的配置参数变化:

driverClass:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://localhost:3306/goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&rewriteBatchedStatements=true

(3) SQL Server

驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver 

URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname> 

注:machine_name:数据库所在的机器的名称; port:端口号,默认是1433

示例:jdbc:microsoft:sqlserver//localhost:1433;DatabaseName=sid

(4) DB2

驱动:com.ibm.db2.jdbc.app.DB2Driver 

URL:jdbc:db2://<machine_name><:port>/dbname 

注:machine_name:数据库所在的机器的名称; port:端口号,默认是5000

java.sql.DriverManager

其实我们今后只需要会用DriverManager的getConnection()方法即可: 

Class.forName(“com.mysql.jdbc.Driver”);//注册驱动 
String url = "jdbc:mysql://localhost:3306/web08"; 
String username = "root"; 
String password = "root"; 
Connection conn = DriverManager.getConnection(url, username, password);

java.sql.Connection

表示java程序和数据库的连接对象。 

  • Statement createStatement():创建Statement对象 
  • PreparedStatement prepareStatement(String sql) :创建PreparedStatement对象
  • CallableStatement prepareCall(String sql) :创建CallableStatement对象

java.sql.Statement

用于执行静态的SQL语句。

Statement接口

由createStatement创建,用于发送简单的SQL语句(最好是不带参数的)。

  • ResultSet executeQuery(String sql) :执行给定的 SQL 语句,通常为静态 SQL SELECT 语句,返回ResultSet结果集。
  • int executeUpdate(String sql) :执行给定的 SQL 语句,通常为静态 SQL SELECT 语句,返回更新的函数。
  • boolean execute(String sql):允许执行查询语句、更新语句、DDL语句。返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句。
  • void setFetchSize(int rows):每一次接收结果集的条数
  • void setMaxRows(int max) :ResultSet最大的条数
  • void setMaxFieldSize(int max):设置字段内容最大的字节数
  • void setQueryTimeout(int seconds):设置执行sql语句的超时时间,单位秒。
  • void addBatch(String sql):在批量执行的SQL语句中添加sql语句。参数sql表示一条sql语句。sql语句的类型可以是delete,update,insert的任意一种。执行每条SQL返回值类型为int。如果批量执行其他类型的SQL语句,可以使用存储过程。
  • int[] executeBatch():批量执行SQL,返回值为int数组。数组的每个值表示每条SQL语句更新记录数量的值。
  • void clearBatch():清空批量执行的SQL。
  • void cancel():取消正在执行的SQL语句。

示例:

Statement stmt = conn.createStatement();
//查询
stmt.setFetchSize(10);
ResultSet rs = stmt.executeQuery("select stu_code, stu_name, stu_address, class_code from tb_student");
while (rs.next()) {
    //columnIndex从1开始
    System.out.println("stu_code=" + rs.getString(1));
    System.out.println("stu_name=" + rs.getString("stu_name"));
}
rs.close();

//插入
int updateCount = stmt.executeUpdate("insert into tb_student(stu_code, stu_name, stu_address, class_code) values ('311004940', '测试学生', '广州天河海珠区新港东路', '4310')");
System.out.println("修改的行数:" + updateCount);

stmt.close();
conn.close();

PreparedStatement接口

继承Statement接口,由preparedStatement创建,用于发送含有一个或多个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。

支持动态输入參数的sql, 由于其预编译的sql具有可重用性,可极大地避免Oracle对sql的(应解析和软解析)解析时间,提高查询速度。

  • ResultSet executeQuery() :执行给定的 SQL 语句,通常为静态 SQL SELECT 语句,返回ResultSet结果集。
  • int executeUpdate() :执行给定的 SQL 语句,通常为静态 SQL SELECT 语句,返回更新的函数。
  • boolean execute():允许执行查询语句、更新语句、DDL语句。返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句。
PreparedStatement psmt = conn.prepareStatement("select stu_code, stu_name, stu_address, class_code from tb_student");

psmt.setFetchSize(10);
ResultSet rs = psmt.executeQuery();
while (rs.next()) {
    //columnIndex从1开始
    System.out.println("stu_code=" + rs.getString(1));
    System.out.println("stu_name=" + rs.getString("stu_name"));
}
rs.close();

psmt = conn.prepareStatement("update tb_student set stu_code='311004947',stu_name='刘洋' where stu_code='311004940'");
int updateCount = psmt.executeUpdate();
System.out.println("修改的行数:" + updateCount);

psmt.close();
conn.close();

CallableStatement接口

继承自PreparedStatement。由方法prepareCall创建,用于调用存储过程。

java.sql.ResultSet

Statement执行SQL语句时返回ResultSet结果集。

ResultSet提供的常用方法有:

  • boolean next():遍历查询结果,如果下面还有内容,游标就会向下移动,并返回true。
  • boolean previous():控制游标向上移动一行。无上一行,则返回失败。
  • boolean absolute(int row):控制游标移动到指定的下标,没有指定的位置,则返回false。row从1开始。
  • void afterLast():控制游标移动到最后一行的后面,移动成功调用isAfterLast方法会返回true;没有最后一行,则返回false。
  • void beforeFirst():把游标移动到第一行的前面,移动成功调用isBeforeFirst方法会返回True;没有第一行,则返回false。
  • String getString(int columnIndex):根据索引获取字段值,从1开始。
  • String getString(String columnLabel) :根据字段名获取字典值。这样的方式须要先通过label获取到索引。然后再依据索引取数据,比直接利用索引多走了一步。

注意:ResultSet在数据库连接关闭后(close掉)后就不能使用了,必须一直保持连接的状态才能使用,否则需要使用到RowSet离线结果集。

 

标签:语句,JDBC,数据库,sql,使用,介绍,stu,jdbc,SQL
From: https://www.cnblogs.com/xfeiyun/p/16743712.html

相关文章

  • 使用Java打包下载zip文件
    本文提供打包下载目标url文件为zip解决方案工具类packagecom.solvay.utils.file;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjavax.servlet.h......
  • 【转载】模式——使用MVVM设计模式的WPF程序开发
    原文:模式-具有模型-视图-视图模型设计模式|的WPF应用微软学习(microsoft.com)翻译:https://blog.csdn.net/weixin_37537723/article/details/106916294说明本文是笔......
  • WinUI3 使用Win32Api 实现窗口停靠常驻桌面功能。
    我们可以通过使用Win32Api来制作一些强大的功能,本文将通过示例代码来介绍使用Win32Api来之做桌面窗口停靠功能;效果图:   一.通过Nuget引入Vanara.PInv......
  • RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
    系列目录​​RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。​​​​RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。​​​​RabbitMQ入门系列:3、基础......
  • 使用python——matplotlib绘制的图表
    #绘制饼状图importmatplotlib.pyplotaspltimportnumpyasnpman=2245505woman=3254584man_prec=man/(man+woman)woman_prec=woman/(man+woman)labels=['男','女']col......
  • 用spring 创建ComboPooledDataSource和JdbcTemplate对象
    用spring创建ComboPooledDataSource和JdbcTemplate对象3.1添加ioc相关jar包 <dependency><groupId>org.springframework</groupId><artifactId>spring-core<......
  • Python中Selenium模块的使用
    目录​​Selenium的介绍、配置和调用​​​​Selenium的配置​​​​Selenium的调用​​​​Selenium的使用​​​​定位​​​​定位元素的使用​​​​定位下拉标签元素 ......
  • Python中math和cmath模块的使用
    目录​​Math模块​​​​Cmath模块​​Math模块pi                数字常量,圆周率e                 表示一个常量sqrt(x)      ......
  • Nacos配置中心用法详细介绍
            上篇文章介绍了Nacos作为注册中心的用法,除此之外,Nacos还能作为配置中心使用,那这篇文章就介绍下Nacos作为配置中心的基本用法,首先我们先了解下为什么......
  • Spring Cloud Gateway 服务网关的部署与使用详细介绍
    一、为什么需要服务网关:1、什么是服务网关:        传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网......