現在使用 JDBC 寫一個簡單的小程序,主要是使用 JDBC 連接 MySQL 數據庫,然後對數據庫進行一些基本的增刪改查操作。
1、設計數據庫表
先設計一個數據庫表,用於保存用戶信息,建表語句如下:
在用戶表中定義了幾個字段,分別是 id,user_name,age,sex,create_dt,其中 id 是主鍵, 是自增長的,user_name 表示用戶名,age 表示用戶年齡,sex 表示用戶的性別,這裏的性別用數字表示,0 表示女性,1 表示男性,create_dt 表示創建的時間。預先在數據庫中插入幾條數據,數據如下。
CREATE TABLE
tbl_user_info
(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) NOT NULL,
age INT NOT NULL,
sex INT(1) NOT NULL,
create_dt DATE NOT NULL,
PRIMARY KEY (id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、定義實體類
定義一個 Bean,與數據庫表中的各個字段對應:
package com.imooc.jdbc;
import java.sql.Date;
public class UserVO {
//vo:
//dto:數據傳輸對象
//pojo:javaBean
private int id;
private String userName;
private int age;
private int sex;
private Date createDt;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public Date getCreateDt() {
return createDt;
}
public void setCreateDt(Date createDt) {
this.createDt=createDt;
}
public String toString() {
return "UserVO [id=" + id + ", userName=" + userName + ", age=" + age
+ ", sex=" + sex + ", createDt=" + createDt + "]";
}
}
3、定義數據庫連接類
定義一個數據庫連接類,用於獲取 MySQL 的連接
package com.imooc.jdbc;
import java.sql.*;
public class DBUtil {
private static final String URI = "jdbc:mysql://localhost:3306/shen?"
+ "user=root&password=123456&useUnicode=true&characterEncoding=UTF-8";
private static final String DRIVER = "com.mysql.jdbc.Driver";
public static Connection connectDB() throws Exception {
// 1、加載數據庫驅動
Class.forName(DRIVER);
// 2、獲取數據庫連接
Connection conn = DriverManager.getConnection(URI);
return conn;
}
public static void main(String[] args) throws Exception {
System.out.println(connectDB());
}
}
MySQL 的 JDBC URL 編寫方式爲:jdbc:mysql://主機名稱:連接端口/數據庫的名稱?參數= 值,在這個例子中我連接的數據庫主機是一臺遠程主機,所以主機名稱爲遠程主機的 ip 地址,如果數據庫主機爲本機,則可以定義爲 localhost,在參數中指定用戶名爲 root,密碼也是 root,爲了避免中文亂碼要指定 useUnicode 和 characterEncoding。因爲連接的是 MySQL 數據庫,所以程序一開始需要加載 MySQL 的數據庫驅動,然後通過 DriverManager.getConn ection(String URL)方法獲取數據庫的連接。
4、實現數據庫的增刪改查
在獲取了數據庫的連接之後,就可以操作數據庫了,下面分別實現數據庫的增刪改查操作, 定義一個 UserDao 類用於操作數據庫。
1) 查詢
先看查詢操作,查詢可以一次查詢出所有的數據,也可以根據相應的條件查詢。 查詢所有的數據,在 UserDao 中定義一個 queryAll()方法:
//查詢全部
public List<UserVO> queryAll() throws Exception {
Connection conn = DBUtil.connectDB();
String sql = "SELECT * FROM tbl_user_info";
List<UserVO> userList = new ArrayList<UserVO>();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
UserVO user = new UserVO();
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("user_name"));
user.setAge(rs.getInt("age"));
user.setSex(rs.getInt("sex"));
user.setCreateDt(rs.getDate("create_dt"));
userList.add(user);
}
return userList;
}
這裏使用 Connection.createStatement()方法獲取一個 Statement 對象,這個對象裏面有很多的方法可以操作數據庫,使用 excuteQuery(String sql)執行查詢操作,查詢結果爲一個結果集 R
esultSet,可以通過這個結果集獲取相關的信息。 定義 main 函數:
UserVO [id=4, userName=Mary, age=25, sex=0, createDt=2016-06-24] UserVO [id=5, userName=Jack, age=22, sex=1, createDt=2016-06-24] UserVO [id=6, userName=John, age=19, sex=1, createDt=2016-06-24]
根據條件查詢,定義一個 queryByParams 方法:
這個方法可以自由選擇查詢的條件,只需要向方法中傳入一個條件的 List 即可,這些條件都是由 Map 組成的,每一個 Map 包含三個元素,col 表示查詢條件對應哪一列,rel 表示查詢條件的關係是什麼,value 是指查詢條件的值。這樣寫集成了多查詢條件的方法,很多的業務下,查詢的邏輯可能很多,這樣寫只用一個統一的方法就可以解決多種不同查詢條件的 業務邏輯。
再寫一個簡單的 main 函數測試一下:
在這個 main 方法中設定了兩個查詢條件,一是 user_name like %John%,另一個是 sex=1, 當然條件也可以是其他的,執行程序運行結果爲:
SELECT * FROM tbl_user_info WHERE 1=1 and user_name like ‘%John%’ and sex
= 1
UserVO [id=6, userName=John, age=19, sex=1, createDt=2016-06-24]
//按條件查詢
public List<UserVO> queryByParams(List<Map<String, Object>> params) throws Exception {
Connection conn = DBUtil.connectDB();
StringBuilder sql = new StringBuilder("SELECT * FROM tbl_user_info WHERE 1=1 ");
for(Map<String, Object> param : params) {
sql.append(" and ");
sql.append(" " + param.get("col") + " ");
sql.append(" " + param.get("rel") + " ");
sql.append(" " + param.get("value") + " ");
}
System.out.println(sql.toString());
List<UserVO> userList = new ArrayList<UserVO>();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql.toString());
while(rs.next()) {
UserVO user = new UserVO();
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("user_name"));
user.setAge(rs.getInt("age"));
user.setSex(rs.getInt("sex"));
user.setCreateDt(rs.getDate("create_dt"));
userList.add(user);
}
return userList;
}
//按條件查詢測試
UserDao dao = new UserDao();
List<Map<String, Object>> params = new ArrayList<Map<String,Object>>();
Map<String, Object> param1 = new HashMap<String, Object>();
param1.put("col", "user_name");
param1.put("rel", "like");
param1.put("value", "'%John%'");
params.add(param1);
Map<String, Object> param2 = new HashMap<String, Object>();
param2.put("col", "sex");
param2.put("rel", "=");
param2.put("value", 1);
params.add(param2);
try {
List<UserVO> userList = dao.queryByParams(params);
for(UserVO user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}
2) 增加
現在在 UserDao 中寫一個 addUser 方法用於新增一條信息:
//添加數據
public void addUser(UserVO user) throws Exception {
Connection conn = DBUtil.connectDB();
String sql = "INSERT INTO tbl_user_info(user_name, age, sex, create_dt) "
+ " VALUES(?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUserName());
pstmt.setInt(2, user.getAge());
pstmt.setInt(3, user.getSex());
pstmt.setDate(4, new Date(new java.util.Date().getTime()));
pstmt.execute();
}
//添加測試
UserDao dao = new UserDao();
UserVO user = new UserVO();
user.setUserName("Tom");
user.setAge(20);
user.setSex(1);
try {
dao.addUser(user);
} catch (Exception e) {
e.printStackTrace();
}
這個方法使用 Connection.prepareStatement(String sql)方法獲取一個 PreparedStatement 對象, 使用這個方法可以傳入帶參數的 SQL 語句,而參數的值可以通過 PreparedStatement.setXXX (int index, XXX value)的方法指定,其中 XXX 爲各種不同的類型,index 指定第幾個參數的下標。指定了參數的值之後,便可以執行 excute()方法執行 SQL 語句了。
接下來寫一個 main 方法來驗證這個增加的方法:
執行後再查看數據庫,發現 Tom 這個用戶已經已經插入成功了。
3) 刪除
接下來再寫一個刪除的方法,根據用戶的 id 來刪除數據:
//刪除數據
public void deleteUser(int id) throws Exception {
Connection conn = DBUtil.connectDB();
String sql = "DELETE FROM tbl_user_info WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.execute();
}
//刪除測試
UserDao dao = new UserDao();
try {
dao.deleteUser(7);
} catch (Exception e) {
e.printStackTrace();
}
刪除 id 爲 7 的用戶,也就是剛剛用新增方法創建的用戶名爲 Tom 的這個用戶,運行後查看數據庫:
4) 更新數據庫
最後來看一下更新數據庫:
//更新數據庫
public void updateUser(UserVO user) throws Exception {
Connection conn = DBUtil.connectDB();
String sql = "UPDATE tbl_user_info SET user_name=?, age=?, sex=?"
+ " WHERE id=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUserName());
pstmt.setInt(2, user.getAge());
pstmt.setInt(3, user.getSex());
pstmt.setInt(4, user.getId());
pstmt.executeUpdate();
}
//更新數據庫測試
UserDao dao = new UserDao();
UserVO user = new UserVO();
user.setUserName("Mary");
user.setAge(30);
user.setSex(0);
user.setId(4);
try {
dao.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
}
這個方法裏將用戶名爲 Mary 的用戶年齡改爲 30 歲,執行程序,運行後查看數據庫:
可以看到 Mary 的年齡確實變成了 30,,刪除成功。
以上便是對數據庫的增刪改查基本操作。