JavaWEB开发系列之JDBC(一)
JDBC概念:
JDBC(Java Database Connectivity),通用的SQL数据库存取和操作的公共接口(API),定义了访问数据库的标准Java类库。
JDBC接口包含两个层次:
- 面向应用的API:Java API,程序开发人员使用(连接数据库,执行SQL语句,获得结果)
- 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序使用
JDBC驱动程序的分类:
- JDBC-ODBC桥
- 部分本地API部分Java的驱动程序
- JDBC网络纯Java驱动程序
- 本地协议的纯Java驱动程序
JDBC-ODBC桥
机制:把标准的JDBC调用转换成ODBC调用,在JDK中,提供了JDBC-ODBC桥的实现了类(sun.jdbc.odbc.JdbcOdbcDriver)
部分本地API部分Java的驱动程序
机制:调用数据库厂商提供的本地API,需要安装本地JDBC驱动程序和特定厂商的本地API。
JDBC网络纯Java驱动程序
机制:利用中间件的应用服务器来访问数据库,应用服务器作为多个数据库的网关,客户端通过它可以连接到不同的数据库服务器上。
本地协议的纯Java驱动程序
机制;通过与数据库建立socket连接,采用具体与厂商的网络协议把JDBC调用转换为直接连接的网络调用
JDBC API
Driver接口
Java.sql.Driver接口提供给数据库厂商,厂商提供具体的实现。由java.sql.DriverManager去调用Driver的实现。
加载与注册JDBC驱动
调用Class类的静态方法forName(),传递要加载的JDBC类名。
建立连接
调用DriverManager类的getConnection()方法建立数据库连接
JDBC URL
访问数据库
java.sql包中由=有3个接口定义了对数据库调用的不同方式
- Statement
- PrepatedStatement
- CallableStatement
Statement接口定义了两种方法,调用Connection对象的createStatement方法创建该对象。
- ResultSet excuteQuery(String sql)
- int excuteUpdate(String sql)
ResultSet调用Statement对象的excuteQuery方法创建改对象,该对象以逻辑表格的形式封装了执行数据库操作的结果集,常用方法
- boolean next()
- getString()
JDBC API总结:
java.sql.DriverManager用来装载驱动程序,获取数据库连接
java.sql.Connection完成对某一指定数据库的连接
java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,包含两个重要的子类型
- java.sql.PreparedStatement用于执行预编译的sql声明
- java.sql.CallableStatement用于执行数据存储过程中的调用
java.sql.ResultSet对于给定声明取得结果的途径
SQL注入攻击
利用系统没有对用户输入的数据进行充分的检查,注入非法的SQL语句段或者命令。使用PreparedStatement代替Statement。
PreparedStatement:
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
元数据
DatabaseMetaData对象获取数据库管理系统的各种信息:
- getURL():返回一个String类对象,代表数据库的URL。
- getUserName():返回连接当前数据库管理系统的用户名。
- isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
- getDatabaseProductName():返回数据库的产品名称。
- getDatabaseProductVersion():返回数据库的版本号。
- getDriverName():返回驱动驱动程序的名称。
- getDriverVersion():返回驱动程序的版本号。
ResultSetMetaData类
- getColumnName(int column):获取指定列的名称
- getColumnCount():返回当前 ResultSet 对象中的列数。
- getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
- getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
- isNullable(int column):指示指定列中的值是否可以为 null。
- isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
数据库事务
ACID属性:
- 原子性
- 一致性
- 隔离性
- 持久性
JDBC事务处理
当一个连接对象被创建时,默认自动提交事务,每次执行SQL语句时,执行成功就向数据库自动提交事务,不能则回滚。
批量处理JDBC语句提高处理速度
当需要成批插入或者更新记录时,可以采用Java的批量更新机制,语序多条语句一次性提交给数据库处理,提高效率
批量处理语句:
- addBatch(String)添加需要批量处理的SQL语句或是参数
- executeBatch()执行批量处理语句
多条SQL语句的批量处理
一个SQL语句的批量传参