標籤:
Java進階(二十五)Java串連mysql資料庫(底層實現)前言
很長時間沒有系統的使用java做項目了。現在需要使用java完成一個實驗,其中涉及到java串連資料庫。讓自己來寫,記憶中已無從搜尋。特將之前使用的方法做一簡單的總結。也能夠在底層理解一下串連資料庫的具體步驟。
實現
首先需要匯入相關的jar包,我使用的為:mysql-connector-java-5.1.7-bin.jar。
下面來看一下我所使用的資料庫連接方法類:
MysqlUtil.java
package cn.edu.ujn.util; import java.lang.reflect.Field;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; import cn.edu.ujn.base.Const;import cn.edu.ujn.dao.UserDao;import cn.edu.ujn.model.User; public class MysqlUtil {// 定義資料庫的使用者名稱private final static String USERNAME = Const.USERNAME;// 定義資料庫的密碼private final static String PASSWORD = Const.PASSWORD;// 定義資料庫的驅動資訊private final String DRIVER = Const.DRIVER;// 定義訪問資料庫的地址private final static String URL = Const.URL;// 定義資料庫的連結private static Connection connection;// 定義sql語句的執行對象private static PreparedStatement pstmt;// 只有在獲得了Statement之後才可執行SQL語句// 定義查詢返回的結果集合private static ResultSet resultset; public MysqlUtil() { try {Class.forName(DRIVER);// 顯式地載入 JDBC 驅動程式System.out.println("註冊驅動成功!");} catch (Exception e) {System.out.println("註冊驅動失敗!");}} /** * 定義獲得資料庫的連結,試圖建立到給定資料庫 URL 的串連 * * @return connection */public static Connection GetConnection() { try {connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);System.out.println("資料庫連接成功!");} catch (Exception e) {System.out.println("資料庫連接失敗!");}return connection;} /** * 完成對資料庫表的增加、刪除、更新操作 * * @param sql * @param params * @return flag * @throws SQLException */public static boolean updateByPreparedStatement(String sql, List<Object> params)// 第二個參數為傳輸的預留位置throws SQLException { //載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();boolean flag = false; // 表示當使用者執行添加、刪除、修改時所影響資料庫的行數int result = -1;try {pstmt = connection.prepareStatement(sql);} catch (Exception e) {System.out.println("Error in updateByPreparedStatement!");} // 表示預留位置的第一個位置int index = 1; // 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) {// System.out.println(i+" "+params.get(i));// 使用給定對象設定指定參數的值。第二個參數必須是Object類型pstmt.setObject(index++, params.get(i));}}result = pstmt.executeUpdate();// 用於執行DML語句-返回一個整數,代表被SQL語句影響的記錄條數flag = result > 0 ? true : false;System.out.println("執行SQL語句影響的記錄條數為:" + result);//關閉資料庫MysqlUtil.releaseConn();return flag;}/** * 查詢返回單條記錄 * * @param sql * @param params * @return map * @throws SQLException */public static Map<String, Object> findSimpleResult(String sql, List<Object> params)throws SQLException { //載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();// 菱形文法在Java7及以後可用Map<String, Object> map = new HashMap<String, Object>(); // 表示預留位置的第一個位置int index = 1; // 此句很重要,需要進行先行編譯pstmt = connection.prepareStatement(sql); // 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) { // 第一個是指你SQL語句中的第幾個參數,第二個是要設定的值pstmt.setObject(index++, params.get(i));}} // 返回查詢結果resultset = pstmt.executeQuery(); // 擷取此 ResultSet 對象的列的編號、類型和屬性。java.sql.ResultSetMetaData metdata = resultset.getMetaData(); // 擷取列數int col_lenth = metdata.getColumnCount();boolean flag = resultset.next();if (!flag) {System.out.println("Found nothing!");}while (resultset.next()) {for (int i = 0; i < col_lenth; i++) { // 擷取指定列的名稱String cols_name = metdata.getColumnName(i + 1); // 通過列名獲得指定列的屬性值Object cols_value = resultset.getObject(cols_name);if (cols_value == null) { // 由此可見,資料表中欄位值不可為空cols_value = "";} // 將指定的值與此映射中的指定鍵關聯(可選操作)。map.put(cols_name, cols_value);}}//關閉資料庫MysqlUtil.releaseConn();return map;} /** * 通過反射機制訪問資料庫,查詢前幾頁的內容 * * @param sql * @param params * @param cls * @return * @throws Exception */public static <T> List<T> queryEvamall(String sql, List<Object> params,Class<T> cls) throws Exception { //載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();// 構造一個初始容量為 10 的空列表。List<T> list = new ArrayList<T>(); // 表示預留位置的第一個位置int index = 1; pstmt = connection.prepareStatement(sql); // 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) { // 使用給定對象設定指定參數的值。第二個參數必須是Object類型pstmt.setObject(index++, params.get(i)); }} // 返回查詢結果resultset = pstmt.executeQuery(); // 擷取列的相關資訊java.sql.ResultSetMetaData metdata = resultset.getMetaData(); // 擷取列數int col_lenth = metdata.getColumnCount();while (resultset.next()) { // 通過反射機制建立一個執行個體T resultObject = cls.newInstance();for (int i = 0; i < col_lenth; i++) {String cols_name = metdata.getColumnName(i + 1);Object cols_value = resultset.getObject(cols_name);if (cols_value == null) {cols_value = "";} // 通過列名獲得反射Field field = cls.getDeclaredField(cols_name); // 開啟javabean的私人存取權限field.setAccessible(true);field.set(resultObject, cols_value);}list.add(resultObject);}//關閉資料庫MysqlUtil.releaseConn();return list;}/** * 查詢返回多條查詢記錄 * * @param sql * @param params * @return * @throws SQLException */public static List<Map<String, Object>> findMoreResult(String sql,List<Object> params) throws SQLException {//載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();System.out.println("JJ");List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();// 表示預留位置的第一個位置int index = 1;pstmt = connection.prepareStatement(sql);// 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) {pstmt.setObject(index++, params.get(i));// 使用給定對象設定指定參數的值。第二個參數必須是// Object類型}}try {resultset = pstmt.executeQuery();// 返回查詢結果} catch (Exception e) {System.out.println("Error1!");// 調試用}ResultSetMetaData metdata = resultset.getMetaData();// 擷取列的相關資訊int col_lenth = metdata.getColumnCount();// 擷取列數System.out.println("資料表列數為:" + col_lenth);// 調試用while (resultset.next()) {Map<String, Object> map = new HashMap<String, Object>();for (int i = 0; i < col_lenth; i++) {String cols_name = metdata.getColumnName(i + 1);// 擷取列的名稱,列從1開始Object cols_value = resultset.getObject(cols_name);if (cols_value == null) {cols_value = "";}map.put(cols_name, cols_value);}list.add(map);}//關閉資料庫MysqlUtil.releaseConn();return list;} /** * jdbc的封裝可以使用反射機制來封裝 使用泛型方法 * * @param sql * @param params * @param cls * @return * @throws Exception */public static <T> T findSimpleRefResult(String sql, List<Object> params,Class<T> cls) throws Exception {//載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();T resultObject = null; // 表示預留位置的第一個位置int index = 1;pstmt = connection.prepareStatement(sql); // 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) { // 第一個是指你SQL語句中的第幾個參數,第二個是要設定的值pstmt.setObject(index++, params.get(i));}} // 返回查詢結果resultset = pstmt.executeQuery(); // 擷取列的相關資訊java.sql.ResultSetMetaData metdata = resultset.getMetaData(); // 擷取列數int col_lenth = metdata.getColumnCount();while (resultset.next()) { // 通過反射機制建立一個執行個體resultObject = cls.newInstance(); for (int i = 0; i < col_lenth; i++) {String cols_name = metdata.getColumnName(i + 1);Object cols_value = resultset.getObject(cols_name);if (cols_value == null) {cols_value = "";}Field field = cls.getDeclaredField(cols_name); // 開啟javabean的私人存取權限field.setAccessible(true);field.set(resultObject, cols_value);} }//關閉資料庫MysqlUtil.releaseConn();return resultObject;} /** * 通過反射機制訪問資料庫 * * @param sql * @param params * @param cls * @return * @throws Exception */public static <T> List<T> findMoreRefResult(String sql, List<Object> params, Class<T> cls) throws Exception { //載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();// 構造一個初始容量為 10 的空列表。List<T> list = new ArrayList<T>(); // 表示預留位置的第一個位置int index = 1; pstmt = connection.prepareStatement(sql); System.out.println("MysqlUtil:" + params);// 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) { // 使用給定對象設定指定參數的值。第二個參數必須是Object類型pstmt.setObject(index++, params.get(i)); }} // 返回查詢結果System.out.println("SHQ");resultset = pstmt.executeQuery();// 擷取列的相關資訊java.sql.ResultSetMetaData metdata = resultset.getMetaData(); // 擷取列數int col_lenth = metdata.getColumnCount();while (resultset.next()) { // 通過反射機制建立一個執行個體T resultObject = cls.newInstance();for (int i = 0; i < col_lenth; i++) {String cols_name = metdata.getColumnName(i + 1);Object cols_value = resultset.getObject(cols_name);if (cols_value == null) {cols_value = "";} // 通過列名獲得反射Field field = cls.getDeclaredField(cols_name); // 開啟javabean的私人存取權限field.setAccessible(true);field.set(resultObject, cols_value);}list.add(resultObject);}//關閉資料庫MysqlUtil.releaseConn();return list;} /** * 關閉資料庫的連結 * */public static void releaseConn() { if (resultset != null) {try {resultset.close();} catch (SQLException e) {e.printStackTrace();}}if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}} /** * 查詢返回總頁數 * * @param sql * @param params * @return int * @throws SQLException */public static int cluPage(String sql, List<Object> params)throws SQLException { //儲存總頁數 int countPage = 0;//設定每頁顯示的記錄數int size = 10;//載入資料庫驅動new MysqlUtil();//串連資料庫MysqlUtil.GetConnection();// 表示預留位置的第一個位置int index = 1;// 此句很重要,需要進行先行編譯pstmt = connection.prepareStatement(sql);// 判斷所填充的預留位置是否有值;判斷集合的標準方式if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) { // 第一個是指你SQL語句中的第幾個參數,第二個是要設定的值pstmt.setObject(index++, params.get(i));}} // 返回查詢結果resultset = pstmt.executeQuery();if (resultset.next()) {int total = resultset.getInt("total");countPage = (total%size == 0 ? total/size : total/size + 1);}//關閉資料庫MysqlUtil.releaseConn();System.out.println("總頁數為:" + countPage);return countPage;}/** * 測試模組 * * @param args */public static void main(String[] args) {User user = new User();user.setUid("18353102068");user.setLogin_time("1");user.setOut_time("1");user.setLast_time(10);System.out.println(new UserDao().add(user));}}
以上介紹了資料庫的串連方法及常用的查詢操作。
其中的常量如下定義:
Const.java
package cn.edu.ujn.base; public class Const {// 定義資料庫的IPpublic final static String IP = "localhost";// 定義資料庫的連接埠public final static String DBPORT = "3308";// 定義資料庫的名稱public final static String DBNAME = "lab";// 定義資料庫的使用者名稱public final static String USERNAME = "lmapp";// 定義資料庫的密碼public final static String PASSWORD = "lmapp";// 定義資料庫的驅動資訊public final static String DRIVER = "com.mysql.jdbc.Driver";// 定義訪問資料庫的地址public final static String URL = "jdbc:mysql://" + IP + ":" + DBPORT + "/" + DBNAME;}
以上只是實現了java串連到資料庫,要實現資料的插入等操作,還需要以下方法:
UserDao.java
package cn.edu.ujn.dao; import java.sql.SQLException;import java.util.ArrayList;import java.util.List; import cn.edu.ujn.model.User;import cn.edu.ujn.util.MysqlUtil; public class UserDao { MysqlUtil mysqlUtil = new MysqlUtil(); /** * 添加使用者資訊 * * @param user * @return */public int add(User user) {try {String sql = "insert into lab_static_attribute(uid,login_time,out_time,last_time) values(?,?,?,?)";List<Object> params = new ArrayList<Object>();params.add(user.getUid());params.add(user.getLogin_time());params.add(user.getOut_time());params.add(user.getLast_time());return MysqlUtil.updateByPreparedStatement(sql, params) ? 1 : 0;}catch (SQLException e) {return 0;} }}
這裡只是介紹了資料的增加方法,資料庫的CRUD其它三種操作方法,請讀者自行練習。
總結
相比於架構實現資料庫的操作,這裡介紹的方法確實需要完成更多的代碼。但是對於初學者來說,還是建議通過這種方法來完成資料庫的操作。這樣可以更多的瞭解資料庫操作的底層操作行為。學知識講究“知其然,更要知其所以然”。
美文美圖
Java進階(二十五)Java串連mysql資料庫(底層實現)