JDBC(Java Database Connectivity)
1)下载并配置JDBC驱动
2)获得数据库连接步骤
1、准备一些参数
driver: 数据库产品专用驱动
eg. "oracle.jdbc.driver.OracleDriver"
url: 数据库的定位
eg. "jdbc:oracle:thin:@ip:port:dbName"
dbUser: 数据库用户名
dbPass: 用户密码
2、加载驱动
Class.forName(driver);
3、获得数据库连接
Connection conn = DriverManager.getConnection(url, dbUser, dbPass);
4、生成Statement
Statement stmt = conn.createStatement();
5、执行SQL语句获取结果集
String sql = "select * from emp"; ResultSet rs = stmt.executeQuery(sql);
3)ResultSet对象的结构
1、游标 通过next()方法获得,默认只能前进、不能后退
2、结果集 通过getXXX()方法获得相应列名所指定的数据
4)关闭数据库连接
finally { try { rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
5)通用性的数据库连接封装
for:提供连接对象 负责关闭资源
将连接参数保存在一个单独的文件中,使用properties文件
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@ip:port:dbName
dbUser=xxxxx
dbPass=xxxxx
6)利用DBConn工具类完成查询工作
1、导入DBConn
2、查询之前的数据库连接工作交给DBConn
3、查询结束或者查询过程中遇到异常时关闭资源的工作也交给DBConn
4、获得数据库元数据信息:
a. 列名、字段类型、总列数等
ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); String name = rsmd.getColumnName(index); String type = rsmd.getColumnTypeName(index);
b. 数据库产品版本、产品名等
DataBaseMetaData dbmd = conn.getMetaData(); dbmd.getDatabaseProductVersion(); dbmd.getDatabaseProductName();
(一) 语句对象(Statement接口)
1)Statement语句对象的执行有两种形式:
Connection conn = DriverManager.getConnection(url, dbUser, dbPass);
Statement stmt = conn.createStatement();
a.执行DQL语句
stmt.executeQuery(sql);
b.执行DML语句
stmt.executeUpdate(sql);
2)PreparedStatement语句对象
弥补了Statement的SQL语句频繁拼接不足同时也可以防止一些简单的SQL注入隐患
String sql = "insert into ? values(?, ?, ?, ?, ?)" PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setXXX(index, value);
(二) 事务(transaction)
在数据库中,表示一组SQL语句作为一个整体执行,意味着执行的原子性,即执行的不可分割
JDBC默认自动提交事务
conn.setAutoCommit(false); // 取消自动提交 conn.commit(); // 提交 conn.rollback(); // 回滚
(三) 批处理
stmt.addBatch(); stmt.executeBatch(); stmt.clearBatch(); pstmt.addBatch(); pstmt.executeBatch(); pstmt.clearBatch();
(四) 滚动结果集
stmt = conn.createStatement(); 产生的结果集对象在默认情况下
类型为TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY并发级别
结果集类型:
ResultSet.TYPE_FORWARD_ONLY 只进
ResultSet.TYPE_SCROLL_INSENSITIVE 滚动不敏感
ResultSet.TYPE_SCROLL_SENSITIVE 滚动敏感
ResultSet.CONCUR_READ_ONLY 并发只读
ResultSet.CONCUR_UPDATABLE 并发可更新
创建滚动结果集对象:
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql);
结果集滚动:
rs.next(); // 游标前进一行
rs.rs.relative(10); // 游标从当前位置起前进10行
rs.relative(-5); // 游标从当前位置起后退5行
rs.absolute(100); // 游标移动到第100行
rs.previous(); // 游标后退一行
rs.first(); // 游标移动到第一行
rs.isFirst(); // 判断游标是否在第一行
rs.last(); // 游标移动到最后一行
rs.isLast(); // 判断游标是否在最后一行
rs.getRow(); // 获得游标当前所在行的行号
(五) 利用滚动结果集进行分页查询(缓存分页)
使用于对少量数据进行分页,当数据量过大会造成内存溢出
分页参数:
1)当前页数 int page = ?
2)每页记录数 int pageSize = ?
3)页起始位置 int begin = (page - 1) * pageSize + 1;
(六) 基于查询的分页(常用的方法)
1)当前页数 int page = ?
2)每页记录数 int pageSize = ?
3)页起始位置 int begin = (page - 1) * pageSize + 1;
4)页结束位置 int end = begin + pageSize - 1;