目录
(1)概述
? ? ? ? JDBC是一种执行SQL语句的Java API,可以通过JDBC连接到关系数据库,并通过SQL结构化查询语言完成对数据库的增删改查操作。
? ? ? ? JDBC访问数据库时需要完成三件工作:建立与数据库的连接、执行SQL语句、获取执行结果。
(2)JDBC驱动
? ? ? ? 数据库驱动程序是JDBC程序和数据库之间的转换层
? ? ? ? 数据库驱动程序负责将JDBC调用映射成特定的数据库调用
(3)JDBC API
? ? ? ? JDBC API提供了一组用于与数据库进行通信的接口和类,定义在java.sql中
名称 | 描述 |
DriverManager | 用于管理JDBC驱动的服务类,负责加载和卸载各种驱动程序,建立数据库的连接并获取连接对象 |
Connection | 用于数据库连接,每一个Connection对象代表一个数据库连接会话 |
Statement | 用于执行SQL语句的工具接口,当执行查询语句时返回一个查询到的结果集 |
PreparedStatement | 用于执行预编译的SQL语句 |
CallableStatement | 用于调用SQL存储过程 |
ResultSet | 表示结果集,包含访问查询结果的各种方法 |
? ? ? ? 在JDBC编程中,易引发SQLException异常,需要进行异常处理,所以SQLException也是JDBC编程中其他异常类型的基础。
? ? ? ? 在JDBC中执行SQL查询语句方式有一般查询(Statement)、参数查询(PreparedStatement)、存储过程(CallableStatement)三种。
使用JDBC访问数据库的步骤:
????????加载数据库驱动->建立数据连接->创建Statement对象->执行SQL语句->访问结果集
? ? ? ? 使用Class类的forName() 方法来加载数据库驱动
Class.forName("com.mysql.jdbc.Driver") //加载mysql驱动
Class.forName("oracle.jdbc.driver.OracleDriver") //或加载Oracle驱动
? ? ? ? 使用DriverManager.getconnection(String url,String user,String pass)方法建立数据库连接。
Class.forName("oracle.jdbc.driver.OracleDriver")
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:8001:orcl" //URL链接字符串
"root" //用户名
"admin" //密码
)
????????通过Connection对象获得Statement的方法有:
createStatement() | 创建一个基本的Statement对象 |
prepareStatement(String sql) | 根据参数化的SQL语句创建一个预编译的PreparedStatement对象 |
prepareCall(String sql) | 根据SQL语句来创建一个CallableStatement对象 |
? ? ? ? 创建Statement实例:
Statement smt = conn.createStatement();
? ? ? ? 执行SQL语句返回一个结果集ResultSet。
????????执行SQL语句三种方法:
executeQuery() | 只能执行查询语句 |
executeUpdate()和executeLargeUpdate() | 用于执行DML(插入、增加、删除)和DDL(创建表、删除表)语句 |
execute() | 可以执行任何SQL语句 |
? ? ? ? ?执行SQL语句的实例:
ResultSet rs = smt.executeQuery("SELECT sno,name,age FROM student");
? ? ? ? 由于SQL的查询结果使用ResultSet进行封装,所以使用getXXX("列名"或列索引)方法访问结果集中的数据时,可通过列索引或列名来获取游标所指行中的列数据,XXX代表的是获取的数据类型。
? ? ? ? 循环输出结果集中的数据:
While(rs.next()){
System.out.println(rs.getString(1)) //循环输出第一列数据
}
While(rs.next()){
System.out.println(rs.getString("username")) //循环输出username列数据
}
? ? ? ? 当数据库操作执行完毕或退出应用前,应该执行关闭操作,关闭顺序为:
(1)关闭结果集:rs.close()
(2)关闭Statement对象:stmt.close()
(3)关闭连接:conn.close()
? ? ? ? DatabaseMetaData接口用于获取数据库的相关信息,通过Connection接口的getMetaData()方法进行获取。
? ? ? ? DatabaseMetaData的常用方法如下:
? ? ? ? 实例:
DBUtil db = new DBUtil(); //通过工具类获取数据库连接
Connection conn=db.getConnection(); //建立数据连接
DatabaseMetaData dmd = conn.getMetaData();
System.out.println("数据库产品名:"+dmd.getDatabaseProductName()); //输出数据库产品名
System.out.println("数据库版本号:"+dmd.getDatabaseProductVersion()); //版本号
System.out.println("驱动类型名:"+dmd.getDriverName()); //驱动类型名
db.closeAll(); //关闭连接
? ? ? ? ResultSetMetaData接口用来获取结果集的结构,如结果集的列数和列名。
????????ResultSetMetaData的常用方法如下:
? ? ? ? 实例:
DBUtil db=new DBUtil();
db.getConnection();
ResultSet rs=db.executeQuery(selectSql,null); //结果集初始化,并执行选择sql
ResultSetMetaData rsmd=rs.getMetaData(); //接口初始化
System.out.println("总共有:"+rsmd.getColumnCount()+"列"); //返回结果集列数
db.closeAll();
? ? ? ? 事务:由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。
? ? ? ? 事务四个特性:原子性、一致性、隔离性、持久性。
? ? ? ? 在JDBC中对事物操作提供了支持,由Connection提供,在默认情况下进行自动提交,可以使用Connection对象中的setAutoCommit()方法开启或者关闭自动提交模式。
conn.setAutoCommit(false); //关闭自动提交
? ? ? ? 当所有SQL语句都执行成功后,调用Connection的commit()方法来提交事务。
conn.commit();
? ? ? ? 任意一条SQL语句执行失败,调用Connection的rollback()方法来回滚事务
conn.rollback();
? ? ? ? ?当遇到未处理的SQLException异常时,事务也会自动回滚,若捕获该异常,则显式调用rollback()进行回滚。
? ? ? ? 设置保存点:
Savepoint=conn.setSavepoint();
? ? ? ? ?回滚保存点:
conn.rollback(Savepoint);
? ? ? ? 批量更新:多条SQL语句被作为一批操作同时收集、提交,通过DatabaseMetaData的supports()查看底层数据库是否支持批量更新。
Statement stat=conn.createStatement(); //创建Statement对象
stat.addBatch("INSERT INTO stu(name,id,sex,age) VALUES("张三","001","男",20)"); //收集多条SQL语句
stat.addBatch("INSERT INTO stu(name,id,sex,age) VALUES("李四","002","男",21)");
stat.executeBatch(); //同时执行多条SQL语句
参考书籍:《Java 8 基础应用与开发》QST青软实训编