JDBC
jdbc: java database connectivity java 与数据库的连接
一、 角色分类
服务器 (db):
a)、接收 sql
b)、执行 sql
c)、返回结果\
客户端 (java):
a)、接收数据
b)、组装sql
c)、发送SQL(与数据库建立联系)
d)、分析结果
二、 面向接口编程**
1、 java 制定标准
,不同的数据库厂商实现 接口即可。 java 中提供的接口 java.sql.* 包下,常用接口如下
2、 oracle 厂商实现接口 (jar)
F:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar** 视安装路径而定
三、jdbc步骤**
1.加载驱动(选择数据库)*
2获取连接(和数据库练习上了)**
3.获取处理快(****构建一个执行和发送sql****的对象)**
4.准备sql****语句**
5.发送|****执行sql**
6.获取到结果集**
7.关闭资源**
四、连接**
1、 准备工作l 引入驱动包 l 构建路径 build path l 测试用户是否正确登录
2、建立连接
1)、连接字符串驱动: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@db 服务器地址:端口:实例
连接 urlèjdbc:oracle:thin:@localhost:1521:orcl 用户名与密码: scott tiger
2)、编写测试类加载驱动
a)、硬编码: new oracle.jdbc.driver.OracleDriver();
b)、软编码: class.forName("oracle.jdbc.driver.OracleDriver")
建立连接** Connection con =DriverManager.getConnection("jdbc:oracle:thin:@locahost:1521:orcl","scott","tiger")
五、处理块*
1、静态处理块 Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。
Statement 对象,用于执行不带参数的简单 SQL 语句。 执行静态 SQL 语句并返回它所生成结果的对象。
1)、 创建 :
连接.Connection.createStatement()
2)、 执行 : ddl -->execute(dd语句) -- 通常不会在代码中执行 dml -->executeUpdate(dml语句)
select -->executeQuery(select)
3)、 特点:
处理 不变的静态的 sql 语句 优点: 直接查看sql ,方便处理错误 缺点:性能不高 拼接 sql 麻烦 可能存在 sql 注入
2、预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,并与之在两方面有所不同:有人 主张,在 JDBC 应用中,如果你已经是稍有水平开发者,你就应该始终以 PreparedStatement 代替 Statement.也就是说,在任何时候都不要使用 Statement。 由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
- 1)、 创建:创建:连接.prepareStatement(sql)
- 2)、 执行: 存在? ,先填充参数再执行 ddl -->execute()
dml -->executeUpdate()
select -->executeQuery() - 3)、 特点 :
处理 不变的静态的 sql 语句 |可变的 sql 语句 带 ? 的 sql 优点:性能高,方便编写sql 不存在sql注入 安全 缺点:不能直接打印sql语句 不方便处理错误
六、分析
执行完 SQL 语句后可能成功也可能失败,如果成功,有数据则我们很大一部分情况是 需要获取查询的结果。数据就是一切
- ddl:没有异常就是成功
- dml: 结果>0就是成功
- select:分析结果集 对于 select 的结果集进行分析,类似于迭代器, 先判断(移动)再获取 next()
getXxx(索引|列名|别名)
七、释放资源
释放资源的原则是 先打开的后关闭, 则我们的顺序一般为: 结果集->处理块->连接
练习
1.简单的JDBC操作
|
public class SimpleJDBCDemo01 {
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的对象) 静态处理块
Statement state=conn.createStatement();
// 4.准备sql语句
String sql="select empno,ename from emp where sal=800";
// 5.发送|执行sql
ResultSet result=state.executeQuery(sql);//执行查询
// 6.获取到结果集 没进入循环就是一条数据
while(result.next()){
Long l=result.getLong("empno");
String str=result.getString(2);
System.out.println(l+"-->"+str);
}
// 7.关闭资源
result.close();
state.close();
conn.close();
}
}
2. 创建db.properties,便于维护
/*
* 1.硬编码问题(不便于后期维护)
* 2.异常捕获
*/
public class JDBCDemo02 {
public static void main(String[] args) {
Properties pro=new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//1.加载驱动
try {
Class.forName(pro.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn=null;
Statement state=null;
ResultSet result=null;
//2.创建连接
try {
conn=DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("name"),
pro.getProperty("pwd"));
//3.创建处理块
state=conn.createStatement();
//4.准备sql
String sql="select deptno,dname,loc from dept";
//5.执行sql,接受结果集
result=state.executeQuery(sql);
//6.处理
while(result.next()){
System.out.print(result.getObject(1)+"\t"); //字段索引从1开始
System.out.print(result.getObject(2)+"\t"); //字段索引从1开始
System.out.println(result.getObject(3)); //字段索引从1开始
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭
try {
if(result!=null){
result.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(state!=null){
state.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3封装成连接jdbc的工具类
加载驱动
连接
关闭
package 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;
/*
* 连接jdbc的工具类
* 加载驱动
* 连接
* 关闭
*/
public class DBUtils {
static Properties pro=new Properties();
static{
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//1.加载驱动
try {
Class.forName(pro.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//连接
public static Connection getConnection() throws SQLException{
Connection conn =null;
conn = DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("name"),
pro.getProperty("pwd"));
return conn;
}
//关闭
public static void close(ResultSet result,Statement state,Connection conn){
try {
if(result!=null){
result.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(state!=null){
state.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Statement state,Connection conn){
try {
if(state!=null){
state.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}