標籤:mysql java 資料庫 亂碼 system
這部分也是所謂JDBC、網站資料來源的內容,把名字弄得很高深似得,實際上只是Java中對Mysql資料庫的增刪改查的內容。非常簡單,之前寫了這麼多Mysql的內容,沒好好總結一下,實在是不應該。今天就實現一個Java中對Mysql資料庫的增刪改查,隨便帶點Java取出當前系統的系統名與系統時間的知識,完成一個還算有點意思的小例子。
一、基本目標
首先,在Mysql資料庫中有一張名為testtable的空表,id為自增列,username,class都是文本列,但是class裡面都存放數字,也就是整形,我們以後在Java中取出這一列要當作整形處理。
每次執行程式,程式都會向裡面的username插入當前的系統名(不會變的)與當前系統的時分秒(會變的),毫秒、年月日就不插入了,因為超出整形的範圍,這也不是什麼問題,但是為了避免程式過於複雜,就不引入《【Java】自從有了BigInteger,我再也不用擔心要處理的資料有多大了》(點擊開啟連結)的內容了。
二、製作過程
1、首先,Java要串連Mysql資料庫,不像asp連結Access,c#連結SQL Server那樣,都是內建好的。畢竟那是人家微軟的配備,雖然我們還是經常使用windows來編程、開發,但是我們還要從網上下載一個mysql-connector-java-5.1.32.jar的東西,這個東西在Mysql的官網已經無從可考了,裡面沒有跨平台的版本,就一個Windows版本的msi安裝檔案,各位還是網上搜一下mysql-connector-java吧,版本號碼不重要,就沒見過代碼寫正確還串連失敗的。
2、然後,在你的工程目錄下面建立一個lib檔案夾,把這個mysql-connector-java-5.1.32.jar放進去,不叫這個名字也可以,但是據說業內基本都這樣弄,某些公司不這樣甚至還會弄給上面那個已經越來越不會寫代碼的經理罵的
3、之後,右擊你的工程選擇“屬性”
4、在Java Build Path的標籤頁,選擇Add JARs...,在lib檔案夾中找到剛才放進來的mysql-connector-java-5.1.32.jar,之後點擊確定就可以開始愉快地寫代碼了
5、首先你要在開頭引入下面的東西:
import java.sql.*;import java.text.*;import java.util.*;import java.util.Date;
為了能夠擷取當前的時間,同時下面也使用到ArrayList動態數組,這東西是什麼,請翻我之前的《【Java】Java中的Collections類——Java中升級版的資料結構》(點擊開啟連結),必須在檔案頭引入import java.util.*;,由於sql類裡面同樣有Date()這個類,因此必須多加一句import java.util.Date;消除歧義,import java.text.*;同樣是為了之後對系統當前的時間處理的時候使用了,不然只能擷取從1970年元旦到現在的毫秒數
6、之後寫一個資料庫連結類Dbcon
class Dbcon {// 此處串連資料庫,獨立開一個類,以後操作資料庫的每次串連就不用寫這麼多public Connection getCon() {Connection con = null;try {Class.forName("com.mysql.jdbc.Driver");// 其中test是我們要連結的資料庫,user是資料庫使用者名稱,password是資料庫密碼。// 3306是mysql的連接埠號碼,一般是這個// 後面那串長長的參數是為了防止亂碼,免去每次都需要在任何語句都加入一條SET NAMES UTF8String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";String user = "root";String password = "root";con = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return con;}}
7、之後就是整個程式的核心如何操作資料庫:
public class JavaDbTest {public static void main(String[] args) {//這裡是資料庫的連結Connection con = new Dbcon().getCon();String sql = null;// 這樣能夠擷取當前作業系統的名字//資料庫插入操作的開始,修改與查詢的道理一樣,就不做了,請修改下面sql字串中的sql語句String username = System.getProperty("os.name");// 這樣能夠擷取當前的時間,但必須在檔案頭引入import java.util.*;// 由於sql類裡面同樣有Date()這個類,因此必須多加一句import java.util.Date;消除歧義String classString = new SimpleDateFormat("hhmmss").format(new Date(System.currentTimeMillis())).toString();sql = "INSERT INTO testtable(username,class) VALUES ('" + username+ "','" + classString + "') ";// 注意:操作資料庫的語句Insert into,update與查詢資料庫的語句select在Java的語句是不同的// 操作資料庫為con.createStatement().execute(sql);// 查詢資料庫為rs=con.prepareStatement(sql).executeQuery();且查詢結果必須被ResultSet對象rs接住try {con.createStatement().execute(sql);// 弄完之後人走帶門con.close();} catch (Exception e) {e.printStackTrace();}sql = "select * from testtable";ResultSet rs = null;// 這幾個存放查詢結果的ArrayList一定要放在try-catch的外圍,注意變數有效範圍ArrayList<Integer> idArraylist = new ArrayList<Integer>();ArrayList<String> usernameArraylist = new ArrayList<String>();ArrayList<Integer> classArraylist = new ArrayList<Integer>();try {rs = con.prepareStatement(sql).executeQuery();// 這個迴圈的結果是把整個查詢結構讀出來while (rs.next()) {// 取出各個列列印出來idArraylist.add(rs.getInt("id"));usernameArraylist.add(rs.getString("username"));// 縱使class一列全是數字,但是由於這一列用的是varchar來儲存// 如果要把class當作整形處理,因此不可用rs.getInt,只能先以String取出來再擦寫為整形rs.getString("class");classArraylist.add(Integer.parseInt(rs.getString("class")));}// 弄完之後人走帶門con.close();} catch (Exception e) {e.printStackTrace();}System.out.println("id username class");for (int i = 0; i < idArraylist.size(); i++)System.out.println(idArraylist.get(i) + " "+ usernameArraylist.get(i) + " " + classArraylist.get(i));}}
8、至此,整個程式連起來就是這樣的:
package test;import java.sql.*;import java.text.*;import java.util.*;import java.util.Date;class Dbcon {// 此處串連資料庫,獨立開一個類,以後操作資料庫的每次串連就不用寫這麼多public Connection getCon() {Connection con = null;try {Class.forName("com.mysql.jdbc.Driver");// 其中test是我們要連結的資料庫,user是資料庫使用者名稱,password是資料庫密碼。// 3306是mysql的連接埠號碼,一般是這個// 後面那串長長的參數是為了防止亂碼,免去每次都需要在任何語句都加入一條SET NAMES UTF8String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";String user = "root";String password = "root";con = DriverManager.getConnection(url, user, password);} catch (Exception e) {e.printStackTrace();}return con;}}public class JavaDbTest {public static void main(String[] args) {//這裡是資料庫的連結Connection con = new Dbcon().getCon();String sql = null;// 這樣能夠擷取當前作業系統的名字//資料庫插入操作的開始,修改與查詢的道理一樣,就不做了,請修改下面sql字串中的sql語句String username = System.getProperty("os.name");// 這樣能夠擷取當前的時間,但必須在檔案頭引入import java.util.*;// 由於sql類裡面同樣有Date()這個類,因此必須多加一句import java.util.Date;消除歧義String classString = new SimpleDateFormat("hhmmss").format(new Date(System.currentTimeMillis())).toString();sql = "INSERT INTO testtable(username,class) VALUES ('" + username+ "','" + classString + "') ";// 注意:操作資料庫的語句Insert into,update與查詢資料庫的語句select在Java的語句是不同的// 操作資料庫為con.createStatement().execute(sql);// 查詢資料庫為rs=con.prepareStatement(sql).executeQuery();且查詢結果必須被ResultSet對象rs接住try {con.createStatement().execute(sql);// 弄完之後人走帶門con.close();} catch (Exception e) {e.printStackTrace();}sql = "select * from testtable";ResultSet rs = null;// 這幾個存放查詢結果的ArrayList一定要放在try-catch的外圍,注意變數有效範圍ArrayList<Integer> idArraylist = new ArrayList<Integer>();ArrayList<String> usernameArraylist = new ArrayList<String>();ArrayList<Integer> classArraylist = new ArrayList<Integer>();try {rs = con.prepareStatement(sql).executeQuery();// 這個迴圈的結果是把整個查詢結構讀出來while (rs.next()) {// 取出各個列列印出來idArraylist.add(rs.getInt("id"));usernameArraylist.add(rs.getString("username"));// 縱使class一列全是數字,但是由於這一列用的是varchar來儲存// 如果要把class當作整形處理,因此不可用rs.getInt,只能先以String取出來再擦寫為整形rs.getString("class");classArraylist.add(Integer.parseInt(rs.getString("class")));}// 弄完之後人走帶門con.close();} catch (Exception e) {e.printStackTrace();}System.out.println("id username class");for (int i = 0; i < idArraylist.size(); i++)System.out.println(idArraylist.get(i) + " "+ usernameArraylist.get(i) + " " + classArraylist.get(i));}}
【Mysql】Java中對Mysql資料庫的增刪改查、Java的System類