一個定時往mysql寫資料的java類的設計與實現
阿新 • • 發佈:2019-02-08
我自己都感覺這個標題好像論文。(××××××××的設計與實現)
因為最近在嘗試寫《商人》網路遊戲的服務端,要有時間定時迴圈執行,要有往資料庫寫數值。然後玩家的手機上微信,從資料庫下載資料,實現遊戲玩起來。
所以這篇文章講了我昨天的進展,定時存資料。
我有兩個檔案,實際上我也是為了將來維護方便,才分開來寫的。
mainGame.java 這個檔案是主功能,
gameEnterFrame.java 這個檔案是定時迴圈功能。
他們都隸屬於game包中。
先看第一個mainGame.java的程式碼:
package game;
import game.gameEnterFrame;//把定時迴圈類匯入進來,一會要用。
public class mainGame {
//遊戲執行,最主要的許可權最高的main方案,無返回值。只要執行,就會先執行main。
//static意思是 我是絕對的,唯一的,至高無上的,不允許重名的。只要提到這個main名字就一定是我,的意思。
//public 意思是對外公開,只要你在別的地方匯入了mainGame類,就可以執行mainGame類下的public的功能。
public static void main(String[]args){
//我想要一個定時迴圈類,起名叫aa吧,它是一個全新的定時迴圈類。
gameEnterFrame aa = new gameEnterFrame();
//現在執行aa的start功能。裡面有啥看下一檔案的程式碼。
aa.start();
System.out.println("GameStart");
}
}
程式碼不多,就是啟動後,執行一次,gameEnterFrame.
再貼出下面的程式碼:
package game;
//這些匯入的包你可以不用知道他們是幹嘛的,因為只要使用MyExclipse軟體敲程式碼,就會提示你,幫你自動新增匯入,而且自動加的非常準確。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Timer;//匯入定時器類
import java.util.TimerTask;//匯入定時任務類
//由於gameEnterFrame是繼承自TimerTask類的。
//TimerTask類有這麼一個關鍵的功能叫做run,是前人們已經寫好的功能了。也是必須有的功能。只要繼承了TimerTask的類一自動執行,就自動執行run裡面的動作。
public class gameEnterFrame extends TimerTask {
//宣告內部使用一個數據庫連結,起名conn,這個conn酌情改程式碼
private Connection conn;
//宣告內部使用一個數據庫驅動地址,不知何用,固定用法,不寫就報錯。這個地方酌情改程式碼
private String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//宣告內部使用mysql資料庫的網路IP+埠+連結的資料庫名字,這個地方酌情改程式碼
private String DB_URL = "jdbc:mysql://192.168.0.11:3306/gmbusiness";
//宣告內部使用連線資料庫的使用者名稱,這個地方酌情改程式碼
private String user = "root";
//宣告內部使用連線資料庫的密碼,這個地方酌情改程式碼
private String password = "root";
//我需要一個時間量,起名叫startdate吧,它是一個全新的時間量,他的值是現在這一刻的時間。
Date startdate = new Date();
//我需要一個定時器,起名叫itimer吧,它是一個全新的定時器。
private Timer itimer = new Timer();
public void start(){
//schedule英文翻譯為“日程安排”,是定時器類下屬的功能方案。在我們程式中是最關鍵的功能,後面有好幾種引數情況,其中三個引數時候代表(做啥方案,啥時間開始,多少毫秒後再做),
//要注意的是java裡面的時間是單獨的資料型別,區別於浮點數、整數、字串型別。
//所以需要宣告一下開始時間。我覺得使用“現在”作為開始時間最合適。這樣每次程式執行時就立即開始。
//所以我在上面聲明瞭一個startdate。接著讓任務每隔2秒鐘執行一次。
itimer.schedule(this, startdate, 2000);
//你可能要問了,this是啥?this意思是當下方案。這裡指gameEnterFrame。
}
//下面來看看這個自動執行都運行了啥動作
public void run() {
float n = (float) 1.22;//我瞎寫的一個1.22數,後面會被修改為隨機數。這裡不必較真。
n = (float) Math.random();//我需要生成隨機數,一會往資料庫裡面寫。
System.out.println("Server make a new number : " +n );//把這個數打印出來方便我看。
//我發現連結資料庫大家都愛用try。因為網路不穩定就會連不上,但不能崩了程式。
try {
//固定用法,連線資料庫。為的是後面往資料裡寫數
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL,user,password);
//準備往資料庫裡寫啥值,引號中是mysql語句。
//java並不是直接往mysql裡面寫資料,而且先打個招呼,傳達一下即將要填寫的數在哪行哪列,具體的數則是留出問號,再讓程式做填空題。
String sql = "insert into goods_price (price) values (?)";
//宣告一個預處理語句叫rs,是個空的。
PreparedStatement rs = null;
//先把格式填寫進去,等著填空。
rs = conn.prepareStatement(sql);
//而且據說每次只能寫一個值,寫入一個float型別的數值,在第一個位上把n的值(剛生的隨機數)寫進去。
rs.setFloat(1,n);
//寫完了更新吧
rs.executeUpdate();
//關閉資料庫操作通道
rs.close();
//關閉資料庫連線,固定用法
conn.close();
//以下到程式碼最後是MyEclipse自動幫我寫的。
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
定時迴圈執行的部分程式碼較多,寫好後點擊執行,就可以看到打印出來的資料啦。
祝你成功!