JDBC 訪問數據庫

現在使用 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,,刪除成功。
在這裏插入圖片描述
以上便是對數據庫的增刪改查基本操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章