JDBC使用

[复制链接]
发表于 2026-1-24 17:51:25 | 显示全部楼层 |阅读模式
7.2 创建JDBC应用
7.2.1 创建JDBC应用步调的步调
使用JDBC利用数据库中的数据包罗6个根本利用步调:
(1)载入JDBC驱动步调:
起首要在应用步调中加载驱动步调driver,使用Class.forName()方法加载特定的驱动步调,每种数据库管理体系的驱动步调差别,由数据库厂商提供。
(2)界说毗连URL,创建数据库毗连对象:
通过DriverManager类的getConnection()方法得到表现数据库毗连的Connection类对象。
(3)创建Statement对象
获取Connection对象以后,可以用Connection对象的方法创建一个Statement对象的实例。
(4)实验查询或更新:
Statement对象可以实验SELECT语句的executeQuery()方法或实验INSERT、UPDATE、DELETE语句的executeUpdate()方法。
(5)利用结果集:
使用ResultSet对象对数据库利用返回的结果举行处理处罚。ResultSet包罗一些用来从结果会集获取数据并生存到Java变量中的方法。重要包罗next()方法,用于移动结果集游标,逐行处理处罚结果集,getString()、getInt()、getDate()、getDouble()等方法,用于将数据库中的数据范例转换为Java的数据范例。
(6)开释资源:
使用与数据库相干的对象非常耗内存,因此在数据库访问后要关闭与数据库的毗连,同时还应该关闭ResultSet、Statement和Connection等对象。可以使用每个对象本身的close()方法完成。
7.2.2 JDBC应用步调的实现
(1)载入JDBC驱动步调
在JavaAPI中的Class类提供了加载驱动步调的方法,方法格式如下:
参数className表现驱动类的形貌符字符串,比方加载Oracle驱动的语句形貌符为:
版本驱动,一样寻常指5.x版本
版本驱动,一样寻常指8.x版本
Mysql数据库的JDBC驱动步调文件可到Mysql官方网站下载。留意加载驱动步调的时间会抛出ClassNotFoundException,SQLException非常。
(2)界说毗连URL,创建数据库毗连对象
DriverManager类提供了getConnection()方法可得到指定命据库的毗连对象,方法格式如下:
MySQL数据库的url参数格式为:
下面语句是创建MySQL数据库毗连对象的语句:
更多的创建Connection对象的方法,同砚们可以查阅JavaAPI文档
(3)创建Statement对象
Connection接口中提供了得到Statement对象的方法,方法格式如下:
(4)实验查询或更新
获取Statement对象后,就可以通过Statement对象的executeQuery()或exeucteUpdate()方法实验查询大概更新利用,有关方法的详细表明,同砚们可以查阅JavaAPI文档
(5)利用结果集
ResultSet接口提供对结果集举行利用的方法,重要包罗:
1boolean next() throws SQLException:移动结果集利用指针。
2getXxx(String columnName) throws SQLException:根据传入列的名字获取指定列的值。
3getXxx(1) throws SQLException:根据传入列的编号获取指定列的值。
SQL范例与Java数据范例差别,下表列出了SQL范例与Java数据范例的对应关系。
SQLType``JavaType``CHAR``String``VARCHAR``String``LONGVARCHAR``String``NUMERIC``java
.math.BigDecimal``DECIMAL``java
.math.BigDecimal``BIT``boolean``TINYINT``byte``SMALLINT``short``INTEGER``int``BIGINT``long``REAL``float``FLOAT``double``DOUBLE``double``BINARY``byte[]``VARBINARY``byte[]``LONGVARBINARY``byte[]``DATE``java
.sql.Date``TIME``java
.sql.Time``TIMESTAMP``java
.sql.Timestamp``更多的利用结果集的方法,同砚们可以查阅JavaAPI文档
(6)开释资源
数据库利用完成后,必要调用ResultSet、Statement、Connection接口中的关闭方法,开释相干资源,关闭序次如下:
起首关闭结果集ResultSet对象
然后关闭Statement对象
末了关闭Connection对象。
例: 接纳JDBC资源示例代码
Java
  1.     **/****
  2. **     * 回收JDBC资源示例代码**
  3. **     */**
  4.     **public** **static** **void**  **close**(**ResultSet** **resultSet**, **Statement** **statement**,  **Connection** **connection**)**{**
  5.     **try**
  6.     **{**
  7.     **if** **(** **resultSet**!=**null**)**{**
  8.     **resultSet**.**close**(**)**;
  9.     **}**
  10.     **}**catch**(**SQLException **e**)**{**
  11.     **System**.**out**.**println**(**e**.**getMessage**(**)**)**;**
  12.     **}**
  13.     **try**
  14.     **{**
  15.     **if** **(** **statement**!=**null**)**{**
  16.     **statement**.**close**(**)**;
  17.     **}**
  18.     **}**catch**(**SQLException **e**)**{**
  19.     **System**.**out**.**println**(**e**.**getMessage**(**)**)**;**
  20.     **}**
  21.     **try**
  22.     **{**
  23.     **if** **(**connection **!=**null**)**{
  24.     **connection**.**close**(**)**;
  25.     **}**
  26.     **}**catch**(**SQLException **e**)**{**
  27.     **System**.**out**.**println**(**e**.**getMessage**(**)**)**;**
  28.     **}**
  29.     **}**
复制代码
7.2.3 JDBC中重要的类及常用方法
使用JDBC编写访问数据库的应用步调,必要颠末加载数据库驱动步调、创建毗连、创建Statement对象、发送SQL语句、分析利用结果等步调,它们由JDBC API中一组类的方法实现。重要的类如下:
(1)Class类(相识即可,后续内容会讲)
Class类全称java
.lang.Class,Java步调运行时会自动创建步调中的每个类的Class对象,通过Class类的方法,可以得到步调中每个类的信息。Class类方法重要包罗:
public static Class forName(String className):该方法根据给定的字符串参数返回相应的Class对象。例:Class.forName(“com.mysql.jdbc.Driver”)的作用是加载Oracle驱动。
public String getName():该方法返回类名,例str.getClass().getName())。
假如想相识更多Class类的别的方法,可以查阅Java API文档。
(2)DriverManager类
DriverManager类在用户步调和数据库体系之间维护着与数据库驱动步调之间的毗连。它实现驱动步调的装载、创建与数据库体系毗连的Connection类对象。DriverManager类的方法重要包罗:
Java
public static Connection getConnection(String url, String user, String password)
//根据url、数据库登录的用户名、暗码获取一个数据库的毗连对象。
(3)Connection接口
Connection用于管理到指定命据库的毗连。
Connection con=DriverManager.getConnection (url, username, password);
Connetction类中紧张的成员方法包罗:
createStatement()方法:创建Statement类的实例。
prepareStatement()方法:创建PreparedStatement类的实例。
close():立即开释此Connection对象的数据库和JDBC资源,而不是等候它们被自动开释。
(4)Statement接口
Statement数据库利用类提供实验数据库利用的方法,如更新、查询数据库记载等。
Statement对象的创建方式如下:
Statement stmt=con.createStatement();
Statement类中紧张的成员方法包罗:
executeQuery()方法:它用来实验一个查询语句,参数是一个String对象,就是一个SELECT语句。它的返回值是ResultSet类的对象,查询结果封装在该对象中。
例:stmt.executeQuery("select * from users where username=‘张三’ and password=‘123’ ");
executeUpdate()方法:它用来实验更新利用,参数是一个String对象,即一个更新数据表记载的SQL语句。使用它可以对表中的记载举行修改、插入和删除等利用。例:
Java
复制代码
stmt.executeUpdate(“INSERT INTO users(username,password) values(‘刘青’, ‘aaa) ”);
stmt.executeUpdate(“UPDATE users set password=‘bbb’ where username**=‘张三’ ”)**;
stmt.executeUpdate(“DELETE from users where username=‘李四’ ”);
插入后想立即获取返回的主键,通过设置Statement.RETURN_GENERATED_KEYS来实现:
  1. java
复制代码
//实验INSERT语句,阐明要返回数据库天生的主键
int count = stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
System.out.println(“乐成插入”+count+“条记载!”);
//产生的主键以结果集的情势返回
rs = stmt.getGeneratedKeys();
//遍历结果集,输出主键,现实上结果集只有一条记载
while(rs.next()){
  1. **long** **id** **=** **rs**.**getLong**(**1**)**;**
  2. **System**.**out**.**println**(**"产生的主键是:"**+**id**)**;**
复制代码
}
使用它还可以创建和删除数据表及修改数据表结构。例:
close():关闭Statement对象。
Statement接口的很多多少方法都是重载的,假如想相识更多别的方法,可以查阅JavaAPI文档。
(5)ResultSet接口
ResultSet结果集类提供对查询结果集举行处理处罚的方法。例:
ResultSet rs=stmt.executeQuery(" select * from users ");
ResultSet对象维持着一个指向表格的行的指针,开始时指向表格的起始位置(第一行之前)。 ResultSet类常用的方法包罗:
next()方法:光标移到下一条记载,返回一个boolean值。
previous()方法:光标移到前一条记载。
getXXX()方法:获取指定范例的字段的值。调用方式 getXXX(“字段名”) 或 getXXX(int i)。i值从1开始表现结果会集第一列的字段。
close():关闭ResultSet对象。
例:
ResultSet接口提供的getXxx方法如下表所示
Method``JavaTechnologyTypeReturned``getASCIIStream``java
.io.InputStream``getBigDecimal``java
.math.BigDecimal``getBinaryStream``java
.io.InputStream``getBoolean``boolean``getByte``byte``getBytes``byte[ ]``getDate``java
.sql.Date``getDouble``double``getFloat``float``getInt``int``getLong``long``getObject``Object``getShort``short``getString``java
.lang.String``getTime``java
.sql.Time``getTimestamp``java
.sql.Timestamp``getUnicodeStream``java
.io.InputStream of Unicode characters``下面以用户表t_user为例,阐明使用JDBC对数据库举行利用的方法,用户表结构如表所示:
名称``数据范例``主键``是否为空``阐明``ID``number``是``用户编号``NAME``Varchar2(50)``用户名``AGE``varchar2(5)``用户年岁``BIRTH``date``用户生日``PWD``varchar2(20)``否``用户暗码``【例】使用JDBC查询数据库表t_user的全部数据。
步调运行结果如下:
7:zhangsan:age:2015-09-01
8:lisi:24:2015-09-01
9:wangwu:25:2015-09-01
10:wang:23:2015-09-01
以上给各人大略的先容了一下JDBC中涉及到的常用相干类和接口,每个类和接口包罗的方法先容的不是非常全面,渴望各人在后续的学习过程中,能充实的使用JavaAPI这个工具,不绝提拔本身的学习本事。
7.2.4 JDBC日期时间处理处罚
上面例题中取出来的日期与数据库中存储的有所差别,数据库中birth列包罗日期和时间,而上例中只表现了日期,没偶然间。这是由于获取日期时使用的是getDate()。对于数据库中差别的时间范例,要分别接纳与之相对应的Java包装类来存取: 
1日期范例用java
.sql.Date 
2时间范例用java
.sql.Time 
3日期/时间范例用java
.sql.Timestamp;
getTimestamp()可以把年代日时分秒都取出来,getDate()只能取出年代日,getTime()只能取出时分秒。
要把JDBC的日期/时间范例转换为字符串,则可以使用下列方法:
怎样把java
.sql.Timestamp转换为java
.util.Date ?java
.sql.Timestamp是java
.util.Date的子类,不必要做任何转换直接赋值即可,看下面步调段:
反过来,怎样把java
.util.Date转换为java
.sql.Timestamp呢?java
.util.Date是java
.sql.Timestamp的父类,要如许转换:
7.2.5 JDBC封装工具类
通常,无论是对数据举行查询利用,照旧举行增编削利用,都必要打开毗连,关闭资源等利用,因此,可以把对把打开毗连和关闭毗连封装到一个工具类里。本章反面全部例子对数据访问所用毗连都是一样的。下面的DBUtil类封装了打开毗连和关闭毗连方法。
【例】封装打开毗连和关闭资源的DBUtil类。
步调分析:关闭毗连会抛出非常,若遇到非常步调会心外停止,因此要处理处罚非常。而为了包管关闭资源语句在出现非常时也会实验到,因此要把它放到finally语句中。别的,由于查询利用才必要关闭ResultSet资源,增编削是不必要关闭ResultSet资源的,因此DBUtil类中对关闭利用举行了重载。
刚才我们界说了数据库通用处理处罚类DBUtil,接下来我们通过一个实例,来看一下这个类应该怎么应用。
【例7-3】使用DBUtil类利用数据库
调用query()方法输出结果:
7                                                      z                      h                      a                      n                      g                      s                      a                      n                                                  zhangsan                 zhangsan  23                                                      2015                      年                      09                      月                      01                      日                       15                      :                      15                      :                      068                                                  2015年09月01日 15:15:06 8                 2015年09月01日 15:15:068  lisi                                                      24                                                  24                 24  2015年09月01日 15:15:23
9                                                      w                      a                      n                      g                      w                      u                                                  wangwu                 wangwu  25                                                      2015                      年                      09                      月                      01                      日                       15                      :                      15                      :                      5210                                                  2015年09月01日 15:15:52 10                 2015年09月01日 15:15:5210  hello1                                                      500                                                  500                 500  2015年09月01日 15:16:03
7.2.6 SQL注入标题
在使用Statement对象查询数据库时,由于界说的SQL语句是拼接的,有大概出现SQL注入标题。所谓SQL注入,就是通过把SQL下令插入到查询字符串,终极到达诱骗服务器实验恶意的SQL下令。接下来我们通过一段代码来演示一下SQL注入案例。
【例】登录功能SQL注入示例。
步调分析:上例中若传入的用户名为sadfsdf or 1=1,则不管用户名和暗码是否精确,都能乐成登录,由于1=1永久为真,和别的条件举行or利用,也永久为真,以是不管用户名和暗码是否精确,都能乐成登录,这就是SQL 注入标题。
7.3 PreparedStatement对象
PreparedStatement对象表现预编译的SQL语句的对象,为办理Statement静态拼接所产生的SQL注入标题,引入了PreparedStatement接口。PreparedStatement接口是Statement接口的子接口,允许使用差别的参数多次实验同样的SQL语句。Connection接口提供创建PreparedStatement对象的方法,可指定SQL语句:
PreparedStatement对象继承了Statement,但PreparedStatement语句中包罗了告诫预编译的SQL语句,因此可以得到更高的实验服从。固然使用Statement可以对数据库举行利用,但它只实用于简朴的SQL语句。假如必要实验带参数的SQL语句时,我们必须使用PreparedStatement类对象。PreparedStatement对象用于实验带或不带输入参数的预编译的SQL语句,语句中可以包罗多个用问号?代表的字段,在步调中可以使用setXxx()方法设置该字段的内容,从而增强了步调筹划的动态性。         
比方,在案例中要查询编号为1的职员信息,可用以下代码段:
接着当我们需查询编号为2的职员信息时,我们仅需以下代码:
ps.setInt(1,2);
PreparedStatement同Statement对象一样提供了很多根本的数据库利用方法,下面列出了实验SQL下令的3种方法。
【例】使用PreparedStatement办理例上面例子登录功能的SQL注入标题。
步调分析:接纳以上方式,登录不能乐成,办理了sql注入标题。 PreparedStatement的参数化的查询可以制止大部门的SQL注入。在使用参数化查询的情况下,数据库体系不会将参数的内容视为SQL指令的一部门来处理处罚,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有粉碎性的指令,也不会被数据库所运行。
PreparedStatement接口setXxx()方法如表所示。
Method``SQLType``setASCIIStream``LONGVARCHAR produced by an ASCII stream``setBigDecimal``NUMERIC``setBinaryStream``LONGVARBINARY``setBoolean``BIT``setByte``TINYINT``setBytes``VARBINARY or LONGVARBINARY  (depending on the size relative to  the limits on VARBINARY)``setDate``DATE``setDouble``DOUBLE``setFloat``FLOAT``setInt``INTEGER``setLong``BIGINT``setNull``NULL``setObject``The given object that is converted to the target SQL type  before being sent``setShort``SMALLINT``setString``VARCHAR or LONGVARCHAR (depending on the size  relative to the driver’s limits on VARCHAR)``setTime``TIME``setTimestamp``TIMESTAMP``【例】使用PreparedStatement实现对用户表的增编削查利用。
在使用PreparedStatement对象实验SQL下令时,下令被数据库举行分析和编译,然后被放到下令缓冲区。然后,每当实验同一个 PreparedStatement对象时,它就会被再分析一次,但不会被再次编译。在缓冲区中可以发现预编译的下令,而且可以重新使用。在有大量用户的企业级应用软件中,常常会重复实验雷同的SQL下令,使用PreparedStatement对象带来的编译次数的淘汰可以或许进步数据库的总体性能。假如不是在客户端创建、预备、实验PreparedStatement任务必要的时间长于Statement任务,发起在除动态SQL下令之外的全部情况下使用PreparedStatement对象。相对于Statement,PreparedStatement的优点如下:
●可动态设置参数。
●增长了预编译功能
●进步实验速率。
完成4级项目1
7.4 用JDBC毗连差别的数据库
相识即可,本节给出的代码因差别的数据库版本大概不划一大概失效,请随时参考官网。
上面我们教学了使用JDBC毗连Oracle数据库的方法,由于JDBC是一套数据库毗连的标准,以是毗连别的关系型数据库也都大同小异,两点区别在于:    
1、数据库驱动路径差别
2、毗连数据库的url差别
如下是各种数据库的JDBC毗连方式:
(1)MySql数据库
(2) DB2数据库
(3)Sybase数据库
(4)SQLServer数据库
7.5 事件处理处罚
本节内容仅供有余力的且把握了Oracle数据库的同砚参考使用。
7.5.1事件的概念
事件是保持数据划一性的一种数据库机制,通常大多数应用体系中,除了查询利用(SELECT)不必要对事件举行控制之外,别的数据利用(INSERT、UPDATE、DELETE)都会涉及到事件的利用,在JDBC中,事件重要是由数据库毗连对象Connection的相干方法来控制,涉及到重要方法包罗:
1.setAutoCommit(boolean autoCommit):将此毗连的自动提交模式设置为给定状态。
2.commit():使全部上一次提交/回滚后举行的更改成为长期更改,并开释此 Connection 对象当前持有的全部数据库锁。
3.rollback():取消在当前事件中举行的全部更改,并开释此 Connection 对象当前持有的全部数据库锁。假如要取消事件中的利用,则可以使用ROLLBACK下令。实验该下令后,事件中的全部利用都被取消,数据库规复到事件开始之前的状态,同局势务所占用的体系资源和数据库资源被开释。
假如只想取消事件中的部门利用,而不是取消全部利用,则可以在事件内部设置生存点,将一个大的事件分别为多少个构成部门,如许就可以将事件回滚到指定的生存点。
1connection.rollback();//回滚事件。
2SavePoint sp = connection.setSavepoint(); //设置生存点
3connection.rollerbak(sp); //回滚到生存点
4connection.commit();
可以使用SAVEPOINT语句设置生存点,
1.setSavepoint():在当前事件中创建一个未定名的生存点 (savepoint),并返回表现它的新 Savepoint 对象。
2.setSavepoint(String name) :在当前事件中创建一个具有给定名称的生存点,并返回表现它的新Savepoint 对象。
比方,一个事件中包罗3个插入利用、一个更新利用和2个生存点,语句为:
事件回滚的过程表现图如图7-4所示。

上述前三个方法的使用频率特别高,通常应用体系中一个业务利用的实现步调为:
1在创建好数据库毗连对象Connect之后,调用setAutoCommit(false)方法,把自动提交模式设置为假,如许就制止了数据库实验自动提交,而把是否提交的自动权交到步调员手中。
2按照用户的利用序次实验相应的SQL语句。
3在实验每一个SQL语句过程中,假如出现非预期的结果,则调用rollback()方法,实验回滚利用。
4全部SQL语句实验完成后,通常调用commit()方法实验提交利用,固然这时也可以实验回滚利用。
7.5.2 JDBC实现事件处理处罚
接下来我们通过一个模仿转账实例来看一下JDBC中事件的利用。

步调分析:上例中实现把张三账户的100块钱转给李四,若不出现非常,则数据库中张三的钱数为2900,李四的钱数为2100。如图所示。

假如上例中把抛出非常的语句去掉再次运行,会抛出运行时非常,而数据库中数据如图所示。

在张三转出之后,李四转入之前之间抛出个非常,则会出现张三的钱数淘汰,而李四的钱数却没有增长,转出的100块钱丢失了。出现了数据不划一标题,若要办理上述标题,必要用到JDBC的事件处理处罚。
【例】使用事件办理上一例题中的数据不划一标题。
7.6 在MVC头脑中的DAO模式
本节内容仅供有余力的同砚参考使用。
现实项目中常常使用MVC分层头脑实现对数据库的利用,MVC模式中的Model(模子)是应用步调中用于处理处罚应用步调业务逻辑的部门。View(视图)是应用步调中处理处罚数据表现的部门,通常视图是依据模子数据创建的。Controller(控制器)是应用步调中调和Model组件和View组件的部门,通常控制器负责从视图读取数据,控制用户输入,并向模子发送数据。
使用MVC头脑举行DAO筹划与框架搭建代码如下:
对于数据库的每一张表,都要界说一个数据访问类,先界说访问用户表的接口UserDao。之以是界说一个数据访问的接口,是由于面向接口编程,可以或许起到封装息争耦合的作用,而面向详细类编程。当类中的方法改变时,调用它的类也要相应做出变更,以是面向对象的一条焦点编程头脑是更多的接纳面向接口编程。下面是访问数据库接口的实现类。
DAO的详细实现类。
本节重要报告了JDBC中的常用类、接口以及方法的使用,为了更好的给读者展示结果,实例代码根本都写到数据访问对象DAO中,比方本章中大量出现的UserDAO类。
在现实项目标编写过程中,通常都是按照Model-View-Control(模子层-视图层-控制层)架构模式来构造代码,通常来说,数据访问对象DAO是属于模子层的一种对象,专门用来编写对数据库中数据的增编削查利用,而对数据库毗连对象以及事件的管理,通常不会放到数据访问对象DAO中来处理处罚,否则,假如每个DAO的方法都来创建一个Connection毗连对象,就会过多的占用数据毗连资源,同时也就无法举行事件控制了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表