(第九章)整合数据库

第九章整合数据库

目录

第九章整合数据库

1、JDBC入门

1.1JDBC简介

1.2连接数据库

1.3使用Statement、ResultSet

1.4使用PreparedStatement、CallableStatement

2、JDBC进阶

2.1使用DataSource取得连接

2.2使用ResultSet卷动、更新数据

2.3批次更新

2.4Blob与Clob

2.5事务简介

2.6metadata简介

2.7RowSet简介

3、使用SQL标签库

3.1数据源、查询标签

3.2更新、参数、事务标签


1、JDBC入门

JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行实现,开发人员无需了解底层数据库驱动程序的差异性,直接使用即可。

1.1JDBC简介

数据库本身是个独立运行的应用程序,编写的应用程序是利用网络通信协议与数据库进行命令交换,以进行数据的增删差早。如图:

通常应用程序会利用一组专门与数据库进行通信协议的程序库,以简化与数据库沟通时的程序编写。如图:

JDBC全名Java DataBase Connectivity,是Java数据库连接的标准规范。具体而言,它定义一组标准类与接口,应用程序需要连接数据库时就调用这组标准API,而标准API中的接口会由数据库厂商实现,通常称为JDBC驱动程序。如图:

JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口。

厂商在实现JDBC驱动程序时,按方式可将驱动程序分为四种类型。

  • 1.JDBC-ODBC Bridge Driver。ODBC是由Microsoft主导的数据库连接标准。所以ODBC在Microsoft的系统上也最为成熟。Type1驱动程序会将JDBC的调用转换为对ODBC驱动程序的调用,由ODBC驱动程序来操作数据库。如图:(速度慢)
  • 2.Native API Driver。这个类型的驱动程序会以原生(Native)方式,调用数据库提供的原生程序库,JDBC的方法调用都会转换为原生程序库中的相关API调用。如图:(速度快)
  • 3.JDBC-Net Driver。这个类型的JDBC程序会将JDBC的方法调用,转换为特定的网络协议调用,目的是与远程与数据库特定的中介服务器或组价进行协议操作,而中介服务器或组件再真正与数据库进行操作。如图:(速度慢、跨平台)
  • 4.Native Protocol Driver。这个类型的驱动程序实现通常由数据库厂商直接提供,驱动程序实现会将JDBC的调用转换为与数据库特定的网络协议,以与数据库进行沟通操作。如图:(跨平台、性能较好、最常见)

1.2连接数据库

1.注册Driver实现对象

不过实际很少自行编码进行这个操作,只要想办法加载Driver接口的实现类.class文件,就会完成注册。例如:可以通过java.lang.Class类的forName(),动态加载驱动程序。

try{
    Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
    throw new RuntimeException("找不到指定类");
}

使用JDBC时,要求加载.class文件的方式有四种:

2.取得Connection实现对象

MySQL的JDBC URL编写方式如下:

3.关闭Connection实现对象

1.3使用Statement、ResultSet

Connection是数据库连接的代表对象,接下来若要执行SQL,必须取得java.sql.Statement对象,它是SQL语句的代表对象,可以使用Connection的createStatement()来创建Statement对象。取得Statement对象之后,可以使用executeUpdate()、executeQuery()等方法来执行SQL。executeUpdate()主要是用来执行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等会改变数据库内容的SQL。Statement的executeQuery()方法则是用于SELECT等查询数据库的SQL,executeUpdate()会返回int结果,表示数据变动的笔数,executeQuery()会返回java.sql.ResultSet对象,代表查询的结果。Statement的execute()可以用来执行SQL,并可以测试所执行的SQL是执行查询或更新,返回true的话表示SQL执行将返回ResultSet表示查询结果,此时可以使用getResultSet()取得ResultSet对象。如果execute()返回false,表示SQL执行会返回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数。

1.4使用PreparedStatement、CallableStatement

Statement在执行executeQuery()、executeUpdate()等方法时,如果有些部分是动态的数据,必须使用+运算子串接字符串以组成完整的SQL语句,十分不方便。如果有些操作指示SQL语句中某些参数会有所不同,其余的SQL子句皆相同,则可以使用java.sql.PreparedStatement。可以使用Connection的preparedStatement()方法创建好一个预编译的SQL语句,当中参数会变动的部分,先指定“?”这个占位字符。等到需要真正指定参数执行时,再使用相对应的setInt()、setString()等方法,指定“?”处真正应该有的参数。要让SQL执行生效,需执行executeUpdate()或executeQuery()方法。在这次的SQL执行完毕后,可以调用clearParementers()清除所设置的参数,之后就可以再使用这个PreparedStatement实例,所以使用PreparedStatement,可以让你先准备好一段SQL,并重复使用这段SQL语句。

以串接的方式组合SQL语句基本上会有SQL Injection的隐患。由于+串接字符会产生新的String对象,如果串接字符串动作经常进行,那会是性能负担上的隐忧(如果真的非得串接SQL,至少要考虑使用StringBuffer或JDK5.0之后的StringBuilder)。

2、JDBC进阶

2.1使用DataSource取得连接

所以问题简化到如何取得DataSource实例。为了让应用程序在需要取得某些与系统相关的资源对象时,能与实际的系统资源配置、实体机器配置、环境架构无关,在Java应用中可以通过JNDI(Java Naming Directory Interface)来取得所需的资源对象。

2.2使用ResultSet卷动、更新数据

2.3批次更新

2.4Blob与Clob

2.5事务简介

事务的四个基本要求是原子性(Automicity)、一致性(Consistency)、隔离行为(Isolation behavior)与持续性(Durability),依英文字母首字简称为ACID。

如果在事务管理时,仅想撤回某个SQL执行点,则可以设置储存点(Save Point)。例如:

要了解其他隔离行为设置的影响,首先要了解多个事务并行时,可能引发的数据不一致问题有哪些。如下:

1.更新遗失(Lost update)

基本上就是指某个事务对字段进行更新的信息,因另一个事务的介入而遗失更新效力。

2.脏读(Dirty read)

提示数据库“可读取确认”的隔离层次之后,数据库至少得保证事务能避免脏读与更新遗失问题。

3.无法重复的读取(Unrepeatable read)

提示数据库“可重复读取”的隔离层次之后,数据库至少得保证事务能避免无法重复读取、脏读与更新遗失问题。

4.幻读(Phantom read)

2.6metadata简介

在JDBC中,可以通过ConnectiongetMetaData()方法取得DatabaseMetaData对象,通过这个对象提供的种种方法,可以取得数据库整体信息,而ResultSet表示查询到的数据,而数据本身的字段、类型等信息,则可以通过ResultSet的getMetaData()方法,取得ResultSetMetaData对象,通过这个对象提供的相关方法,就可以取得字段名称、字段类型等信息。

2.7RowSet简介

3、使用SQL标签库

3.1数据源、查询标签

3.2更新、参数、事务标签

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值