JDBC
jdbc:是使用java语言对数据进行操作
1).常见接口、类
①java.sql.Connection: 数据库连接,只有先获得Connection对象才能连接到数据库
常见方法:
prepareStatement(sql语句); 创建发送sql语句工具的方法
②java.sql.PreparedStatement: 发送sql语句的工具,具备发送sql的功能(方法)
常见方法:
executeQquery(); 发送查询sql,并返回结果集
executeUpdate(); 发送增、删、改的sql,返回受影响行数的int类型
setXXX(序号, 值); 设置sql内的占位参数(?)
③java.sql.ResultSet: 结果集,数据库执行sql返回查询的结果,光标默认在第一行(不是数据),下图
常见方法:
next(); 游标下移一行
getXXX(“字段名”); 获得当前行的字段名的值; 例如:int id = rs.getInt(id);
getXXX(int index); 获得当前行指定序号列的值; 例如:int id= rs.getInt(1);
getString()/getDate()/getInt()/getDouble()…
④java.sql.Driver: 驱动类,访问数据库的方式,不同数据库会自动提供具体的实现接口
⑤java.sql.DriverManager: 管理多个驱动
getConnection(url, uid, pw); 获得数据库连接,url:”jdbc:oracle:thin:@ip:端口:实例名(orcl)”
⑥java.sql.ResultSetMetaData; 对结果集ResultSet的进一步操作,其包含了结果集表的所有信息
例如:打印表t
ResultSet rs = preparedStatement.executeQuery();
ResultSetMetaData rmd = rs.getMetaData();
//打印一行字段名:
for(int i = 1; I < rmd.getColumnCount(); i++)
System.out.print(rmd.getColumnLabel(i) + “ ”);
System.out.println();
//逐行打印数据
while(rs.next()) {
for(int I = 1; i < rmd.getColumnCount(); i++) { //获取查询结果字段的个数
System.out.print(rs.getString(i) + “ ”);
}
}
2).JDBC操作步骤
准备阶段:先导入ojdbcX.jar包(例如:将ojdbc6.jar复制到项目的lib文件夹—build path—add to build path)
①加载驱动:
Class.forName(“oracle.jdbc.OracleDriver”);
②获得数据库连接
Connection conn = DriverManager.getConnection(url, username, password);
url: jdbc:oracle:thin:@ip:端口:orcl/xe(实例)
③创建发送sql语句的工具,并发送
PreparedStatement psmt = conn.prepareStatement(“sql语句”);
// PreparedStatement psmt = conn.prepareStatement(“insert into emp values(?, ?)”); //占位参数
// psmt.setInt(1, 1001); psmt.setString(2, ‘jwnming’);
psmt.executeUpdate(); //发送增、删、改的sql命令,返回受影响行数的int类型
psmt.executeQuery(); //发送查询的sql命令,返回查询的结果集(ResultSet)
④处理查询的结果集
ResultSet rs = psmt.executerQuery();
rs.next(); //使当前行,为数据的第一行
System.out.println(rs.getInt(“id”)); //打印当前行的id值
System.out.println(rs.getString(1)); //打印当前行的第一个字段值
⑥释放资源:先创建的后关闭
if(rs != null) rs.close(); 先判断是否为空
if(psmt != null) psmt.close();
if(conn != null) conn.close();
3).驱动加载剖析、动态sql语句
1. 驱动加载剖析
DriverManager管理驱动
//管理驱动
public class DriverManager{
private static List<Driver> drivers = new CopyOnWriteArrayList<>();//存放多个driver对象.
//真正的注册驱动的代码.
public static void registDriver(Driver driver){
drivers.add(driver);
}
public static Connection getConnection(String url,String user,String password){
//...
}
}
驱动加载
// 表面书写: Class.forName("oracle.jdbc.OracleDriver")
// 如何实现驱动加载?
public class OracleDriver implements Driver{
//加载驱动
static{
Driver driver = new oracle.jdbc.OracleDriver();//创建驱动
DriverManager.registDriver(driver);//添加驱动对象, 注册驱动, 加载驱动.
}
}
2. 动态访问数据库的sql
方式1: SQL字符串拼接,将数据通过字符串拼接,绑定在SQL语句中;
缺点:sql注入
例如:String sql = “select * from employees where name = ‘” + name +”’”;
方式2: pstm动态参数:? 方式只能动态绑定数据/值的部分
优点: 防止SQL注入.
缺点: 不能动态绑定 sql的关键词,列名..
步骤:
①. 创建SQL允许将值,用? 站位: `delete from t_person where name = ?`
pstm = conn.prepareStatement("delete from t_person where name = ?");
// insert into t_person values(?,?,?,?,?);
②. 绑定参数:对?站位的值,进行替换,绑定.
//pstm.setXxxx(?的序号从1开始,要绑定的具体值);// 将数据绑定在指定的?位置.
pstm.setInt(); //绑定整数类型的值
pstm.setString() //绑定字符串的值
pstm.setDouble();// 绑定double的值
pstm.setDate();//绑定日期.
③. 发送sql(执行)
pstm.executeUpdate();//执行增删改
pstm.executeQuery();//执行查询.
4).批处理(批量更新数据)
批更新(BatchUpdate) : **PreparedStatement**核心
1. 将绑定的参数,缓存在java本地.
pstm.addBatch()
2. 将缓存在java本地的多组参数,一次性发送给Oracle.
pstm.executeBatch()
例如:
for(int i = 0; i < 10000; i++) {
psmt1.setString(1, name);
psmt1.addBatch();
if(i % 600 == 0) {
psmt1.executeBatch();
}
}
psmt1.executeBatch();