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