【JDBC】day01_Java连接Oracle数据库过程及常用方法
1.JAVA连接数据库标准流程:
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC java数据库连接
* JDBC是java连接数据库的解决方案,其提供了一套用于连接数据库
* 的通用接口.不同的数据库提供商负责编写实现类来满足java连接该
* 数据库.数据库提供商会将这一组实现类打包成一个JAR包,我们也称
* 这个JAR包为该数据库的驱动包.
* JDBC每个接口都定义了相关的抽象方法,无论连接哪个数据库,过程
* 都是一样的,并且我们只需要面向JDBC提供的几口即可.无需了解不同
* 数据库驱动包中的实现类.
*
* 连接数据库标准流程:
* 1:注册驱动Class.forName()
* 2:加载驱动建立数据库连接DriverManager
* 3:通过连接创建执行SQL语句的对象Connection
* 4:使用语句对象执行SQL Statement
* 5:若是查询语句,则可以获取结果集 ResultSet
* 6:使用完毕后关闭连接释放资源
*/
public class JDBCDemo1 {
public static void main(String[] args) {
/*
* java.sql.Connection 是一个接口,表示与特定数据库
* 的连接,不同的数据库驱动包中有该接口的实现类.
*/
Connection conn = null;
try{
/*
*1 --注册驱动
*将数据库厂商提供的jar包中JDBC要求的驱动类导入
*环境中以便JVM可以执行它.
*由于不同厂商的jar包中的目录结构和实现类的名字
*不同,这里的字符串内容不一样.
*
*执行这句话时,可能出现:ClassNotFoundException
*常见的两种情况:
*1:字符串内容拼写有误
*2:驱动jar包没有导入环境变量中(build path)
*/
Class.forName("oracle.jdbc.driver.OracleDriver");
/*
* 2 --建立连接
* 通过DriverManager加载驱动并与数据库建立连接,
* 不同的数据库连接地址格式不一样.
*
* 调用静态方法getConnection时需要传入3个参数:
* 1:数据库URL jdbc:oracle:thin:@host:port:sid
* 2:数据库用户名
* 3:数据库密码
*/
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.201.203:1521:orcl",
"openlab",
"open123"
);
System.out.println("数据库已连接!");
/*
* 3 --Statement实例
* 创建用于执行SQL语句的Statement实例
* 同样的,Statement也是接口,驱动包中会有对应的实现类.
* 不过我们不需要关心,只当它是Statement用即可
*/
Statement state = conn.createStatement();
/*
* 执行SQL语句
* Statement针对不同的SQL语句提供了不同的方法,常见方法:
* --boolean execute(String sql)
* 什么语句都可以执行,但DML,DQL由不同的方法执行,所以
* 该方法普遍用来执行DDL.
*
* --int executeUpdate(String sql)
* 执行DML语句,返回值为影响数据库多少条数据.
*
* --ResultSet executeQuery(String sql)
* 执行DQL语句,返回值为查询的结果集.
*/
String sql = "SELECT empno,ename,job,sal,deptno FROM emp";
//执行查询语句使用executeQuery方法
ResultSet rs = state.executeQuery(sql);
/*
* 结果集遍历方式:
* 结果集默认指向第一条记录之上.
* ResultSet遍历结果集常用方法:
* 1:boolean next()
* 该方法的作用是让结果集表示下一条记录,若结果集有
* 下一条记录,则返回true,并表示该条记录,否则返回false.
* 2:XXX getXXX(String colName)
* 根据字段名返回当前记录中该字段的值,不同的字段类型要
* 调用不同类型的方法,比如获取varchar类型要调用:
* String getString(String colName)
*/
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
String job = rs.getString("job");
int sal = rs.getInt("sal");
int deptno = rs.getInt("deptno");
System.out.println(empno+","+ename+","+job+","+sal+","+deptno);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
}
2.常用方法:
1)boolean execute(String sql)
通常使用它来执行DDL语句,返回值若为true,说明执行该SQL后有结果集,由于用它执行DDL,所以返回值为false.
若SQL语句执行有误会抛异常!
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 创建一张表 userinfo
* 字段:
* id NUMBER(6) 主键
* username VARCHAR2(30) 用户名
* password VARCHAR2(30) 密码
* email VARCHAR2(50) 邮箱
* account NUMBER(8) 余额
*
*/
public class JDBCDemo4 {
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.201.203:1521:orcl",
"openlab","open123");
Statement state = conn.createStatement();
String sql = "CREATE TABLE userinfo_qxl( " +
"id NUMBER(6), " +
"username VARCHAR2(30), " +
"password VARCHAR2(30), " +
"email VARCHAR2(50), " +
"account NUMBER(8) " +
")";
System.out.println(sql);
/*
* boolean execute(String sql)
* 通常使用它来执行DDL语句,返回值若为true,说明执行该SQL
* 后有结果集,由于用它执行DDL,所以返回值为false.
* 若SQL语句执行有误会抛异常!
*/
state.execute(sql);
System.out.println("表创建成功!");
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
2)int executeUpdate(String sql)
执行DML语句使用:int executeUpdate(String sql)
返回值为执行完毕后,影响了数据库多少条数据.
JDBC默认自动提交事务的,意思就是,每当我们执行一条DML 操作,就会自动commit!
3)void setAutoCommit(boolean auto)
JDBC默认是自动提交事务,在转账业务中,我们会进行两条UPDATE语句,只有两个更改都成立才应该认为转账成功,否则失败!
这时候需要自行控制事务Connection提供了一个方法:void setAutoCommit(boolean auto)
当参数传入false时,就关闭了自动提交事务.
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 实现转账操作
*
*/
public class JDBCDemo7 {
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.201.203:1521:orcl",
"openlab","open123");
/*
* JDBC默认是自动提交事务,在转账业务中,我们会进行两条UPDATE
* 语句,只有两个更改都成立才应该认为转账成功,否则失败!
* 这时候需要自行控制事务
* Connection提供了一个方法:
* void setAutoCommit(boolean auto)
* 当参数传入法律色时,就关闭了自动提交事务.
*/
conn.setAutoCommit(false);
Statement state = conn.createStatement();
/*
* ROSE转给JACK10000
*/
String sql1 = "UPDATE userinfo_qxl " +
"SET account=account-10000 " +
"WHERE username='ROSE'";
int n = state.executeUpdate(sql1);
if(n==0){
System.out.println("转出方查无此人!");
return ;
}
String sql2 = "UPDATE userinfo_qxl " +
"SET account=account+10000 " +
"WHERE username='jack'";
n = state.executeUpdate(sql2);
if(n==0){
System.out.println("转入方查无此人!");
//回滚事务
conn.rollback();
}else{
System.out.println("OVER");
conn.commit();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}