JDBC的典型用法:
JDBC4.2常用接口和类简介:
DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:
public static synchronized Connection getConnection(String url, String user, String pass) throws SQLException:该方法获得url对应数据库的连接
Connection:代表数据库连接对象,每个Connection代表一个物理连接会话。想要访问数据库,必须先获得数据库连接,该接口的常用方法如下:
1.Statement createStatement() throws SQLException:该方法返回一个Statement对象。
2.PreparedStatement prepareStatement(String sql) throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
3.CallableStatement prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象,该对象用于调用存储过程
上面三个方法都返回用于执行SQL语句的Statement对象,PreparedStatement、CallableStatement是Statement的子类,只有获得了Statement之后才可执行SQL语句。
除此之外,Connection还有如下几个用于控制事务的方法:
1.Savepoint setSavepoint():创建一个保存点
2.Savepoint setSavepoint(String name):以指定名字创建一个保存点
3.void setTransactionIsolation(int level):设置事务的隔离级别
4.void rollback():回滚事务
5.void rollback(Savepoint savepoint):将事务回滚到指定的保存点
6.void setAutoCommit(boolean autoCommit):关闭自动提交、打开事务
7.void commit():提交事务
Java7 为Connection新增了
setSchema(String schema)、getSchema()两个方法:用于控制该Connection访问的数据库Schema
setNetworkTimeout(Executor executor, int milliseconds)、getNetworkTimeout()两个方法:用于控制数据库连接超时行为。
Statement:用于执行SQL语句的工具接口,常用方法如下:
1.ResultSet executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于执行查询语句
2.int executeUpdate(String sql) throws SQLException:该方法用于执行DML(数据操作语言)语句,并返回受影响的行数;该方法也可用于执行DDL(数据定义
语言)语句执行DDL语句将返回0
3.boolean execute(String sql) throws SQLException:该方法可执行任何SQL语句。若执行后第一个结果为ResultSet对象,则返回true;若执行后第一个结果为受影
响的行数或没有任何结果,则返回false。
Java7为Statement新增了closeOnCompletion()方法:若Statement执行了该方法,则当所有依赖于该Statement的ResultSet关闭时,该Statement会自动关闭。
Java7还为Statement提供了isCloseOnCompletion()方法:用于判断该Statement是否打开了“closeOnCompletion”.
Java8为Statement新增了多个重载的executeLargeUpdate()方法:这些方法相当于增强版的executeUpdate()方法,返回值类型为long,即当DML语句影响的记录条数超过
Integer.MAX_VALUE时,就应该使用executeLargeUpdate()方法。
PreparedStatement:预编译的Statement对象。PreparedStatement是Statement的子接口,它允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只
改变SQL命令的参数,避免数据库每次都需要编译SQL语句,因此性能更好。相对于Statement而言,使用PreparedStatement执行SQL语句时,无需再传入SQL语句,只
要为预编译的SQL语句传入参数数值即可。所以它比Statement多了如下方法:
1.void setXxx(int parameterIndex, Xxx value):该方法根据传入参数值的类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句中指定位置的参数。
ResultSet:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。它包含了如下常用方法来移动记录指针:
1.void close():释放ResultSet对象。
2.boolean absolute(int row):将结果集的记录指针移动到第row行,若row是负数,则移动到倒数第row行。若移动后的记录指针指向一条有效记录,则该方法返回true
3.void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态——记录指针的起始位置位于第一行之前
4.boolean first():将ResultSet的记录指针定位到首行。若移动后的记录指针指向一条有效记录,则该方法返回true。
5.boolean previous():将ResultSet的记录指针定位到上一行。若移动后的记录指针指向一条有效记录,则该方法返回true。
6.boolean next():将ResultSet的记录指针定位到下一行,若移动后的记录指针指向一条有效记录,则该方法返回true。
7.boolean last():将ResultSet的记录指针定位到最后一行,若移动后的记录指针指向一条有效记录,则该方法返回true。
8.void afterLast():将ResultSet的记录指针定位到最后一行之后。
JDBC编程步骤:
1.加载数据库驱动:
通常使用Class类的forName()静态方法来加载驱动:
Class.forName(driverClass);//driverClass就是数据库驱动类所对应的字符串。如:加载MySQL的驱动代码
Class.forName("com.mysql.jdbc.Driver");
2.通过DriverManager获取数据库连接:
//获取数据库连接
DriverManager.getConnection(String url, String user, String pass);//数据库URL、登录数据库的用户名和密码。
数据库URL通常遵循如下写法:
jdbc:subprotocol:other stuff
jdbc是固定的写法,subprotocol指定连接到特定数据库的驱动,other stuff也不是固定的(由数据库定)
MySQL数据库的URL写法如下:
jdbc:mysql://hostname:port/databasename
3.通过Connection对象创建Statement对象。有如下三个方法:
1.createStatement():创建基本的Statement对象
2.prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
3.prepateCall(String sql):根据传入的SQL语句创建CllableStatement对象
4.使用Statement执行SQL语句。有如下三个方法:
1.execute():可执行任何SQL语句,但比较麻烦
2.executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0
3.executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象
5.操作结果集:
若执行SQL语句是查询语句,则执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。程序可通过操作该ResultSet对象来取出查询结果:
1.next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法
2.getXxx()方法获取记录指针指向行、特定列的值。该方法既可使用列索引作为参数,也可使用列名作为参数。使用列索引作为参数性能更好,使用列名作为参数可
读性更好
6.回收数据库资源:
包括关闭ResultSet、Statement和Connection等资源。
下面程序简单示范了JDBC编程,并通过ResultSet获得结果集的过程:
1 drop database if exists select_test; 2 create database select_test; 3 use select_test; 4 # 为了保证从表参照的主表存在,通常应该先建主表。 5 create table teacher_table 6 ( 7 # auto_increment:实际上代表所有数据库的自动编号策略,通常用作数据表的逻辑主键。 8 teacher_id int auto_increment, 9 teacher_name varchar(255), 10 primary key(teacher_id) 11 ); 12 create table student_table 13 ( 14 # 为本表建立主键约束 15 student_id int auto_increment primary key, 16 student_name varchar(255), 17 # 指定java_teacher参照到teacher_table的teacher_id列 18 java_teacher int, 19 foreign key(java_teacher) references teacher_table(teacher_id) 20 ); 21 insert into teacher_table 22 values 23 (null , 'Yeeku'); 24 insert into teacher_table 25 values 26 (null , 'Leegang'); 27 insert into teacher_table 28 values 29 (null , 'Martine'); 30 insert into student_table 31 values 32 (null , '张三' , 1); 33 insert into student_table 34 values 35 (null , '张三' , 1); 36 insert into student_table 37 values 38 (null , '李四' , 1); 39 insert into student_table 40 values 41 (null , '王五' , 2); 42 insert into student_table 43 values 44 (null , '_王五' , 2); 45 46 insert into student_table 47 values 48 (null , null , 2); 49 insert into student_table 50 values 51 (null , '赵六' , null);