`
SpringWillComing
  • 浏览: 4392 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

如何在客户端操作服务端的ORACLE数据库(初级篇)

 
阅读更多

使用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;

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics