【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();
				}
			}
		}
	}

}