打开eclipse,创建一个java项目
(File→New→Java Project)项目名称自定,但jre
必须是自己已经安装的,如下图所示:
创建完项目后,在项目下新建一个lib文件夹,用于放置所需的依赖包
然后打开自己所装的Oracle12c的目录E:\app\Oracle12c\product\12.2.0\dbhome_1\jdbc\lib
,如下图所示:
将上图lib
目录下的ojdbc.jar
,版本必须跟创建项目所用的jre
版本对应,如我的:将ojdbc8.jar
文件复制了放到eclipse中java项目的lib
文件夹中:
选中该文件,右键选择“Build Path”→“add to Build Path”,就会多出一个文件,如图所示:
在src目录中新建一个包:jdbc.utils
,在该包中新建一个java文件:JDBCUtils.java
在其中添加如下代码:
package jdbc.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static String driver = "oracle.jdbc.OracleDriver";
private static String url = "jdbc:oracle:thin:@localhost:1521:HYHCJ";//数据库连接名HYHCJ
private static String user = "c##scott";//用户名
private static String password = "tiger";//密码
//注册数据库驱动
static {
try {
Class.forName(driver);
}catch (ClassNotFoundException e) {
// TODO: handle exception
throw new ExceptionInInitializerError();
}
}
//获取数据库连接
public static Connection getConnection() {
try {
return DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//释放数据库的资源
public static void release(Connection conn,Statement st,ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
rs = null;
}
}
if(st != null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
st = null;
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
conn = null;
}
}
}
}
在该项目中导入依赖包,如下图所示:
然后就多出了下图所示的文件:
测试一下连接情况
在src目录中再新建一个包:jdbc.Oracle
,在该包中新建一个java文件:TestProcedure.java
,在其中添加如下代码:
package jdbc.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import jdbc.utils.JDBCUtils;
import oracle.jdbc.OracleTypes;
public class TestProcedure {
@Test
public void testProcedure() {
//{call <procedure-name[(<arg1>,<arg2>, ...)]>}
String sql = "{call queryempinform(?,?,?,?)}";
Connection conn = null;
CallableStatement call = null;
try {
conn = JDBCUtils.getConnection();
call = conn.prepareCall(sql);
//对in参数,赋值
call.setInt(1, 7839);
//对out参数,赋值
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3, OracleTypes.NUMBER);
call.registerOutParameter(4, OracleTypes.VARCHAR);
//执行调用
call.execute();
//取出结果
String name = call.getString(2);
double sal = call.getDouble(3);
String job = call.getString(4);
System.out.println(name+"\t"+sal+"\t"+job);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.release(conn, call, null);
}
}
}
运行测试一下:
测试存储函数:
在jdbc.Oracle
包中新建一个java文件:TestFunction.java
,在其中添加如下代码:
package jdbc.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import jdbc.utils.JDBCUtils;
import oracle.jdbc.OracleTypes;
public class TestFunction {
@Test
private void testFunction() {
// TODO Auto-generated method stub
//{call <procedure-name[(<arg1>,<arg2>, ...)]>}
String sql = "{? = call queryempinform(?)}";
Connection conn = null;
CallableStatement call = null;
try {
//得到数据库连接
conn = JDBCUtils.getConnection();
//基于连接创建statement
call = conn.prepareCall(sql);
//对于输出参数,申明
call.registerOutParameter(1, OracleTypes.NUMBER);
//对于输入参数,赋值
call.setInt(2, 7839);
//执行调用
call.execute();
//取出年收入的结果
double income = call.getDouble(1);
System.out.println("该员工的年收入是:"+income);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.release(conn, call, null);
}
}
}
测试结果:
package jdbc.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import jdbc.utils.JDBCUtils;
import oracle.jdbc.OracleTypes;
public class TestFunction {
@Test
private void testFunction() {
// TODO Auto-generated method stub
//{call <procedure-name[(<arg1>,<arg2>, ...)]>}
String sql = "{? = call queryempinform(?)}";
Connection conn = null;
CallableStatement call = null;
try {
//得到数据库连接
conn = JDBCUtils.getConnection();
//基于连接创建statement
call = conn.prepareCall(sql);
//对于输出参数,申明
call.registerOutParameter(1, OracleTypes.NUMBER);
//对于输入参数,赋值
call.setInt(2, 7839);
//执行调用
call.execute();
//取出年收入的结果
double income = call.getDouble(1);
System.out.println("该员工的年收入是:"+income);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.release(conn, call, null);
}
}
}