Java可以使用JDBC對(duì)數(shù)據(jù)庫進(jìn)行讀寫。JDBC訪問一般分為如下流程:
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括滑縣網(wǎng)站建設(shè)、滑縣網(wǎng)站制作、滑縣網(wǎng)頁制作以及滑縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,滑縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到滑縣省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1、加載JDBC驅(qū)動(dòng)程序:
在連接數(shù)據(jù)庫之前,首先要加載想要連接的數(shù)據(jù)庫的驅(qū)動(dòng)到JVM(Java虛擬機(jī)),
這通過java.lang.Class類的靜態(tài)方法forName(String className)實(shí)現(xiàn)。
例如:
try{
//加載MySql的驅(qū)動(dòng)類
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驅(qū)動(dòng)程序類 ,加載驅(qū)動(dòng)失?。?);
e.printStackTrace() ;
}
成功加載后,會(huì)將Driver類的實(shí)例注冊(cè)到DriverManager類中。
2、提供JDBC連接的URL
?連接URL定義了連接數(shù)據(jù)庫時(shí)的協(xié)議、子協(xié)議、數(shù)據(jù)源標(biāo)識(shí)。
?書寫形式:協(xié)議:子協(xié)議:數(shù)據(jù)源標(biāo)識(shí)
協(xié)議:在JDBC中總是以jdbc開始
子協(xié)議:是橋連接的驅(qū)動(dòng)程序或是數(shù)據(jù)庫管理系統(tǒng)名稱。
數(shù)據(jù)源標(biāo)識(shí):標(biāo)記找到數(shù)據(jù)庫來源的地址與連接端口。
例如:(MySql的連接URL)
jdbc:mysql://localhost:3306/test?useUnicode=truecharacterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding設(shè)置為
gb2312或GBK,本參數(shù)必須設(shè)置為true 。characterEncoding=gbk:字符編碼方式。
3、創(chuàng)建數(shù)據(jù)庫的連接
?要連接數(shù)據(jù)庫,需要向java.sql.DriverManager請(qǐng)求并獲得Connection對(duì)象,該對(duì)象就代表一個(gè)數(shù)據(jù)庫的連接。
?使用DriverManager的getConnectin(String url,String username,String password )方法傳入指定的欲連接的數(shù)據(jù)庫的路徑、數(shù)據(jù)庫的用戶名和密碼來獲得。
例如:
//連接MySql數(shù)據(jù)庫,用戶名和密碼都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("數(shù)據(jù)庫連接失?。?);
se.printStackTrace() ;
}
4、創(chuàng)建一個(gè)Statement
?要執(zhí)行SQL語句,必須獲得java.sql.Statement實(shí)例,Statement實(shí)例分為以下3種類型:
1、執(zhí)行靜態(tài)SQL語句。通常通過Statement實(shí)例實(shí)現(xiàn)。
2、執(zhí)行動(dòng)態(tài)SQL語句。通常通過PreparedStatement實(shí)例實(shí)現(xiàn)。
3、執(zhí)行數(shù)據(jù)庫存儲(chǔ)過程。通常通過CallableStatement實(shí)例實(shí)現(xiàn)。
具體的實(shí)現(xiàn)方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
5、執(zhí)行SQL語句
Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):執(zhí)行查詢數(shù)據(jù)庫的SQL語句,返回一個(gè)結(jié)果集(ResultSet)對(duì)象。
2、int executeUpdate(String sqlString):用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語句。
具體實(shí)現(xiàn)的代碼:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6、處理結(jié)果
兩種情況:
1、執(zhí)行更新返回的是本次操作影響到的記錄數(shù)。
2、執(zhí)行查詢返回的結(jié)果是一個(gè)ResultSet對(duì)象。
ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法提供了對(duì)這些行中數(shù)據(jù)的訪問。
使用結(jié)果集(ResultSet)對(duì)象的訪問方法獲取數(shù)據(jù):
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1); // 此方法比較高效(列是從左到右編號(hào)的,并且從列1開始)
}
7、關(guān)閉JDBC對(duì)象
操作完成以后要把所有使用的JDBC對(duì)象全都關(guān)閉,以釋放JDBC資源,關(guān)閉順序和聲明順序相反:
1、關(guān)閉記錄集
2、關(guān)閉聲明
3、關(guān)閉連接對(duì)象
if(rs != null){ // 關(guān)閉記錄集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 關(guān)閉聲明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 關(guān)閉連接對(duì)象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
可以使用java中的模塊化編程思想,分成兩個(gè)模塊,一個(gè)模塊用來收集數(shù)據(jù),將收集到的數(shù)據(jù)存儲(chǔ)在一個(gè)數(shù)組中,另一個(gè)模塊用來處理每20條數(shù)據(jù)中選擇一條進(jìn)行入庫。
1.收集數(shù)據(jù):// 聲明一個(gè)數(shù)組,用于存儲(chǔ)收集到的數(shù)據(jù)String[] dataArray = new String[20];// 循環(huán)收集數(shù)據(jù),每次收集20條for(int i=0; i20; i++){ ? ?dataArray[i] = getDataFromSource();}
2.處理數(shù)據(jù):// 隨機(jī)生成一個(gè)數(shù)字,作為要入庫的數(shù)據(jù)的索引int index = (int)(Math.random() * 20);// 取出要入庫的數(shù)據(jù)String data = dataArray[index];// 將數(shù)據(jù)入庫insertDataIntoDB(data);
給你個(gè)流程,自己學(xué)著做,做出來你會(huì)很有成就感的,對(duì)你的技術(shù)也有很大幫助:
倉庫管理系統(tǒng)流程說明
(一)進(jìn)貨管理
現(xiàn)代商業(yè)管理,進(jìn)貨環(huán)節(jié)尤為重要,要求現(xiàn)場實(shí)時(shí)下訂單(Purchase Order),及時(shí)補(bǔ)貨。
1、 業(yè)務(wù)員根據(jù)手中的手持終端(Handheld Terminal,簡稱HHT),調(diào)用后臺(tái)資料,與實(shí)際庫存資料進(jìn)行實(shí) 時(shí)對(duì)照,并可通過終端無線驅(qū)動(dòng)打印機(jī)打印對(duì)照表;
2、 業(yè)務(wù)員根據(jù)實(shí)時(shí)對(duì)照表,現(xiàn)場決定是否應(yīng)補(bǔ)貨或退貨,通過終端調(diào)用后臺(tái)數(shù)據(jù)庫制定訂單,以最快速度進(jìn)行補(bǔ)貨或退貨;維持庫存的合理性。
(二)上架
將貨物存放到貨位上。
(三)交叉駁運(yùn)
這種作業(yè)不對(duì)商品進(jìn)行儲(chǔ)存,只處理信息分類。作業(yè)接受來自制造商的顧客組合訂貨,并把他們裝運(yùn)到個(gè)別的顧客處去。交叉站臺(tái)是指多對(duì)多的配送體系中的貨物調(diào)整。直接通過交叉換貨后為客戶配送,可以避免出入庫的麻煩。
(四)收貨管理
1、 供貨商按照訂單要求將貨品送到商場收貨處;
2、 商場驗(yàn)收人員利用終端調(diào)用后臺(tái)數(shù)據(jù)庫中相應(yīng)的訂單存盤,與供貨商送來的商品逐一檢查對(duì)照,并進(jìn)行確認(rèn),包括:商品編碼、商品數(shù)量、生產(chǎn)地、品種、規(guī)格、包裝時(shí)間、保質(zhì)時(shí)間、舊價(jià)格、新價(jià)格、變更時(shí)間、條形碼標(biāo)準(zhǔn)等信息;
注:終端在系統(tǒng)未授權(quán)的情況下無法修改訂單。
3、 商場驗(yàn)收人員在終端上按[確認(rèn)]鍵,將信息上傳到后臺(tái)服務(wù)器,并同時(shí)記錄收貨時(shí)間和收貨人;
4、 終端可以現(xiàn)場實(shí)時(shí)調(diào)用后臺(tái)數(shù)據(jù)庫中供貨商的歷史訂單,逐一查驗(yàn)對(duì)照核算;
5、 通過終端無線驅(qū)動(dòng)打印機(jī)打印收貨清單;
6、 在查驗(yàn)過程中出現(xiàn)問題,可以拒收貨物。
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
class 商品 extends Panel
{String 代號(hào),名稱;int 庫存;float 單價(jià);
商品(String 代號(hào),String 名稱,int 庫存,float 單價(jià))
{this.代號(hào)=代號(hào);this.名稱=名稱;this.庫存=庫存;this.單價(jià)=單價(jià);
}
}
class ShowWin extends JFrame implements ActionListener
{ Hashtable hashtable=null;
JTextField 代號(hào)文本框=new JTextField(),
名稱文本框=new JTextField(),
庫存文本框=new JTextField(),
單價(jià)文本框=new JTextField(),
查詢文本框=new JTextField(),
查詢信息文本框=new JTextField(),
刪除文本框=new JTextField();
JButton b_add=new JButton("添加商品"),
b_del=new JButton("刪除商品"),
b_xun=new JButton("查詢商品"),
b_xiu=new JButton("修改商品"),
b_show=new JButton("顯示商品清單");
JTextArea 顯示區(qū)=new JTextArea(25,10);
ShowWin()
{super("倉庫管理窗口");
hashtable=new Hashtable();
Container con=getContentPane();
JScrollPane pane=new JScrollPane(顯示區(qū));
顯示區(qū).setEditable(false);
JPanel save=new JPanel();
save.setLayout(new GridLayout(8,2));
save.add(new Label("輸入代號(hào):"));
save.add(代號(hào)文本框);
save.add(new Label("輸入名稱:"));
save.add(名稱文本框);
save.add(new Label("輸入庫存:"));
save.add(庫存文本框);
save.add(new Label("輸入單價(jià):"));
save.add(單價(jià)文本框);
save.add(new Label("單擊添加:"));
save.add(b_add);
save.add(new Label("單擊修改:"));
save.add(b_xiu);
save.add(new Label("輸入查詢代號(hào):"));
save.add(查詢文本框);
save.add(new Label("單擊查詢:"));
save.add(b_xun);
JPanel del=new JPanel();
del.setLayout(new GridLayout(2,2));
del.add(new Label("輸入刪除的代號(hào):"));
del.add(刪除文本框);
del.add(new Label("單擊刪除:"));
del.add(b_del);
JPanel show=new JPanel();
show.setLayout(new BorderLayout());
show.add(pane,BorderLayout.CENTER);
show.add(b_show,BorderLayout.SOUTH);
JSplitPane split_one,split_two;
split_one=new JSplitPane(JSplitPane.VERTICAL_SPLIT,save,del);
split_two=new
JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,split_one,show);
con.add(split_two,BorderLayout.CENTER);
JPanel xun=new JPanel();
xun.add(new Label("所得信息:"));
xun.add(查詢信息文本框);
xun.setLayout(new GridLayout(2,1));
con.add(xun,BorderLayout.SOUTH);
b_add.addActionListener(this);
b_del.addActionListener(this);
b_xun.addActionListener(this);
b_xiu.addActionListener(this);
b_show.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{if(e.getSource()==b_add)
{String daihao=null,mingcheng=null;int kucun=0;float danjia=0.0f;
daihao=代號(hào)文本框.getText();mingcheng=名稱文本框.getText();
kucun=Integer.parseInt(庫存文本框.getText());
danjia=Float.valueOf(單價(jià)文本框.getText()).floatValue();
商品 goods=new 商品(daihao,mingcheng,kucun,danjia);
hashtable.put(daihao,goods);
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out=new ObjectOutputStream(file);
out.writeObject(hashtable); out.close();
}
catch(IOException event){}
}
else if(e.getSource()==b_del)
{String daihao1=刪除文本框.getText();
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in=new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); //////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 temp=(商品)hashtable.get(daihao1);
{hashtable.remove(daihao1);}
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out =new ObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOException event){}
}
//
else if(e.getSource()==b_xun)
{ String aa;
aa=查詢文本框.getText();
查詢信息文本框.setText(null);
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in =new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); ////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 a=(商品)hashtable.get(aa);
查詢信息文本框.setText(" 代號(hào):"+a.代號(hào)+" 名稱:"+a.名稱+" 庫存:"+a.庫存+" 單價(jià):"+a.單價(jià));
}
//
else if(e.getSource()==b_xiu)
{ String bb;
bb=代號(hào)文本框.getText();
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in=new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); //////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 temp=(商品)hashtable.get(bb);
{hashtable.remove(bb);}
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out =new ObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOException event){}
String daihao1=null,mingcheng1=null;int kucun1=0;float danjia1=0.0f;
daihao1=代號(hào)文本框.getText();mingcheng1=名稱文本框.getText();
kucun1=Integer.parseInt(庫存文本框.getText());
danjia1=Float.valueOf(單價(jià)文本框.getText()).floatValue();
商品 goods1=new 商品(daihao1,mingcheng1,kucun1,danjia1);
hashtable.put(daihao1,goods1);
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out=new ObjectOutputStream(file);
out.writeObject(hashtable); out.close();
}
catch(IOException event){}
}
//
else if(e.getSource()==b_show)
{ 顯示區(qū).setText(null);
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in =new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); ////
}
catch(ClassNotFoundException event){}
catch(IOException event){}
Enumeration enum=hashtable.elements();
while(enum.hasMoreElements())
{ 商品 te=(商品)enum.nextElement();
顯示區(qū).append("商品代號(hào):"+te.代號(hào)+" ");
顯示區(qū).append("商品名稱:"+te.名稱+" ");
顯示區(qū).append("商品庫存:"+te.庫存+" ");
顯示區(qū).append("商品單價(jià):"+te.單價(jià)+" ");
顯示區(qū).append("\n ");
}
}
}
}
public class LinkListFour
{public static void main(String args[])
{ ShowWin win=new ShowWin();
win.setSize(400,350);
win.setVisible(true);
win.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{ System.exit(0);}});
}
}