1. 程式人生 > >一個定時往mysql寫資料的java類的設計與實現

一個定時往mysql寫資料的java類的設計與實現

我自己都感覺這個標題好像論文。(××××××××的設計與實現)

因為最近在嘗試寫《商人》網路遊戲的服務端,要有時間定時迴圈執行,要有往資料庫寫數值。然後玩家的手機上微信,從資料庫下載資料,實現遊戲玩起來。

所以這篇文章講了我昨天的進展,定時存資料。

我有兩個檔案,實際上我也是為了將來維護方便,才分開來寫的。

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(); } } }

定時迴圈執行的部分程式碼較多,寫好後點擊執行,就可以看到打印出來的資料啦。
這裡寫圖片描述

祝你成功!