cms网站建设的实训总结,新手如何建站,佛山网站排名提升,建设网站需要哪些软硬件条件JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root
11.1 什么是JDBC
11.1.1 JDBC概述
JDBC的全称是Java数据库连接#xff08;Java Database Connectivit… JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root
11.1 什么是JDBC
11.1.1 JDBC概述
JDBC的全称是Java数据库连接Java Database Connectivity它是一套用于执行SQL语句的JavaAPI。应用程序可通过这套JavaAPI连接到关系数据库并使用SQL语句完成对数据库中数据的查询、新增、更新和删除等操作。不同的数据库如MySQL、Oracle等处理数据的方式是不同的如果直接使用数据库厂商提供的访问接口操作数据库应用程序的可移植性就会变得很差。例如用户在当前程序中使用的是MySQL提供的接口操作数据库如果换成Oracle数据库则需要重新使用Oracle数据库提供的接口这样代码的改动量会非常大。如果使用JDBC上述问题就不复存在了因为JDBC要求各个数据库厂商按照统一的规范提供数据库驱动程序在程序中由JDBC和具体的数据库驱动程序联系用户不必直接与底层的数据库交互使得代码的通用性更强。
11.1.2 JDBC驱动程序
JDBC本身提供的是一套数据库操作标准而JDBC中提供的这些标准又需要由各个数据库厂商实现每一个数据库厂商都会为其数据库产品提供一个JDBC驱动程序。目前比较常见的JDBC驱动程序可以分为以下4类。
1.JDBC-ODBC桥驱动程序 JDBC-ODBC桥驱动程序由Sun公司开发是JDK提供的数据库操作标准API这种类型的驱动程序实际是把所有JDBC的调用传递给ODBCOpen Database Connectivity开放数据库连接再由ODBC调用本地数据库驱动程序代码操作数据库中的数据。通过JDBC-ODBC桥驱动程序操作数据库的方式如图11-2所示。由于JDBC-ODBC桥驱动程序经过几次中间调用所以执行效率比较低。 2.本地API驱动程序 本地API驱动程序直接将JDBCAPI映射成数据库特定的客户端API。这种驱动程序包含特定数据库的本地API通过它可以访问数据库的客户端。通过本地API驱动程序操作数据库的方式如图11-3所示。通过本地API驱动程序访问数据库减少了ODBC的调用环节提高了数据库访问的效率。 3.网络协议驱动程序 网络协议驱动是用纯Java语言编写的。JDBC把对数据库的访问请求传递给网络上的中间件服务器中间件服务器先把请求转换为数据库通信协议请求然后再与数据库进行交互。使用这种类型的JDBC驱动程序的Java应用程序可以与服务器端完全分离具有很大的灵活性。通过网络协议驱动程序操作数据库的方式如图11-4所示。 4.本地协议驱动程序 本地协议驱动程序是用使用纯Java语言编写的。本地协议驱动程序通常是由数据库厂商直接提供的JAR包。本地协议驱动程序直接将JDBC调用转换为数据库特定的网络通信协议然后与数据库进行交互。通过本地协议驱动程序操作数据库的方式如图11-5所示。 在上述4种类型中JDBC-ODBC桥驱动程序由于执行效率不高更适合作为开发应用时的一种过渡方案如果是在内联网Intranet中的应用可以考虑本地API驱动程序如果是基于互联网Internet并且需要同时连接多个不同种类的数据库、并发连接要求高的应用可以考虑网络协议驱动程序如果是基于互联网Internet但连接单一数据库的应用可以考虑本地协议驱动程序。本章将基于驱动程序类型对JDBC进行讲解。
11.2 JDBC的常用API
1.Driver接口 Driver接口是所有JDBC驱动程序必须实现的接口该接口专门提供给数据库厂商使用。需要注意的是在编写Java应用程序时必须把使用的数据库驱动程序这里指MySQL驱动程序的JAR包)或类库加载到项目的classpath中。
2.DriverManager类 使用JDBC连接数据库需要用到DriverManager类它用于加载JDBC驱动程序并且创建Java应用程序与数据库的连接。在DriverManager类中定义了两个重要的静态方法。
方法名称功能描述registerDriver(Driver driver)该方法用于向DriverManager类注册给定的JDBC驱动程序getConnection(String urlString user,String password)该方法用于建立和数据库的连接并返回表示连接的Connection对象
3.Connection接口 DriverManager类的getConnection方法返回一个Connection对象它是表示数据库连接的对象只有获得该对象才能访问并操作数据库。一个应用程序可与单个数据库建立一个或多个连接也可以与多个数据库建立连接。
方法声明功能描述createStatement()用于创建一个Statement对象该对象可以将SQL语句发送到数据库prepareStatement(String sql)用于创建一个PreparedStatement对象该对象可以将参数化的动态SQL语句发送到数据库prepareCall(String sql)用于创建一个CallableStatement对象以调用数据库的存储过程isReadOnly()用于查看当前Connection对象的读写模式是否为只读模式setReadOnly()用于设置当前Connection对象的读写模式默认为非只读模式commit()使所有上一次提交/回滚后进行的更改成为持久更改并释放当前Connection对象持有的所有数据库锁setAutoCommit(boolean autoCommit)设置是否关闭自动提交模式roolback()用于取消在当前事务中进行的所有更改并释放当前Connection对象持有的所有数据库锁close()用于立即释放当前Connection对象的数据库和JDBC资源而不是等它们被自动释放isClose()用于判断当前Connection对象是否已被自动关闭
4.Statement接口Statement接口用于执行静态的SQL语句并返回一个结果对象。Statement接口对象可以通过Connection实例的createStatement方法获得该对象会把静态的SQL语句发送到数据库中编译执行然后返回数据库的处理结果。Statement接口提供了3个执行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.PreparedStatement接口 Statement接口封装了JDBC执行SQL语句的方法可以完成Java程序执行SQL语句的操作。然而在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件而使用Statement接口操作这些SQL语句过于烦琐并且存在安全方面的问题。针对这一问题JDBC API提供了扩展的PreparedStatement接口。PreparedStatement是Statement的子接口用于执行预编译的SQL语句。PreparedStatement接口扩展了带参数的SQL语句的执行操作该接口中的SQL语句可以使用占位符“”代替参数然后通过setter方法为SQL语句的参数赋值。
方法声明功能描述executeUpdate()在PreparedStatement对象中执行SQL语句。SQL语句必须是一个DML语句或者是无返回内容的SQL语句如DDL语句executeQuery()在PreparedStatement对象中执行SQL查询。该方法返回的是ResultSet对象setInt(int Indexint x)将指定位置的参数设置为指定的int类型的值setFloat(int index,float f)将指定位置的参数设置为float类型的值setLong(int indexlong l)将指定位置的参数设置为long类型的值setDouble(int index,double d)将指定位置的参数设置为double类型的值setBoolean(int index,boolean b)将指定位置的参数设置为boolean类型的值void setString(int Index,String x)将指定位置的参数设置为指定的String类型的值
在表11-4中DML数据操纵语言语句指的是操作数据库、表、列等的语句使用的关键字为CREATE、ALTER、DROP。DDL数据定义语言语句指的是对表中的数据进行增、删、改操作的语句使用的关键字为INSERT、UPDATE、DELETE。在为SQL语句中的参数赋值时可以通过输人参数与SQL类型相匹配的setXxx方法赋值。例如字段的数据类型为int或Integer那么可以使用setInt方法或setObject方法设置输人参数具体示例如下 String sqlINSERT INTO usersid,name,email) VALUES(?,,);Preparedstatement preStmtconn.prepareStatement(sql);preStmt.setInt(1,1);//使用参数与SQL类型相匹配的方法preStmt.setString(2,zhangsan);//使用参数与SQL类型相匹配的方法preStmt.setobject(3,zssina.com);//使用setObject方法设置参数preStmt.executeUpdate();6.ResultSet接口 ResultSet接口用于保存JDBC执行查询时返回的结果集该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标或指针ResultSet对象初始化时游标在表格的第一行之前调用next)方法可以将游标移动到下一行。如果下一行没有数据则next()方法返回false。在应用程序中经常使用next)方法作为while循环的条件来迭代结果集。
方法声明功能描述getString(int columnIndex)用于获取指定字段的String类型的值参数columnIndex代表字段的索引getString(String columnName)用于获取指定字段的String类型的值参数columnName代表字段的名称getInt(int columnIndex)用于获取指定字段的int类型的值getInt(String columnName)用于获取指定字段的int类型的值absolute(int row)将游标移动到结果集的第row条记录relative(int row)按相对行数正或负移动游标previous()将游标从结果集的当前位置移动到上一行next()将游标从结果集的当前位置移动到下一行beforeFirst()将游标移动到结果集的开头第一行之前isBeforeFirst()判断游标是否位于结果集的开头第一行之前afterLast()将游标指针移动到结果集的末尾最后一行之后isAfterLast()判断游标是否位于结果集的末尾(最后一行之后)first()将游标移动到结果集的第一行isFirst()判断游标是否位于结果集的第一行last()将游标移动到结果集的最后一行getRow()返回当前记录的行号getStatement()返回生成结果集的Statement对象close()释放当前结果集的数据库和JDBC资源
11.3 JDBC编程
11.3.1 JDBC 编程步骤
通常情况下使用JDBCAPI实现JDBC程序时首先需要加载并注册数据库驱动程序其次使用DriverManager类调用getConnection方法获取表示数据连接的Connection对象最后通过Connection对象调用相应方法获取Statement对象通过Statement对象执行SQL语句。执行SQL语句之后如果数据库有返回结果则将结果封装为ResultSet对象返回。 1 加载并注册数据库驱动程序 在连接数据库之前要加载数据库的驱动程序到Java虚拟机。加载数据库驱动程序操作可以通过java.lang.Class类的静态方法forNameStringclassName或DriverManager类的静态方法registerDriverDriverdriver实现具体示例如下
DiverManager.registerDiver(Driver Driver)或者
Class.forName(DriverName);调用registDriver方法时实际上创建了两个Driver对象对于只需加载驱动程序类来讲有些浪费资源使用forName)方法驱动程序类的名称是以字符串的形式填写的使用时可以把该驱动程序类的名称放到配置文件中如果需要切换驱动程序类会非常方便。所以在实际开发中常调用forName)方法注册数据库驱动程序。forName)方法中的参数DriverName表示数据库的驱动程序类。以MySQL数据库为例MySQL驱动程序类在MySQL6.0.2版本之前是com.mysql.jdbc.Driver加载示例代码如下
Class.forName(com.mysql.jdbc.Driver);而在MySQL6.0.2版本之后MySQL驱动程序类是com.mysql.cj.jdbc.Driver加载示例代码如下
Class.forName(com.mysql.cj.jdbc.Driver);在实际加载时用户需要根据数据库版本选择对应的驱动程序类
2 通过DriverManager类获取数据库连接 DriverManager类的getConnection方法用于获取JDBC驱动程序到数据库的连接通过DriverManager类获取数据库连接的具体方式如下
Connection conn DriverManager.getConnection(String url,String user,String pwd);从上述代码可以看出getConnection方法有3个参数分别表示连接数据库的URL、登录数据库的用户名和登录数据库的密码。以MySQL数据库为例数据库地址的书写格式如下
jdbc:mysql://hostname:port/databasename在上面的代码中“jdbcmysql”是固定的写法后面的hostname指的是主机的名称如果数据库在本机中hostname可以为localhost或127.0.0.1如果要连接的数据库在其他计算机中hostname可以是连接计算机的IP地址port指的是连接数据库的端口号MySQL端口号默认为3306databasename指的是MySQL中相应数据库的名称。
3.通过Connection对象获取Statement对象 获取Connection对象之后还必须创建Statement对象将各种SQL语句发送到连接的数据库中执行。如果把Connection对象看作一条连接程序和数据库的索道那么Statement对象就可以看作索道上的一辆缆车它为数据库传输SQL语句并返回执行结果。Connection创建Statement对象的方法有以下3个 1createStatement创建基本的Statement对象。 2prepareStatement根据传递的SQL语句创建PreparedStatement对象。 3prepareCall根据传人的SQL语句创建CallableStatement对象。 以创建基本的Statement对象为例创建方式如下
Statement stmtconn.createStatement();4.使用Statement执行SQL语句 创建了Statement对象后就可以通过该对象执行SQL语句。如果SQL语句运行后产生了结果集Statement对象会将结果集封装成ResultSet对象并返回。Statement有以下3个执行SQL语句的方法
execute可以执行任何SQL语句。executeQuery通常执行查询语句执行后返回代表结果集的ResultSet对象。executeUpdate主要用于执行DML语句和DDL语句。执行DML语句如INSERT、UPDATE或DELETE)返回受SQL语句影响的行数执行DDL语句返回0。以executeQuery方法为例调用形式如下
//创建SQL语句
String sqlSELECT name from users WHERE id1;
//执行SQL语句,获取结果集
ResultSet rsstmt.executeQuery(sql);需要注意的是在调用executeQuery方法和executeUpdate方法时如果作为参数的SQL语句有多行多条SQL语句将出现编译错误因此在构造SQL语句时如果SQL语句有多行需要将多行SQL语句加上双引号并使用十号连接起来。例如下面的SQL语句
String sqlINSERT INTO users(NAME,PASSWORD,email,birthday)VALUES(zhangs,123456,zssina.com,1980-12-04);ResultSetrsstmt.executeQuerysgl);5.操作结果集 如果执行的SQL语句是查询语句执行结果将封装成一个ResultSet对象该对象保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象取出查询结果。
6.关闭连接并释放资源 每次操作数据库结束后都要关闭数据库连接并释放资源以防止系统资源浪费。资源的关闭顺序和声明顺序相反关闭顺序依次为关闭ResultSet对象、关闭Statement对象、关闭Connection对象。为了保证在异常情况下也能关闭资源通常在try.catch语句的finally代码块中统一关闭资源。至此JDBC程序的大致实现步骤已经讲解完成。
11.3.2 实现第一个JDBC程序
1搭建数据库环境。在MySQL中创建名称为jdbc的数据库然后在jdbc数据库中创建users表创建数据库和表的SQL语句如下
CREATE DATABASE jdbc;
USE jdbc;
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(40),password VARCHAR(40),email VARCHAR(60),birthday DATE);jdbc数据库和users表创建成功后再向users表中插人3条数据SQL语句如下:
insert into users(NAME,PASSWORD,email,birthday) values(zhangs,123456,zssina.com,1980-12-04), (1isi,123456,1isisina.com,1981-12-04),(wangwu,123456,wangwusina.com,1979-12-04);为了查看数据是否添加成功使用SELECT语句查询users表中的数据执行结果如图11-7所示。
2创建项目环境导人数据库驱动程序。在IDEA中新建名称为chapterl1的Java项目右击项目名称在弹出的快捷菜单中选择New→Directory命令在弹出的对话框中将该目录命名为lib项目根目录中就会出现一个名称为lib的目录。将下载好的MySQL数据库驱动程序文件mysql-connector-java-8.0.15.jar复制到项目的lib目录中并把JAR包添加到项目里。在IDEA菜单栏中选择File→ProjectStructure→Modules→Dependencies命令单击最右侧加号后选择第一项“JARsordirectories”在弹出的对话框中选择下载好的JAR包并确认。最后可以看到mysql-connector-java-8.0.15.jar已添加到IDEA的依赖项中。成功添加MySQL的JAR包的界面如图所示。 将mysql-connector-java-8.0.15.jar添加到依赖项之后单击Apply按钮再单击OK按钮可以看到在ExternalLibraries下已经存在刚刚添加的JAR包。至此JAR包添加成功。加人数据库驱动程序后的项目结构如图所示。 3编写JDBC程序。在项目chapterl1的src目录下新建名称为com.itheima.jdbc.example的包在该包中创建Example01类该类用于读取数据库中的users表并将结果输出到控制台。Example01类的实现如文件所示。
import java.sql.*;public class Example01 {public static void main(String[] args) throws Exception {Statement stmt null;ResultSet rs null;Connection conn null;try {// 1. 注册数据库的驱动Class.forName(com.mysql.cj.jdbc.Driver);// 2.通过DriverManager获取数据库连接String url jdbc:mysql://localhost:3306/jdbc?serverTimezoneGMT%2B8useSSLfalse;String username root; //数据库用户名String password root; //数据库密码conn DriverManager.getConnection(url, username, password);// 3.通过Connection对象获取Statement对象stmt conn.createStatement();// 4.使用Statement执行SQL语句。String sql select * from users;rs stmt.executeQuery(sql);// 5. 操作ResultSet结果集System.out.println(id | name | password| email | birthday);while (rs.next()) {int id rs.getInt(id); // 通过列名获取指定字段的值String name rs.getString(name);String psw rs.getString(password);String email rs.getString(email);Date birthday rs.getDate(birthday);System.out.println(id | name | psw | email | birthday);}} catch (Exception e) {e.printStackTrace();} finally {// 6.回收数据库资源if (rs ! null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}rs null;}if (stmt ! null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}stmt null;}if (conn ! null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}conn null;}}}
}在文件中第9行代码通过Class的forName方法注册了MySQL数据库驱动程序。 第1116行代码通过DriverManager的getConnection方法获取数据库的连接。 第18行代码通过Connection对象获取Statement对象。 第20、21行代码调用Statement对象的executeQuery)方法执行SQL查询语句。第2333行代码使用ResultSet对象操作结果集并用while循环获取数据库的所有数据。 第3861行代码依次关闭ResultSet对象、Statement对象和Connection对象并释放资源。 运行结果所示。users表中的数据已输出控制台。至此第一个JDBC程序成功实现。在实现这个JDBC程序时有以下3点需要注意。 1注册驱动程序。虽然使用DriverManager.registerDriver(newcom.mysql.cj.jdbc.Driver))方法也可以完成注册但这种方式会使数据库驱动程序被注册两次。因为在Driver类的源码中已经在静态代码块中完成了数据库驱动程序的注册。为了避免数据库驱动程序被重复注册在程序中使用Class.forName方法加载驱动程序类即可。 2释放资源。由于数据库资源非常宝贵数据库允许的并发访问连接数量有限因此当数据库资源使用完毕后一定要释放资源。为了保证资源被释放在Java程序中应该将释放资源的操作放在finally代码块中。 3获取数据库连接。在MySQL8.0及以上版本中获取数据库连接时需要设置时区为北京时间serverTimezoneGMT%2B8因为安装数据库时默认为美国时间。如果不设置时区为北京时间系统会报告MySQL设置时区与当前系统时区不符的错误
更换URL地址
urljdbc:mysql://127.0.0.1:3306/jdbc?characterEncodingutf8useSSLtrue本章主要讲解了JDBC的基本知识包括什么是JDBC、JDBC的主要类和接口、JDBC的人门程序。通过本章的学习读者可以了解什么是JDBC熟悉JDBC的主要类和接口掌握如何使用JDBC操作数据库中的数据。