java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料
保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。
入门案例,仅供体验。
开发一个rmi案例,分为以下几步: 1. 创建远程接口及声明远程方法(继承Remote接口)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)
3. 启动RMI注册服务,并注册远程对象
4. 客户端查找远程对象,并调用远程方法
5. 执行程序:启动服务、运行客户端进行调用
本案例用到数据库MySQL,给出建库建表语句:
1CREATE DATABASE rmi; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sno` varchar(50) DEFAULT NULL, `math` int(11) DEFAULT NULL, `chinese` int(11) DEFAULT NULL, `english` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
代码:
远程接口IStudentService
1package doc_03_rmi.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IStudentService extends Remote {
public boolean add(Student stu) throws RemoteException;
public boolean deleteBySno(String sno) throws RemoteException;
public boolean update(Student stu) throws RemoteException;
public Student queryBySno(String sno) throws RemoteException;
}
接口实现StudentServiceImpl
1package doc_03_rmi.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 模块说明: web service interface
*
*/
public class StudentServiceImpl extends UnicastRemoteObject implements IStudentService {
private static final long serialVersionUID = 4448170447514198534L;
public StudentServiceImpl() throws RemoteException {
super();
}
// query
@Override
public Student queryBySno(String sno) {
StudentDAO sd = StudentDAO.getInstance();
return sd.queryBySno(sno);
}
// add
@Override
public boolean add(Student stu) {
StudentDAO sd = StudentDAO.getInstance();
return sd.add(stu);
}
// delete
@Override
public boolean deleteBySno(String sno) {
StudentDAO sd = StudentDAO.getInstance();
return sd.deleteBySno(sno);
}
// update
@Override
public boolean update(Student stu) {
StudentDAO sd = StudentDAO.getInstance();
return sd.update(stu);
}
}
数据访问StudentDAO
1package doc_03_rmi.server;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 模块说明:数据访问
*
*/
public class StudentDAO {
private final DBUtil db = DBUtil.getDBUtil();
private ResultSet rs;
private static StudentDAO sd = null;
private StudentDAO() {
}
public static synchronized StudentDAO getInstance() {
if (sd == null) {
sd = new StudentDAO();
}
return sd;
}
// add
public boolean add(Student stu) {
boolean result = false;
if (stu == null) {
return result;
}
try {
// insert
String sql = "insert into student(name,sno,age,math,chinese,english) values(?,?,?,?,?,?)";
Object[] param = { stu.getName(), stu.getSno(), stu.getAge(), stu.getMath(), stu.getChinese(),
stu.getEnglish() };
if (db.executeUpdate(sql, param) == 1) {
result = true;
}
} finally {
destroy();
}
return result;
}
// delete
public boolean deleteBySno(String sno) {
boolean result = false;
if (sno == null || "".equals(sno)) {
return result;
}
String sql = "delete from student where sno=?";
String[] param = { sno };
int rowCount = db.executeUpdate(sql, param);
if (rowCount == 1) {
result = true;
}
destroy();
return result;
}
// update
public boolean update(Student stu) {
boolean result = false;
if (stu == null) {
return result;
}
try {
// update
String sql = "update student set name=?,age=?,math=?,chinese=?,english=? where sno=?";
Object[] param = { stu.getName(), stu.getAge(), stu.getMath(), stu.getChinese(), stu.getEnglish(),
stu.getSno() };
int rowCount = db.executeUpdate(sql, param);
if (rowCount == 1) {
result = true;
}
} finally {
destroy();
}
return result;
}
// query by sno
public Student queryBySno(String sno) {
Student result = null;
if ("".equals(sno) || sno == null) {
return result;
}
String sql = "select * from student where sno=?";
String[] checkParam = { sno };
rs = db.executeQuery(sql, checkParam);
try {
if (rs.next()) {
result = new Student();
result.setAge(rs.getInt("age"));
result.setChinese(rs.getInt("chinese"));
result.setEnglish(rs.getInt("english"));
result.setMath(rs.getInt("math"));
result.setName(rs.getString("name"));
result.setSno(rs.getString("sno"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
destroy();
}
return result;
}
private void destroy() {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException se) {
se.printStackTrace();
} finally {
db.close();
}
}
}
实体类Student,必须实现序列化
1package doc_03_rmi.server;
import java.io.Serializable;
/**
* 模块说明: 实体类Student
*
*/
public class Student implements Serializable {
private static final long serialVersionUID = 8387183977965821422L;
private String name; // 名字
private int age; // 年龄
private String sno; // 学号
private int math; // 数学成绩
private int chinese; // 语文成绩
private int english; // 英语成绩
public int getTotal() {
return (math + chinese + english);
}
public int getAvg() {
return getTotal() / 3;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
}
数据库工具类DBUtil
1package doc_03_rmi.server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 模块说明:数据库工具类
*
*/
public class DBUtil {
private static DBUtil db;
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
private DBUtil() {
}
public static DBUtil getDBUtil() {
if (db == null) {
db = new DBUtil();
}
return db;
}
public int executeUpdate(String sql) {
int result = -1;
if (getConn() == null) {
return result;
}
try {
ps = conn.prepareStatement(sql);
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
public int executeUpdate(String sql, Object[] obj) {
int result = -1;
if (getConn() == null) {
return result;
}
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
result = ps.executeUpdate();
close();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
public ResultSet executeQuery(String sql) {
if (getConn() == null) {
return null;
}
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public ResultSet executeQuery(String sql, Object[] obj) {
if (getConn() == null) {
return null;
}
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
private Connection getConn() {
try {
if (conn == null || conn.isClosed()) {
Class.forName("com.mysql.<a href="http://www.cfei.net/archives/tag/jdbc" title="浏览关于“jdbc”的文章" target="_blank" class="tag_link">jdbc</a>.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/rmi?useUnicode=true&amp;characterEncodeing=UTF-8", "root",
"root");
}
} catch (ClassNotFoundException e) {
System.out.println("jdbc driver is not found.");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void close() {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注册服务、注册远程对象:
1package doc_03_rmi.server;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Register {
public static void main(String[] args) {
try {
IStudentService personService = new StudentServiceImpl();
// 注册通讯端口
LocateRegistry.createRegistry(6600);
// 注册通讯路径
Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);
System.out.println("Service Start!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端:
1package doc_03_rmi.client;
import java.rmi.Naming;
import doc_03_rmi.server.IStudentService;
import doc_03_rmi.server.Student;
/**
* 模块说明: 使用java的RMI完成对增/删/改/查的<a href="http://www.cfei.net/archives/tag/%e8%bf%9c%e7%a8%8b%e8%b0%83%e7%94%a8" title="浏览关于“远程调用”的文章" target="_blank" class="tag_link">远程调用</a>
*
*/
public class Client {
public static void main(String[] args) {
try {
// 调用远程对象,注意RMI路径与接口必须与服务器配置一致
IStudentService studentService = (IStudentService) Naming.lookup("rmi://127.0.0.1:6600/PersonService");
// add
Student studentAdd = new Student();
studentAdd.setAge(40);
studentAdd.setName("zhugeliang");
studentAdd.setSno("009");
studentAdd.setChinese(50);
studentAdd.setEnglish(80);
studentAdd.setMath(90);
boolean isSuccess = studentService.add(studentAdd);
System.out.println("add is successful? " + isSuccess);
// query
Student stu = studentService.queryBySno("009");
System.out.println(stu.getName() + " " + stu.getAge() + " " + stu.getSno() + " " + stu.getChinese() + " "
+ stu.getMath() + " " + stu.getEnglish());
// update
Student studentUpdate = new Student();
studentUpdate.setAge(20);
studentUpdate.setName("zhugeliang");
studentUpdate.setSno("009");
studentUpdate.setChinese(70);
studentUpdate.setEnglish(70);
studentUpdate.setMath(70);
boolean updateIsSuccess = studentService.add(studentUpdate);
System.out.println("update is successful? " + updateIsSuccess);
// delete
boolean delIsSuccess = studentService.deleteBySno("009");
System.out.println("delete is successful? " + delIsSuccess);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
运行结果(仅供参考):
end.
javarmi远程调用jdbc
因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。
后续会有更多的精彩的内容分享给大家。
支付宝扫一扫
微信扫一扫
