Java SE JDBC
1、JDBC
JDBC: java database connectivity java 与数据库的连接
2、角色分类
2.1、服务器(db)
- 接收 sql
- 执行 sql
- 返回结果
2.2、客户端(java)
- 接收数据
- 组装sql
- 发送SQL(与数据库建立联系)
- 分析结果
3、 面向接口编程
1、java 制定标准 ,不同的数据库厂商实现 接口即可。java 中提供的接口 java.sql.* 包下,常用接口如下
接口名称 | 作用 |
---|---|
java.sql.Connection | 连接 |
java.sql.Statement | 静态处理块 |
java.sql.PreparedStatement | 预处理块 |
java.sql.ResultSet | 结果集 |
java.sql.ResultSetMetaData | 结果集元信息 |
2、oracle 厂商实现接口 (jar)
F:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar 视安装路径而定
4、jdbc步骤
JDBC 步骤 | 类比快递 |
---|---|
加载驱动(完整路径): Class.forname("") | 1、选择快递公司 |
建立连接(url 用户名 密码) java.sql.Connection;conn=DriverManager.getConnection() | 2、与快递公司建立联系(电话号码 唯一信息) |
创建处理块 Statement ;PreparedStatement | 3、快递员 收包裹 |
执行: execute(ddl) int executeUpdate(dml) ResultSet executeQuery(select) | 4、打包 投递 |
分析结果 :ddl -->没有异常 dml—>>0 select–>分析结果集 | 5、签收 |
释放资源 | 6、打发走人 |
-
加载驱动 (选择数据库)
Class.forname(’’’); -
获取连接 (与数据库建立连接)
java.sql.Connection
Connection conn=DriverManager.getConnection() -
准备sql
String sql; -
封装处理块
java.sql.Statement 静态处理块
statement= conn.createStatement();
java.sql.PreparedStatement 预处理块
PreparedStatement=conn.prepareStatement(sql) -
发送执行sql,得到结果集
java.sql.ResultSet
resultSet=statement.executeQuery(select); -
处理结果
打印 -
关闭
close();
4.2、静态处理块 Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数的简单 SQL 语句。执行静态 SQL 语句并返回它所生成结果的对象。
4.2.1.创建 :
连接.Connection.createStatement()
Connection con =
DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:XE”,"SCOTT
",“TIGER”);
4.2.2. 执行 :
- ddl -->execute(dd语句) – 通常不会在代码中执行
- dml -->executeUpdate(dml语句)
- select -->executeQuery(select)
4.2.3. 特点 :
- 处理 不变的静态的 sql 语句
- 优点: 直接查看sql ,方便处理错误
- 缺点:性能不高 拼接 sql 麻烦 可能存在 sql 注入
4.3、 预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,并与之在两方面有所不同:有人主张,在 JDBC 应用中,如果你已经是稍有水平开发者,你就应该始终以 PreparedStatement 代替 Statement.也就是说,在任何时候都不要使用 Statement。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
4.3.1.创建:
创建:连接.prepareStatement(sql)
4.3.2.执行:
- 存在**?** ,先填充参数再执行
- ddl -->execute()
- dml -->executeUpdate()
- select -->executeQuery()
4.2.3.特点:
- 处理 不变的静态的 sql 语句 |可变的 sql 语句 带 ? 的 sql
- 优点:性能高,方便编写sql 不存在sql注入 安全
- 缺点:不能直接打印sql语句 不方便处理错误
5、连接
5.1、准备工作
- 引入驱动包
- 构建路径 build path
- 测试用户是否正确登录
5.2、建立连接
5.2.1、连接字符串
驱动: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@db 服务器地址:端口:实例
连接 url->jdbc:oracle:thin:@localhost:1521:XE
用户名: SCOTT
密码: TIGER
5.2.2、加载驱动
- 硬编码: new oracle.jdbc.driver.OracleDriver();
- 软编码: class.forName(“oracle.jdbc.driver.OracleDriver”)
5.3 测试
5.3.1 静态处理块 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:orcl",
"ning",
"ning"
);
// 3.准备sql
String select="select * from emp";//sql语句 //注意: sql最后不要添加;
//4.封装处理块
Statement statement= conn.createStatement();
//5.发送执行sql,得到结果集
ResultSet resultSet=statement.executeQuery(select);
//6.处理结果
while(resultSet.next()){
int empno=resultSet.getInt(1);//字段的索引从1开始
String ename=resultSet.getString("ename");//字段名字
String job=resultSet.getString(3);
System.out.println("编号:"+empno+",姓名:"+ename+",工作:"+job);
}
//7.关闭
conn.close();
}
}
5.3.2、预处理块 PreparedStatement
import com.xxxx.utils.JDBCUtils;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/*
手动提交事务
转账:
张三给李四转账1000元
update t_user set account=account-1000 where username='zhangsan';
update t_user set account=account+1000 where username='lisi';
*/
public class JDBCDemo04 {
public static void main(String[] args) {
//获取连接
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
conn = JDBCUtils.getConnection();
//设置手动提交事务
conn.setAutoCommit(false);
//2.准备sql
String sql1 = "update t_user set account=account-1000 where username='zhangsan'";
String sql2 = " update t_user set account=account+1000 where username='lisi'";
//3.构建预处理块
ps1 = conn.prepareStatement(sql1);
ps2 = conn.prepareStatement(sql2);
//4.执行
int rows1 = ps1.executeUpdate();
int rows2 = ps2.executeUpdate();
//5.处理结果
if(rows1>0 && rows2>0){
conn.commit(); //提交
System.out.println("转账成功");
}else{
conn.rollback(); //回滚
System.out.println("转账失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
}
}
}