使用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;
相关推荐
Android购物商城App+客户端+服务端+数据库。 购物商城App+客户端+服务端+数据库 基本的登陆注册以及商品购买浏览功能齐全 购物商城App
高仿QQ源码 包括客户端加服务端加数据库全套代码
Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库.rar
Android 应用完整源码 客户端+服务端+数据库
实操项目中切割下来的一部分,功能完整可实现,希望能帮到大家。
高仿QQ源码 客户端 服务端 数据库可编译架设外网,自己下载研究,小白不要尝试
QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载QQ客户端和服务端下载...
服务端封装数据库操作客户端调用,服务端封装数据库操作客户端调用
一款即时通讯软件,实现类似QQ的数据传输功能,包含登录和主界面的设计。
Android应用源码高仿QQ客户端加服务端加数据库全套
购物商城App+客户端+服务端+数据库 基本的登陆注册以及商品购买浏览功能齐全
Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库
Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库.zip
高仿QQ源码 包括客户端加服务端加数据库全套代码(wcf修改版),服务端可以实时监控客户端的操作,每个操作都能监控。
Socket实例之客户端向服务端数据库上传文件UI版
基于QT和Linux实现的qq客户端和服务端源码+sql数据库.zip基于QT和Linux实现的qq客户端和服务端源码+sql数据库.zip基于QT和Linux实现的qq客户端和服务端源码+sql数据库.zip基于QT和Linux实现的qq客户端和服务端源码+...