Java連線資料庫DBHelper增刪改查[多條資料]
阿新 • • 發佈:2019-01-27
補充!忘記寫思路了。。。
思路
1. 使用Class.forName()載入驅動
2. 驅動管理指定資料庫並連線 Connection conn = DriverManager.getConnection()
3. 連線後,使用連接獲取預處理(處理sql語句) PreparedStatement pst = conn.preparedStatement(“sql語句”)
4. 使用預處理執行相應操作得到一個結果集 ResultSet rs = pst.executeQuery();
5. 獲取元資料即資料庫中一部分資料 ResultSetMetaData rsd = rs.getMetaData();
6. rsd中則包含資料庫資訊一定要要判斷rsd.next() 是否有值,才能進一步操作
7. 根據資料庫欄位名獲取資料庫中相應的值 rs.getObject(“欄位名”); 8.最後關閉連線,預處理,結果集
上午一大早被吵醒…乾脆起來寫程式碼,於是就有了這個DBHelper工具類,算是複習複習。
在實際開發過程中沒有資料庫基本是不能活呀!改工具類寫了較詳細的註釋。
都是根據自己的理解寫的,如果不對之處歡迎提出!不勝感激。
檔案包括:
- jar包 oracle和mysql
- 一下描述到的類和配置檔案
檔案結構圖
此類支援以下功能
- 增加
- 刪除
- 修改
- 查詢結果只有單條資料
- 查詢結果有多條資料
- 多條語句查詢
MyDbHelper類
package com.wy.mydb;
import java.io.IOException;
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 com.wy.properties.MyProperties;
public class MyDbHelper {
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
//載入驅動
static {
try {
//方式一 固定寫死 不方便更改資料庫操作
// Class.forName("com.mysql.jdbc.Driver"); //Oracle驅動為: oracle.jdbc.driver.OracleDriver
//方式二 讀取配置檔案操作 如果需要更換資料庫只需要修改配置檔案即可 推薦
try {
Class.forName(MyProperties.getInstance().getProperty("driverName"));
} catch (IOException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//驅動管理連線指定資料庫 獲取連線物件
public Connection getConnection() {
try {
//方式一 固定寫死 不方便更改資料庫操作
//驅動管理指定資料庫並連線 引數說明 埠資訊 資料庫賬戶 密碼
// conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "a");
//方式二 讀取配置檔案操作 如果需要更換資料庫只需要修改配置檔案即可 推薦
try {
conn = DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance());
} catch (IOException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//關閉所有物件 連線 預處理 結果集
public void closeAll(Connection conn,PreparedStatement ps,ResultSet rs) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**單條語句的增刪改 說明:在執行成功後函式返回的結果為非零整數
* @param sql 需要執行的sql語句
* @param params 執行sql語句的引數
* @return
*/
public int doUpdate(String sql,List<Object> params) {
int result = 0;
//獲取連線
conn = getConnection();
//預處理
try {
ps = conn.prepareStatement(sql);
//設定引數得到結果集
this.setParams(ps,params);
//預處理執行得到結果反饋
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//關閉所有物件
this.closeAll(conn, ps, rs);
}
return result;
}
/**
* 多條語句的增刪改 說明:這些語句要麼同時成功,要麼都失敗
* @param sqls 多條sql語句
* @param params 執行引數
* @return
*/
public int doUpdate(List<String> sqls,List<Object> params) {
int result = 0;
//獲取連線
conn = getConnection();
try {
//多條語句的執行涉及到事務 設定事務提交方式為手動
conn.setAutoCommit(false);
//判斷sql語句集合
if(sqls!=null&&sqls.size()>0) {
//迴圈每一條語句執行
for(int i=0;i<sqls.size();i++) {
ps = conn.prepareStatement( sqls.get(i) );
//設定引數
ps.setObject(i+1, params.get(i));
//執行並反饋
result = ps.executeUpdate();
}
}
//手動提交資料
conn.commit();
} catch (SQLException e) {
//出現錯誤則回滾資料
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
//回覆事務自動提交
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
//關閉所有物件
this.closeAll(conn, ps, rs);
}
return result;
}
/**
* 設定預處理的引數
* @param ps 預處理
* @param params 引數集合
* @throws SQLException
*/
public void setParams(PreparedStatement ps,List<Object> params) throws SQLException {
if(params!=null&¶ms.size()>0) {
for(int i=0;i<params.size();i++) {
ps.setObject(i+1, params.get(i));
}
}
}
/**
* 查詢sql語句單條結果
* @param sql 查詢的sql語句
* @param params執行sql所需引數
* @return
*/
public Map<String,Object> findSingleObject(String sql,List<Object> params){
Map<String,Object> map = new HashMap<String,Object>();
//獲取連線
conn = getConnection();
//預處理
try {
ps = conn.prepareStatement(sql);
//設定引數
this.setParams(ps, params);
//執行查詢得到結果集
rs = ps.executeQuery();
//獲取資料庫該表所有欄位名
List<String> names = getAllColumnName(rs);
if(rs.next()) {
//迴圈names
for(String name:names) {
map.put(name, rs.getObject(name) );
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//關閉物件
this.closeAll(conn, ps, rs);
}
return map;
}
/**
* 查詢sql語句多條結果
* @param sql
* @param params
* @return
*/
public List<Map<String,Object>> findMulitObject(String sql,List<Object> params){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//連線
conn = this.getConnection();
//預處理
try {
ps = conn.prepareStatement(sql);
//設定引數
this.setParams(ps, params);
//執行查詢得到結果集
rs = ps.executeQuery();
//獲取所有列名
List<String> names = this.getAllColumnName(rs);
while(rs.next()) { //注意這裡不能用if 因為使用if的話只能執行一次 最後得到的結果就成了查一條資料
Map<String, Object> map = new HashMap<String,Object>();
//迴圈迭代
for(String name:names) {
map.put(name, rs.getObject(name));
}
list.add( map );
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 根據結果集獲取資料庫中的所有列表名
* @param rs
* @return
*/
private List<String> getAllColumnName(ResultSet rs) {
List<String> names = new ArrayList<String>();
try {
ResultSetMetaData rsmd = rs.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++) {
names.add( rsmd.getColumnName(i+1) );
}
} catch (SQLException e) {
e.printStackTrace();
}
return names;
}
}
MyProperties類 說明:用於讀取配置檔案db.properties
package com.wy.properties;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 整個類只需要建立一個物件
* 設計成單例模式
*/
public class MyProperties extends Properties{
private static MyProperties myProperties;
private MyProperties() throws IOException{
InputStream in = MyProperties.class.getClassLoader().getResourceAsStream("db.properties");
try {
this.load(in);
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
public static MyProperties getInstance() throws IOException{
if(null==myProperties){
myProperties = new MyProperties();
}
return myProperties;
}
}
db.properties 說明:輸入自己的資料庫連結密碼 注意 所有輸入後面不能有空格! 那句英文我感覺有錯誤…寫英文的原因是,中文會被處理
#oracle
#driverName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#password= please input your database password
#mysql #please input your database password
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password= please input your database password
資料庫檔案
create table student(
sid int primary key auto_increment,
sname varchar(10)
)
insert into student(sname) values('馬小跳')
insert into student(sname) values('淘氣包')
select * from student where sid = 2
delete from student where sid = 3