1. 程式人生 > >JDBC——用JDBC連線MySQL資料庫並進行簡單的增刪改查操作

JDBC——用JDBC連線MySQL資料庫並進行簡單的增刪改查操作

一、什麼是JDBC

Java 資料庫連線,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法。(摘自維基百科

二、簡單的JDBC例項

現在使用JDBC寫一個簡單的小程式,主要是使用JDBC連線MySQL資料庫,然後對資料庫進行一些基本的增刪改查操作。

1、設計資料庫表

先設計一個數據庫表,用於儲存使用者資訊,建表語句如下:
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;
在使用者表中定義了幾個欄位,分別是id,user_name,age,sex,create_dt,其中id是主鍵,是自增長的,user_name表示使用者名稱,age表示使用者年齡,sex表示使用者的性別,這裡的性別用數字表示,0表示女性,1表示男性,create_dt表示建立的時間。預先在資料庫中插入幾條資料,資料如下。

2、定義實體類

定義一個Bean,與資料庫表中的各個欄位對應:
package com.imooc.jdbc;

import java.util.Date;

public class UserVO {
	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;
	}

	@Override
	public String toString() {
		return "UserVO [id=" + id + ", userName=" + userName + ", age=" + age
				+ ", sex=" + sex + ", createDt=" + createDt + "]";
	}

}

3、定義資料庫連線類

定義一個數據庫連線類,用於獲取MySQL的連線
package com.imooc.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtil {

	private static final String URI = "jdbc:mysql://192.168.2.207:3306/jdbc_demo?"
			+ "user=root&password=root&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;
	}
	
}
 MySQL的JDBC URL編寫方式為:jdbc:mysql://主機名稱:連線埠/資料庫的名稱?引數=值,在這個例子中我連線的資料庫主機是一臺遠端主機,所以主機名稱為遠端主機的ip地址,如果資料庫主機為本機,則可以定義為localhost,在引數中指定使用者名稱為root,密碼也是root,為了避免中文亂碼要指定useUnicode和characterEncoding。因為連線的是MySQL資料庫,所以程式一開始需要載入MySQL的資料庫驅動,然後通過DriverManager.getConnection(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)執行查詢操作,查詢結果為一個結果集ResultSet,可以通過這個結果集獲取相關的資訊。 定義main函式:
	public static void main(String[] args) {
		UserDao dao = new UserDao();
		
		try {
			List<UserVO> userList = dao.queryAll();
			for(UserVO user : userList) {
				System.out.println(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
執行結果: 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方法:
	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;
	}
這個方法可以自由選擇查詢的條件,只需要向方法中傳入一個條件的List即可,這些條件都是由Map組成的,每一個Map包含三個元素,col表示查詢條件對應哪一列,rel表示查詢條件的關係是什麼,value是指查詢條件的值。這樣寫集成了多查詢條件的方法,很多的業務下,查詢的邏輯可能很多,這樣寫只用一個統一的方法就可以解決多種不同查詢條件的業務邏輯。 再寫一個簡單的main函式測試一下:
	public static void main(String[] args) {
		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();
		}
		
	}
在這個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]

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();
	}
這個方法使用Connection.prepareStatement(String sql)方法獲取一個PreparedStatement物件,使用這個方法可以傳入帶引數的SQL語句,而引數的值可以通過PreparedStatement.setXXX(int index, XXX value)的方法指定,其中XXX為各種不同的型別,index指定第幾個引數的下標。指定了引數的值之後,便可以執行excute()方法執行SQL語句了。
接下來寫一個main方法來驗證這個增加的方法:
	public static void main(String[] args) {
		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();
		}
	}
執行後再檢視資料庫,發現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();
	}
然後寫一個main方法來驗證:
	public static void main(String[] args) {
		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();
	}
從SQL語句中可以看出更新也是根據使用者的id進行選擇性的更新的。 寫一個main方法來驗證:
	public static void main(String[] args) {
		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,,刪除成功。

三、結語

由此使用JDBC連線MySQL資料庫並進行基本的增刪改查操作就已經完成了,這些只是最簡單的資料庫操作,實際開發過程中操作資料庫比這些要複雜得多,包括事務的處理、儲存過程等等,那就需要使用JDBC更高階的功能了,這些下次再寫。