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

本文介绍如何使用JDBC在客户端操作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;

 

Oracle 数据库客户端 在D:/instantclient_11_2目录下新建目录network,在network目录下再新建admin目录,在admin目录下新建文件tnsnames.ora,使用文本编辑器打开写入如下内容: MWDB= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = MWDB) ) ) 2、添加一个环境变量,名为TNS_ADMIN,值为tnsnames.ora文件所在路径。比如我的本机为:D:/instantclient_11_2/network/admin 3、设置ORACLE的语言,添加环境变量NLS_LANG ,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK 第一个黄色字块:表示定义远程服务器的在本地主机名 第二个黄色字块:远程数据库实例名 如果不清楚远程数据库ORACLE 语言,可以ssh或者telnet到远程机器,在命令界面输入,用命令行连接到数据库。 select * from nls_instance_parameters; 查看NLS_LANGUAGE 的值 NLS_LANGUAGE NLS_TERRITORY 4、下载并安装PL.SQL.Developer配置应用 貌似把环境变量Path添加了instantclient就可以了,不需要具体的设置。 配置tools->preferences->connection Oracle Home     D:/instantclient_11_2 OCI library     D:/instantclient_11_2/oci.dll 中文的PL/SQL Developer就是 工具–>首选项–>连接 Oracle主目录     D:/instantclient_11_2 OCI库     D:/instantclient_11_2/oci.dll 5.添加系统属性中的环境变量Path:D:/instantclient_11_2/可以保证在cmd中使用sqlplus链接到远程的oracle sqlplus TAXYS1_1/TAXYS1_1 @'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.225)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED) (SERVICE_NAME = ORCL)))’ sqlplus TAXYS1_1/TAXYS1_1@'(description=(address_list=(address=(proto=tcp)(host=192.168.0.225)(port=1521)))(connect_data=(service_name=orcl)))’ sqlplus TAXYS1_1/TAXYS1_1@192.168.0.225:1521/orcl --------------------- 作者:我在爱的国 来源:优快云 原文:https://blog.youkuaiyun.com/magaiou/article/details/80322685 版权声明:本文为博主原创文章,转载请附上博文链接!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值