JDBC
JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中[QL1] ,通过JDBC技术Java程序可以非常方便的与各种数据库交互,JDBC在Java程序与数据库系统之间建立了一座桥梁。
[QL1]因此在导入API时,应该选择java.sql.*
概念
Java DataBase Connection,Java数据库连接,是sun公司规定的一套API,专门用作Java程序与数据库进行交互。
JDBC是一组接口。
JDBC既然是接口,那么接口就需要实现,而这些具体的实现就是JDKC驱动。
接口是sun公司规定的,JDBC驱动则是数据库厂商或者厂商所委托的第三方开发的。
与数据库建立连接;
发送SQL语句;
处理返回结果。
JDBC API
每种数据库的驱动程序都会提供一个实现java.sql.Driver接口的类,简称Driver类。在加载Driver类时,将创建Driver实例并向java.sql.DriverManager类注册。
通过方法Class.forName[QL2] (String className)可以加载要连接数据库的Driver类。其中className为Driver类的完整路径,包括包名和类名[QL3] 。
publicstatic Class<?> forName(String className)
throws ClassNotFoundException[QL4] [QL5]
Returnsthe Class object associated with the class or interface with the given stringname.
[QL1]Java提供了一个java.sql.Driver的接口。The interface that every driver class mustimplement.JDBC驱动提供了一个Driver类,这个 实现了java.sql.Driver接口。
[QL2]由于只需要注册一次,因此建议将代码放在static代码块中。
[QL3]MySQL数据库为:com.mysql.jdbc.Driver
[QL4]如果加载失败将抛出ClassNotFoundException异常。
[QL5]Driver类的路径输入错误或者没有加载JDBC驱动都将出现加载失败的情况。
DriverManager
DriverManager类主要用于加载驱动,并创建与数据库的链接。这两种用途分别对应两种方法:
DriverManager.registerDriver[QL6] (new Driver())
[QL6]不建议使用这个方式注册驱动。因为这种方法依赖底层API,同时在执行的时候将注册两次驱动,产生两个Driver。
DriverManager.getConnection(url,user, password)
l 注册驱动
使用Class.forName(String driverPath)代替原有方法。
此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
l 创建数据库连接
URL格式:
[QL7]在连接mysql数据库的时候一般都会在url后面添加useUnicode=true & characterEncoding=UTF-8
Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql写法:jdbc:mysql://localhost:3306/sid
如果连接的是本地的Mysql数据库,并且连接使用的端口是3306,那么的url地址可以简写为:jdbc:mysql:///数据库。
Connection
Connection接口位于java.sql包中,负责与特定数据库进行连接,并且通过Connection对象可以创建命令对象。
Statementconnection.createStatement():创建向数据库发送sql的statement对象。
PreparedStatementconnection.prepareStatement(String sql):创建向数据库发送预编译sql的PrepareSatement对象。
CallableStatement prepareCall(String sql):创建执行存储过程的callableStatement对象。
除了创建命令对象外,还可以控制此链接上的事务提交和回滚。
setAutoCommit(booleanautoCommit):设置事务是否自动提交。
commit():在链接上提交事务。
rollback():在此链接上回滚事务。
Close[QL9] () :立即释放此Connection对象的数据库连接占用的JDBC 资源。
[QL9]使用了计算机资源,最后必须要释放。在操作数据库后,应立即调用close方法释放资源。
Statement
静态的命令对象,只能执行固定的SQL语句。
ResultSet [QL10] executeQuery(String sql) :用于向数据发送查询语句。
int [QL11] executeUpdate(String sql):用于向数据库发送insert、update或delete语句。
Boolean [QL12] execute(String sql):用于向数据库发送任意sql语句。
除此之外,Statement还可以实现批处理:
voidaddBatch( String sql ) throws SQLException;
把多条sql语句放到一个批处理中。
int[]executeBatch() throws SQLException;
向数据库发送一批sql语句执行。@return: an array of updatecounts containing one element for each command in the batch.
PreparedStatement
A SQL statement is precompiled [QL13] and stored in aPreparedStatement object. This object can then be used to efficientlyexecute this statement multiple times.
PreparedStatement接口继承于Statement,拥有Statement接口中的方法,并且针对带有参数的SQL语句的执行操作进行了扩展。
1) 使用占位符“?”来代替SQL语句中的参数;
2) 调用相应的方法对参数进行赋值。
voidsetObject(int parameterIndex[QL14] , Object x);
l 与Statement相比
在实际开发过程中,如果涉及到向SQL语句传递参数,最好使用PreparedStatement接口进行实现,这样不仅能提高执行效率,还可以避免SQL语句的注入式攻击。
ResultSet
ResultSet用于代表SQL语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。可以通过游标的方式遍历所有的结果。
Object getObject(int index)
Object getObject(string columnName)
boolean next():移动到下一行
boolean previous():移动到前一行
boolean absolute(int row):移动到指定行
void beforeFirst():移动resultSet的最前面。
void afterLast() :移动到resultSet的最后面。
[QL10]返回值为结果集。
[QL11]返回值为受到影响的行数。
[QL12]如果执行的SQL语句有返回结果,则返回true,否则返回false。
[QL13]预编译的命令对象,是Statement的子类。
[QL14]占位符?的顺序,从1开始。
[QL15]方式SQL注入式攻击:
String sql = "select * from userwhere name=' "+name+" ' and password = ' "+password+" ' ";
输入:1'or'1'='1
变为:id='1'or'1'='1'
[QL16]返回结果ResultSet中,默认光标是在结果集第一行之前。
[QL17]使用完毕之后应该调用close方法释放资源。
[QL18]通过结果集获得数据可以通过列名(字段名),也可以通过列索引(列号)。列索引从1开始。