使用JDBC在客户端操作服务端的ORACLE数据库:
首先确保客户端和服务器端能正常连接
在客户端我们为方便使用先编写一个工具类,用来获得数据库连接对象,代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDUtil {
private JDUtil() {
}
public static Connection conCreate() {
Connection con = null;
try {
//加载驱动,java没有自带这个,需要导入
Class.forName("oracle.jdbc.driver.OracleDriver");
//定义连接字符串,@后面是数据库服务端所在的ip地址,ORCLE是我的数据库全局名
String url = "jdbc:oracle:thin:@192.168.193.128:1521:ORCLE";
// 获得数据库连接,system是我的用户名,密码
con = DriverManager.getConnection(url, "system", "system");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
假设我们要在客户端创建一个表myemp,包含empno,ename,sal三列,用sql注入的方法,代码如下:
public void createTable() {
try {
// 获得连接对象
Connection con = JDUtil.conCreate();
// SQL语句,注意里面不要加分号,否则会报无效字符
String sql = "create or replace table MyEmp(empno number(10) not null,ename varchar2(20),sal number(10))tablespace USERS";
// 获得sql编译执行对象
Statement stm = con.createStatement();
// 执行sql
System.out.println(sql);
stm.execute(sql);
System.out.println("myemp表创建成功");
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
在客户端用sql语句插入数据,代码如下:
public void addDate(int empno, String ename, double sal) {
try {
// 获得连接对象
Connection con = JDUtil.conCreate();
// SQL语句,
String sql = "insert into myemp values(?,?,?)";
// 获得sql编译执行对象
PreparedStatement pstm = con.prepareStatement(sql);
// 给?赋值
pstm.setInt(1, empno);
pstm.setString(2, ename);
pstm.setDouble(3, sal);
System.out.println(sql);
// 执行sql,注意不要给execute()传参数
pstm.execute();
System.out.println("myemp表数据添加成功");
} catch (SQLException e) {
e.printStackTrace();
}
}
理论上操作数据库都可以通过sql注入的方法操作数据库,但这中方法效率不高,而且不够安全。我们可以先在服务端数据库编写过程、函数然后在客户端调用,可以极大的提高效率。
我们如果想插入数据,可以先在服务端先定义一个过程:
create procedure pro_addemp(empno number,ename varchar2,sal number) is
begin
insert into myemp values(empno,ename,sal);
end;
在服务端,调用该过程:
//为方便多次输入数据,我们用一个类Emp存储一个小单元的数据
public class Emp {
int empno;
String ename;
double sal;
public Emp(int empno, String ename, double sal) {
this.empno = empno;
this.ename = ename;
this.sal = sal;
}
}
//定义添加数据的方法
public void pro_addemp(Emp emp){
try {
// 获得连接对象
Connection con = JDUtil.conCreate();
// SQL语句,
String sql = "{call pro_addemp(?,?,?)}";
//获得sql编译执行对象
CallableStatement cstm = con.prepareCall(sql);
//给?赋值
cstm.setInt(1,emp.empno);
cstm.setString(2, emp.ename);
cstm.setDouble(3, emp.sal);
//执行sql
cstm.execute();
System.out.println("myemp表数据添加成功");
} catch (SQLException e) {
e.printStackTrace();
}
}
//调用该方法:
public class MyJDBC {
public static void main(String[] args) {
MyJDBC mj = new MyJDBC();
LinkedList<Emp> elist = new LinkedList<Emp>();
elist.add(new Emp(7001,"原二平",5000.0));
elist.add(new Emp(5003,"诸葛明",4000.5));
elist.add(new Emp(2002, "邱大云", 6000.0));
elist.add(new Emp(1001, "马山", 8000.0));
for(int i=0;i<elist.size();i++){
Emp e = elist.get(i);
System.out.println(e.ename);
mj.pro_addemp(e);
}
}
假设我们想查询sal(薪水)>4000的员工姓名和薪水可以通过PL/SQL先在数据库编写一个查询的过程,代码如下:
--定义一个游标,存放在包里面方便重复使用
create or replace package package_cursor is
type emp_sal_cursor is ref cursor;
end;
--定义一个带参数的过程,用来根据传入的参数,输出符合要求的收据
create or replace procedure pro_chasal(csal in number,v_cursor out package_cursor.emp_sal_cursor) is
begin
open v_cursor for select ename,sal from myemp where sal>csal;
end;
在客户端调用该过程,代码如下:
public void pro_chaSal(double sal){
try {
// 获得连接对象
Connection con = JDUtil.conCreate();
// SQL语句,
String sql = "{call pro_chasal(?,?)}";
//获得sql编译执行对象
CallableStatement cstm = con.prepareCall(sql);
//给?赋值
cstm.setDouble(1, sal);
cstm.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
System.out.println(sql);
//执行sql
cstm.execute();
ResultSet rs = (ResultSet) cstm.getObject(2);
while(rs.next()){
String name = rs.getString(1);
double sal2 = rs.getDouble(2);
System.out.println(name+","+sal2);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Tips:如何在服务端输出指定内容?
用PL/SQL编写的代码如下:
--打开输出
set serveroutput on
--输出empno=7010的员工编号、姓名、薪水
declare
v_empno myemp.empno%type;
v_ename myemp.ename%type;
v_sal myemp.sal%type;
begin
select empno,ename,sal into v_empno,v_ename,v_sal from myemp where empno=7010;
dbms_output.put_line(v_empno||v_ename||v_sal);
end;