首页 > 代码库 > JDBC基于MySQL

JDBC基于MySQL

<一>Java 中的数据存储技术

在Java中数据库存取技术可分为如下几类

1.JDBC直接访问数据库

2.JDO技术

3.第三方O/R工具如Hibernate, ibatis 等

注:JDBC是java访问数据库的基石JDO, Hibernate等只是更好的封装了JDBC。

<二>JDBC基础

1.JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口一组API定义了用来访问数据库的标准Java类库使用这个类库可以以一种标准的方法、方便地访问数据库资源

2.JDBC为访问不同的数据库提供了一种统一的途径为开发者屏蔽了一些细节问题。

3.JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统这样就使得程序员无需对特定的数据库系统的特点有过多的了解从而大大简化和加快了开发过程。

4.JDBC体系结构

(1)JDBC接口API包括两个层次

 *面向应用的APIJava API抽象接口供应用程序开发人员使用连接数据库执行SQL语句获得结果。

 **面向数据库的APIJava Driver API供开发商开发数据库驱动程序用。

5.JDBC驱动程序分类

(1).JDBC驱动程序各个数据库厂商根据JDBC的规范制作的 JDBC 实现类的类库  

(2).JDBC驱动程序总共有四种类型

*JDBC-ODBC桥。 

**部分本地API部分Java的驱动程序。 

***JDBC网络纯Java驱动程序。 

****本地协议的纯 Java 驱动程序。 

注第(3)(4)两类都是纯Java的驱动程序因此对于Java开发者来说它们在性能、可移植性、功能等方面都有优势。 

6.ODBC

(1)早期对数据库的访问都是调用数据库厂商提供的专有的 API。为了在 Windows 平台下提供统一的访问方式微软推出了 ODBC(Open Database Connectivity开放式数据库连接)并提供了 ODBC API使用者在程序中只需要调用 ODBC API由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求

(2)一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS(database manager system)不直接与DBMS打交道所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说不论是FoxPro、Access , MYSQL还是Oracle数据库均可用ODBC API进行访问。由此可见ODBC的最大优点是能以统一的方式处理所有的数据库。

7.JDBC-ODBC桥 

JDBC-ODBC 桥本身也是一个驱动利用这个驱动可以使用 JDBC-API 通过ODBC 去访问数据库。这种机制实际上是把标准的 JDBC 调用转换成相应的 ODBC 调用并通过 ODBC 访问数据库

因为需要通过多层调用所以利用 JDBC-ODBC 桥访问数据库的效率较低

在 JDK 中提供了 JDBC-ODBC 桥的实现类(sun.jdbc.odbc.JdbcOdbcDriver)

8.部分本地API部分Java的驱动程序

(1)这种类型的 JDBC 驱动程序使用 Java 编写它调用数据库厂商提供的本地 API

(2)通过这种类型的 JDBC 驱动程序访问数据库减少了 ODBC 的调用环节提高了数据库访问的效率

(3)在这种方式下需要在客户的机器上安装本地 JDBC 驱动程序和特定厂商的本地 API 

9.JDBC网络纯Java驱动程序

(1)这种驱动利用中间件的应用服务器来访问数据库。应用服务器作为一个到多个数据库的网关客户端通过它可以连接到不同的数据库服务器。

(2)应用服务器通常有自己的网络协议Java 用户程序通过 JDBC 驱动程序将 JDBC 调用发送给应用服务器应用服务器使用本地程序驱动访问数据库从而完成请求。

10.JDBC API

JDBC API 是一系列的接口它使得应用程序能够进行数据库联接执行SQL语句并且得到返回结果。

11.Driver 接口

(1)Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的不同数据库厂商提供不同的实现

(2)在程序中不需要直接去访问实现了 Driver 接口的类而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现

12.加载与注册 JDBC 驱动

(1)加载 JDBC 驱动需调用 Class 类的静态方法 forName()向其传递要加载的 JDBC 驱动的类名

(2)DriverManager 类是驱动程序管理器类负责管理驱动程序

(3)常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例因为 Driver 接口的驱动程序类都包含了静态代码块在这个静态代码块中会调用 DriverManager.registerDriver() 方法来注册自身的一个实例

13.建立连接

(1)可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接

(2)JDBC URL 用于标识一个被注册的驱动程序驱动程序管理器通过这个 URL 选择正确的驱动程序从而建立到数据库的连接。

(3)JDBC URL的标准由三部分组成各部分间用冒号分隔。 

(4)jdbc:<子协议>:<子名称>

协议JDBC URL中的协议总是jdbc 

子协议子协议用于标识一个数据库驱动程序

子名称一种标识数据库的方法。子名称可以依不同的子协议而变化用子名称的目的是为了定位数据库提供足够的信息 

14.几种常用数据库的JDBC URL

(1)对于 Oracle 数据库连接采用如下形式 

jdbc:oracle:thin:@localhost:1521:sid

(2)对于 SQLServer 数据库连接采用如下形式

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

(3)对于 MYSQL 数据库连接采用如下形式   

jdbc:mysql://localhost:3306/sid

15.访问数据库

(1)数据库连接被用于向数据库服务器发送命令和 SQL 语句在连接建立后需要对数据库进行访问执行 sql 语句

(2)在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式

Statement

PrepatedStatement

CallableStatement

16.Statement

(1)通过调用 Connection 对象的 createStatement 方法创建该对象

(2)该对象用于执行静态的 SQL 语句并且返回执行结果

(3)Statement 接口中定义了下列方法用于执行 SQL 语句

ResultSet excuteQuery(String sql)

int excuteUpdate(String sql)

17.ResultSet

通过调用 Statement 对象的 excuteQuery() 方法创建该对象

ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集ResultSet 接口由数据库厂商实现

ResultSet 对象维护了一个指向当前数据行的游标初始的时候游标在第一行之前可以通过 ResultSet 对象的 next() 方法移动到下一行

ResultSet 接口的常用方法

boolean next()

getString()

18.JDBC API 小结1

java.sql.DriverManager用来装载驱动程序获取数据库连接。

java.sql.Connection完成对某一指定数据库的联接

java.sql.Statement在一个给定的连接中作为SQL执行声明的容器他包含了两个重要的子类型。

Java.sql.PreparedSatement 用于执行预编译的sql声明

Java.sql.CallableStatement用于执行数据库中存储过程的调用

java.sql.ResultSet对于给定声明取得结果的途径

19.SQL 注入攻击

(1)SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查而在用户输入数据中注入非法的 SQL 语句段或命令从而利用系统的 SQL 引擎完成恶意行为的做法

(2)对于 Java 而言要防范 SQL 注入只要用 PreparedStatement 取代 Statement 就可以了

20.PreparedStatement

(1)可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象

(2)PreparedStatement 接口是 Statement 的子接口它表示一条预编译过的 SQL 语句

(3)PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始)第二个是设置的 SQL 语句中的参数的值

21.PreparedStatement vs Statement

代码的可读性和可维护性. 

(1)PreparedStatement 能最大可能提高性能

DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用所以语句在被DBServer的编译器编译后的执行代码被缓存下来那么下次调用时只要是相同的预编译语句就不需要编译只要将参数直接传入编译过的语句执行代码中就会得到执行。

(2)在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. 

(3)(语法检查语义检查翻译成二进制命令缓存)

PreparedStatement 可以防止 SQL 注入 

22.数据库连接池connection pool 

(1)为解决传统开发中的数据库连接问题可以采用数据库连接池技术。

(2)数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接当需要建立数据库连接时只需从“缓冲池”中取出一个使用完毕之后再放回去。

(3)数据库连接池负责分配、管理和释放数据库连接它允许应用程序重复使用一个现有的数据库连接而不是重新建立一个。

(4)数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数当应用程序向连接池请求的连接数超过最大连接数量时这些请求将被加入到等待队列中。

23.数据库连接池技术的优点

(1)资源重用

由于数据库连接得以重用避免了频繁创建释放连接引起的大量性能开销。在减少系统消耗的基础上另一方面也增加了系统运行环境的平稳性。

(2)更快的系统反应速度

数据库连接池在初始化过程中往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言直接利用现有可用连接避免了数据库连接初始化和释放过程的时间开销从而减少了系统的响应时间

(3)新的资源分配手段

对于多应用共享同一数据库的系统而言可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源

(4)统一的连接管理避免数据库连接泄露

在较为完善的数据库连接池实现中可根据预先的占用超时设定强制回收被占用连接从而避免了常规数据库连接操作中可能出现的资源泄露

24.两种开源的数据库连接池

(1)JDBC 的数据库连接池使用 javax.sql.DataSource 来表示DataSource 只是一个接口该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现也有一些开源组织提供实现

*DBCP 数据库连接池

**C3P0 数据库连接池

(2)DataSource 通常被称为数据源它包含连接池和连接池管理两个部分习惯上也经常把 DataSource 称为连接池

25.DBCP 数据源 

(1)DBCP 是 Apache 软件基金组织下的开源连接池实现该连接池依赖该组织下的另一个开源系统Common-pool. 如需使用该连接池实现应在系统中增加如下两个 jar 文件

Commons-dbcp.jar连接池的实现

Commons-pool.jar连接池实现的依赖库

(2)Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用也可由应用程序独立使用。

26.DBCP 数据源使用范例

(1)数据源和数据库连接不同数据源无需创建多个它是产生数据库连接的工厂因此整个应用只需要一个数据源即可。

(2)当数据库访问结束后程序还是像以前一样关闭数据库连接conn.close(); 但上面的代码并没有关闭数据库的物理连接它仅仅把数据库连接释放归还给了数据库连接池。

27.Apache—DBUtils简介

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库它是对JDBC的简单封装学习成本极低并且使用dbutils能极大简化jdbc编码的工作量同时也不会影响程序的性能。

API介绍

org.apache.commons.dbutils.QueryRunner

org.apache.commons.dbutils.ResultSetHandler

工具类

org.apache.commons.dbutils.DbUtils、。   

28.DbUtils类 

DbUtils 提供如关闭连接、装载JDBC驱动程序等常规工作的工具类里面的所有方法都是静态的。主要方法如下

public static void close(…) throws java.sql.SQLException DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL如果不是的话它们就关闭Connection、Statement和ResultSet。

public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭还能隐藏一些在程序中抛出的SQLEeception。

public static void commitAndCloseQuietly(Connection conn) 用来提交连接然后关闭连接并且在关闭连接时不抛出SQL异常。 

public static boolean loadDriver(java.lang.String driverClassName)这一方装载并注册JDBC驱动程序如果成功就返回true。使用该方法你不需要捕捉这个异常ClassNotFoundException。

29.QueryRunner类 

(1)该类简单化了SQL查询它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作能够大大减少编码量。

(2)QueryRunner类提供了两个构造方法

*默认的构造方法

**需要一个 javax.sql.DataSource 来作参数的构造方法。

30.QueryRunner类的主要方法

(1)public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException执行一个查询操作在这个查询中对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

(2)public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样唯一的不同在于它不将数据库连接提供给方法并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

(3)public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

(4)public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新插入、更新或删除操作。

(5)public int update(Connection conn, String sql) throws SQLException用来执行一个不需要置换参数的更新操作。

31.ResultSetHandler接口 

(1)该接口用于处理 java.sql.ResultSet将数据按要求转换为另一种形式。

(2)ResultSetHandler 接口提供了一个单独的方法Object handle (java.sql.ResultSet .rs)。

32.ResultSetHandler 接口的实现类

(1)ArrayHandler把结果集中的第一行数据转成对象数组。

(2)ArrayListHandler把结果集中的每一行数据都转成一个数组再存放到List中。

(3)BeanHandler将结果集中的第一行数据封装到一个对应的JavaBean实例中。

(4)BeanListHandler将结果集中的每一行数据都封装到一个对应的JavaBean实例中存放到List里。


本文出自 “我是宁采臣” 博客,谢绝转载!

JDBC基于MySQL