前言
學java的同學一定不會不知道JDBC這個東西,它最大的缺點就是需要手動輸入大量的代碼,在不使用任何其他工具進行開發的時候,經常會輸入大量重複的代碼。
爲了解決這個問題,筆者仿照Android的SQLiteDatabase類寫了一個小工具包nonoas_SQL_Utils,對於像我這樣道行尚淺的猿來說,用起來已經是方便很多。
連接到數據庫
連接還是最常規的套路,廢話不多說,上代碼 ↓↓
用戶自定義的數據庫連接類:DBOpener
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import nonoas.sql.DateBaseOpener;
/**
* 連接數據庫的類
* @author Nonoas
*
*/
public class DBOpener implements DateBaseOpener{
private static String url="jdbc:mysql://localhost:3306/學生成績管理系統?serverTimezone=UTC";
private static String username="root";//數據庫用戶名
private static String password="Hss1356955215";//數據庫密碼
private Connection connection;
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public DBOpener() {
try {
connection=DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @return 獲取Connection對象,連接到學生成績管理系統數據庫
*/
@Override
public Connection getConnection() {
return this.connection;
}
}
將數據庫連接的配置封裝成一個類,並定義一個可以返回一個Connection對象的方法。nonoas_SQL_Utils將這樣的類抽象爲一個接口DateBaseOpener,
代碼如下↓↓
package nonoas.sql;
/**
* 用於打開一個數據庫
* @author Nonoas
*/
import java.sql.Connection;
public interface DateBaseOpener {
/**
* 獲取數據庫的Connection對象
* @return 連接到數據庫的Connection對象
*/
public Connection getConnection();
}
該接口的實現類由用戶自定義,實現其中的方法:分別用於創建一個Connection對象和獲取創建的Connection對象。
該接口的實現類用於創建SQLOperations對象,以進行數據庫操作,下面將貼出SQLOperations類的部分代碼。
對數據庫的操作
SQLOperations中的成員變量及方法
private Connection connection;// 數據庫連接對象
這個不用解釋了吧
構造方法
/**
* 構造器,賦值給connection
* @param opener DateBaseOpener派生類對象
*/
public SQLOperations(DateBaseOpener opener) {
this.connection = opener.getConnection();
}
創建對象示例
//DBOpener爲用戶自定義的類,實現了接口DateBaseOpener
SQLOperations sqlOperations=new SQLOperations(new DBOpener());
查詢操作
/**
* 查詢表中數據
* @param table 指定表名
* @param columns 指定查詢的列,爲空則返回所有列
* @param selection 指定where子句,可以使用佔位符“?”
* @param selectionArgs 佔位符的值,不包含佔位符則爲null
* @param groupBy 分組方式,可以爲null
* @param orderBy 排序方式,可以爲null
* @return ResultSet 返回結果集
*/
public ResultSet query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy,String orderBy) {}
//上面那條方法的重構,略去了order語句和group語句
public ResultSet query(String table, String[] columns, String selection, String[] selectionArgs) {}
例子:
//查詢表grade中,學號爲0001的學生選的課程
ResultSet rs=sqlOperations.query("grade", new String[]{"course"}, "where id=?", new String[]{"0001"});
刪除操作
/**
* 刪除表中數據
* @param table 表名
* @param whereClause where子句,可以使用佔位符“?”
* @param whereArgs 佔位符的值,不包含佔位符則爲null
* @return 刪除的條目的數目
*/
public long delete(String table, String whereClause, String[] whereArgs) {}
例子
//刪除表grade中,學號爲0001的學生信息
sqlOperations.delete("grade","where id=?",new String[]{"0001"});
修改操作
/**
* 更新表中數據
* @param table 表名
* @param values 具體的字段值,鍵值對集合
* @param whereClause 指定where子句,可以使用佔位符“?”
* @param whereArgs 佔位符的值,不包含佔位符則爲null
* @return 更新的條目的數目
*/
public long update(String table, ContentValues values, String whereClause, String[] whereArgs) {}
插入操作
/**
* 向表中插入數據
* @param table 表名
* @param nullColimnHack 指定當values爲空時,將那個字段設置爲空
* @param values 具體的字段值,鍵值對集合
* @return 插入的條目數量
*/
public long insert(String table, String nullColimnHack, ContentValues values) {}
兩者用法相似這裏就只舉一個例子了,主要解釋values這個參數↓↓
例子
//向表grade中插入一條內容,學號爲“0008”,科目爲“線性代數”,分數爲95
ContentValues cValues=new ContentValues();
cValues.put("id","0008");
cValues.put("course", "線性代數");
cValues.put("score", 95);
sqlOperations.insert("grade", null, cValues);
後面這兩個操作引入了ContentValuses這個類,其對象本質爲一個HashMap,可以參考Android的android.content.ContentValues類源碼及其使用方法,文末也將貼出nonoas_SQL_Utils.ContentValuses 的代碼。
執行簡單的SQL語句,這裏也提供了通用的SQL語句執行方法
通用的SQL語句執行方法
/**
* 執行帶有佔位符查詢語句
* @param sql 帶有佔位符的查詢語句
* @param strs 通配符的值
* @return boolean表示是否執行成功
*/
public boolean execSQL(String sql,String[] strs) {}
/**
* 執行通用SQL語句
* @param sql 完整得SQL語句
* @return boolean表示是否執行成功
*/
public boolean execSQL(String sql) {}
例子
//這兩條語句效果一樣
//查詢學號爲0001的學生的線性代數成績
sqlOperations.execSQL("select * fome grade where id=0001 and course='線性代數' ");
sqlOperations.execSQL("select * fome grade where id=? and course=?",new String[] {"0001","線性代數"});
最後別忘了這個
關閉連接
public void close() {
try {
if(connection!=null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
例子
sqlOperations.close();
附錄
nonoas_SQL_Utils.ContentValuses雖然是仿照android.content.ContentValues,但功能還遠不及其強大,畢竟,我只是個菜雞(哈哈),這裏直接貼出其源碼↓↓
package nonoas_SQL_Utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 該類本質上爲一個HashMap,但是限制其鍵只能爲String類型,值只能爲基本數據類型
* 參照原型爲 android.content.ContentValues
* @author Nonoas
*/
public final class ContentValues {
private HashMap<String, Object> mValues;
/**
* 無參構造器,默認長度爲8
*/
public ContentValues() {
mValues=new HashMap<String, Object>(8);
}
/**
* 指定長度的構造器
* @param size mValues長度
*/
public ContentValues(int size) {
mValues=new HashMap<String, Object>(size);
}
/**
* 存入鍵值對
* @param key String類型
* @param values Integer類型
*/
public void put(String key,Integer values) {
mValues.put(key,values);
}
/**
* 存入鍵值對
* @param key String類型
* @param values Boolean類型
*/
public void put(String key,Boolean values) {
mValues.put(key,values);
}
/**
* 存入鍵值對
* @param key String類型
* @param values Float類型
*/
public void put(String key,Float values) {
mValues.put(key,values);
}
/**
* 存入鍵值對
* @param key String類型
* @param values Double類型
*/
public void put(String key,Double values) {
mValues.put(key,values);
}
/**
* 存入鍵值對
* @param key String類型
* @param values String類型
*/
public void put(String key,String values) {
mValues.put(key,values);
}
/**
* 存入鍵值對
* @param key String類型
* @param values Short類型
*/
public void put(String key,Short values) {
mValues.put(key,values);
}
/**
* 獲取鍵對應的值
* @param key 鍵
* @return 值
*/
public Object get(String key) {
return mValues.get(key);
}
/**
* 返回長度
* @return mValues的長度
*/
public long size() {
return mValues.size();
}
/**
* 獲取所有的鍵名
* @return 鍵名集合
*/
public List<String> getkeys() {
List<String> list=new ArrayList<String>();
for(String key:mValues.keySet()) {
list.add(key);
}
return list;
}
/**
* 獲取所有的值
* @return 值得集合
*/
public List<Object> getValues(){
List<Object> list=new ArrayList<Object>();
for(Object key:mValues.values()) {
list.add(key);
}
return list;
}
}
工具包獲取方法
筆者已將其封裝成jar包,並生成了CHM格式的幫助文檔,一同打包了。jar導入到工程就能使用,這裏給出兩者獲取方式:
方法一:下載鏈接(0積分):
https://download.csdn.net/download/weixin_44155115/12063005
方法二:關注下方公衆號(回覆"JDBC工具包"直接獲取):