C/Sアーキテクチャのデータベース操作
最近1つの課程の設計をして、C/Sアーキテクチャを使う必要があって、クライアントはデータベースを添削して調べる要求を出して、サービス側はデータベースの具体的な操作を完成する必要があって、このようにデータの安全を保証することができます.データベースはAccessを採用して、名前はstudentで、Fディスクのルートディレクトリの下に置いて、ファイルは添付ファイルを参照します.実装結果は次のとおりです.
サービス:
クライアント:検索結果は小文
実装コードは次のとおりです.
ServerFrame.JAvaはサービス側のインタフェースを実現する:
Server.JAvaはサービス側とクライアントとの通信を実現する:
DataBase.JAvaは、データベースに関する操作を実現します.
次に、クライアントのテストプログラムを示します.
Client.java
サービス:
クライアント:検索結果は小文
実装コードは次のとおりです.
ServerFrame.JAvaはサービス側のインタフェースを実現する:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
/**
*
* @author xwz0528
*
*
*/
public class ServerFrame extends JFrame{
public static int port=6000;
Server sev;
public ServerFrame() {
JPanel p1=new JPanel(new GridLayout(2,2));//
JLabel jlb1=new JLabel(" :");
final JLabel jlbPort=new JLabel("6000");
JLabel jlb2=new JLabel(" :");
final JLabel jlbNow=new JLabel(" ");
p1.add(jlb1);
p1.add(jlbPort);
p1.add(jlb2);
p1.add(jlbNow);
p1.setBorder(new TitledBorder(" "));
JPanel p2=new JPanel(new GridLayout(3,2));//
JPanel p21=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
JLabel jlb3=new JLabel(" :");
final JTextField jtfPort=new JTextField("6000",8);
p21.add(jlb3);
p21.add(jtfPort);
JPanel p22=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
final JButton jbnApply=new JButton(" ");//
p22.add(jbnApply);
JLabel jlb6=new JLabel("");
p2.add(jlb6);
p2.add(p21);
p2.add(p22);
p2.setBorder(new TitledBorder(" "));
JPanel p3=new JPanel(new GridLayout(2,2));
JPanel p31=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));//
final JButton jbnStart=new JButton(" ");//
p31.add(jbnStart);
JPanel p32=new JPanel(new FlowLayout(FlowLayout.CENTER,4,4));
final JLabel jlbWork=new JLabel(" !");
p32.add(jlbWork);
JLabel jlb4=new JLabel("");
JLabel jlb5=new JLabel("");
p3.add(jlb4);
p3.add(jlb5);
p3.add(p31);
p3.add(p32);
setLayout(new BorderLayout());
add(p1,BorderLayout.WEST);
add(p2,BorderLayout.EAST);
add(p3,BorderLayout.SOUTH);
//
//
jbnApply.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String str=jtfPort.getText();//
port=Integer.parseInt(str);
jlbPort.setText(str);//
}
});
//
jbnStart.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
jbnStart.setEnabled(false);
jbnApply.setEnabled(false);
jtfPort.setEnabled(false);
jlbNow.setText(" ");
sev=new Server();
sev.start();
}
});
}
public static void main(String[] args) {
JFrame frame=new ServerFrame();
frame.setTitle(" (ESMS) ");
frame.setSize(380,300);
frame.setLocationRelativeTo(null);//center
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Server.JAvaはサービス側とクライアントとの通信を実現する:
import java.net.*;
import java.io.*;
/**
*
* @author xwz0528
*
* , 、 、 、 sql ,
*
* ,
*/
public class Server extends Thread{
private ServerSocket ss;
private Socket s;
//private volatile boolean isStop=false;//
public Server()
{
}
public void run()
{
try
{
ss=new ServerSocket(ServerFrame.port);
//
while(true)// ( )
{
s=ss.accept();
if(s!=null)
{
InputStream is=s.getInputStream();
byte[] buf=new byte[100];
int len=is.read(buf);
if(len!=-1)
{
String sql=new String(buf,0,len);// sql
String[] split=sql.split(" ");//
String sqlKey=split[0];//sql ,
if(sqlKey.equals("insert")||sqlKey.equals("delete")||sqlKey.equals("update"))
{
DataBase.executeSql(sql);
}
else if(sqlKey.equals("select"))//
{
//
OutputStream os=s.getOutputStream();
String result=DataBase.getQueryResult(sql);
os.write(result.getBytes());//
}
}
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
DataBase.JAvaは、データベースに関する操作を実現します.
import java.sql.*;
/**
*
* @author xwz0528
*
*
*/
public class DataBase {
public static Connection con = null;
public static Statement st = null;
public static ResultSet rs; //
//
public static void getConn() {
try {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; //
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=F:\\student.mdb";// URL
Class.forName(driver);
DataBase.con = DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
}
//
public static void closeConn() {
try {
if (DataBase.con != null) {
DataBase.con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// ( )、 ( )、 ( )
public static void executeSql(String sql){
try{
DataBase.getConn();
st = DataBase.con.createStatement();
st.executeUpdate(sql);// executeUpdate()
DataBase.con.commit();
DataBase.closeConn();// ,
}
catch(Exception e){
e.printStackTrace();
}
}
// , , ( )
public static String getQueryResult(String sql) {
String result="";
try {
DataBase.getConn();
st = DataBase.con.createStatement();
rs = st.executeQuery(sql);// executeQuery
while(rs.next())
{
result=rs.getString(2);//
}
DataBase.closeConn();// ,
return result;
} catch (Exception e) {
e.printStackTrace();
return result;
}
}
}
次に、クライアントのテストプログラムを示します.
Client.java
import java.net.*;
import java.io.*;
public class Client extends Thread{
public static String result="";
public static Socket s;
public Client()
{
try
{
s=new Socket(InetAddress.getByName("localhost"),6000);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public void run()
{
try
{
//
while(true)// ( )
{
if(s!=null)
{
InputStream is=s.getInputStream();
byte[] buf=new byte[100];
int len=is.read(buf);
if(len!=-1)
{
Client.result=new String(buf,0,len);
}
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void send()
{
try
{
OutputStream os=s.getOutputStream();
// 356 ( )
os.write("select * from db_student where =356".getBytes());
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args)
{
Thread client=new Client();
client.start();//
Client.send();// sql
try
{
Thread.sleep(1000);// ,
}
catch(Exception ex)
{
ex.printStackTrace();
}
if(!Client.result.isEmpty())
{
System.out.print(Client.result);
}
}
}