JDBC
Java DataBase Connectivity java与数据库的连接
角色分类
- 服务器 (db):
- 1.接收 sql;
- 2.执行 sql;
- 3.返回结果
- 客户端 (java):
- 1.接收数据;
- 2.组装sql;
- 3.发送SQL(与数据库建立联系);
- 4.分析结果
面向接口编程
-
java 制定标准 ,不同的数据库厂商实现接口即可。java中提供的接口: java.sql.*; 包下,常用接口如下:
接口名称 作用 java.sql.Connection 连接 java.sql.Statement 静态处理块 java.sql.PreparedStatement 预处理块 java.sql.ResultSet 结果集 java.sql.ResultSetMetaData 结果集元信息(字段名) -
oracle 厂商实现接口 (jar):
安装路径\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar
JDBC流程
-
准备工作–构建路径:
- 在项目中建立资源文件夹lib,把ojdbc6放进去,选中这个jar包–build path构建路径,加载内容
-
连接数据库的基本操作步骤:
-
加载驱动 (选择数据库)
-
获取连接 (与这个数据库建立连接)
-
准备sql
-
准备处理块(静态|预处理块)
-
发送sql并得到响应 (发送sql到数据库)
-
处理数据
-
关闭资源
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 (选择数据库) Class.forName("oracle.jdbc.driver.OracleDriver"); //2.获取连接 (与这个数据库建立连接) Connection conn=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "SCOTT", "TIGER" ); //3.准备sql String sql="select empno,ename from emp"; //sql语句中不用写";" //4.准备处理块(静态,预处理块) Statement state=conn.createStatement(); //5.发送sql并得到相应 (发送sql到数据库) ResultSet result=state.executeQuery(sql); //6.处理数据 while(result.next()){ int empno=result.getInt(1); String ename=result.getString(2); System.out.println(empno+"--->"+ename); } //7.关闭资源 result.close(); state.close(); conn.close(); } }
-
-
步骤分析:
- 准备工作
- 引入驱动包
- 构建路径 build path
- 测试用户是否正确登录
- 建立连接
- 加载驱动:
- 驱动:oracle.jdbc.driver.OracleDriver
- 硬编码:new oracle.jdbc.driver.OracleDriver()
- 软编码:class.forName(“oracle.jdbc.driver.OracleDriver”) —— 推荐
- 建立连接:
- url:jdbc:oracle:thin:@db服务器地址:端口:实例
- 连接url:jdbc:oracle:thin:@localhost:1521:orcl|xe
- 用户名与密码:scott = tiger
- Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@locahost:1521:xe”,“scott”,“tiger”)
- 加载驱动:
- 处理块
- 静态处理块 Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数的简单 SQL 语句。执行静态 SQL 语句并返回它所生成结果的对象。- 创建 : Connection对象.createStatement()
- 执行 :
ddl --> execute(ddl语句) – 通常不会在代码中执行
dml --> executeUpdate(dml语句)
select --> executeQuery(select) - 特点:处理不变的静态的sql 语句
优点:直接查看sql,方便处理错误
缺点:性能不高,拼接 sql 麻烦,可能存在"sql 注入"
- 预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,由于 PreparedStatement 对象已预编译 过,所以其执行速度要快于 Statement对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。- 创建:Connection对象.prepareStatement(sql)
- 执行:
存在"?",先填充参数再执行
ddl -->execute()
dml -->executeUpdate()
select -->executeQuery() - 特点:处理 不变的静态的sql 语句 | 可变的sql语句 – 带"?“的 sql语句
优点:性能高,方便编写sql,不存在"sql 注入”,安全
缺点:不能直接打印sql语句,不方便处理错误
- 静态处理块 Statement
- 分析
执行完 SQL 语句后可能成功也可能失败,如果成功,有数据,则我们很大一部分情况是需要获取查询的结果。- ddl:没有异常就是成功
- dml:结果 >0 就是成功
- select:分析结果集
- 对于 select 的结果集进行分析,类似于迭代器,先判断(移动)再获取:
- next()
- getXxx(索引|列名|别名)
- 对于 select 的结果集进行分析,类似于迭代器,先判断(移动)再获取:
- 释放资源
- 原则:先打开的后关闭,所以顺序一般为: 结果集 --> 处理块 --> 连接
- 准备工作
优化
-
异常的捕获与处理
-
解决硬编码问题(配置资源文件)
// db.properties(配置资源文件) driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe name=SCOTT pwd=TIGER
import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCDemo02 { public static void main(String[] args){ Properties pro = new Properties(); Connection conn = null; Statement state = null; ResultSet result = null; try { pro.load(Thread.currentThread(). getContextClassLoader(). getResourceAsStream("db.properties")); //1.加载驱动 (选择数据库) Class.forName(pro.getProperty("driver")); //2.获取连接 (与这个数据库建立连接) conn = DriverManager.getConnection( pro.getProperty("url"), pro.getProperty("name"), pro.getProperty("pwd")); //3.准备sql String sql = "select empno,ename from emp"; //sql不能加;, //4.准备处理块(静态,预处理块) state = conn.createStatement(); //5.发送sql并得到相应 (发送sql到数据库) result = state.executeQuery(sql); //6.处理数据 while(result.next()){ int empno=result.getInt(1); String ename=result.getString(2); System.out.println(empno + "-->" + ename); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7.关闭资源 try { if (result != null) { result.close(); } if (state != null) { state.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
封装JDBC工具类
-
加载驱动
-
获取连接
-
关闭
import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class DBUtils { static Properties pro = new Properties(); // 加载驱动 static { try { pro.load(Thread.currentThread(). getContextClassLoader(). getResourceAsStream("db.properties")); } catch (IOException e1) { e1.printStackTrace(); } // 1.加载驱动 (选择数据库) try { Class.forName(pro.getProperty("driver")); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 获取连接的功能 public static Connection getConnection() throws SQLException { // 2.获取连接 (与这个数据库建立连接) Connection conn = DriverManager.getConnection( pro.getProperty("url"), pro.getProperty("name"), pro.getProperty("pwd")); return conn; } // 关闭 public static void release(ResultSet result, Statement state, Connection conn) { // 3.关闭资源 try { if (result != null) { result.close(); } if (state != null) { state.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void release(Statement state, Connection conn) { release(null, state, conn); } }