用JDBC連接MySQL數(shù)據(jù)庫并進(jìn)行簡單的增刪改查操作
簡單的JDBC實(shí)例
現(xiàn)在使用JDBC寫一個簡單的小程序,主要是使用JDBC連接MySQL數(shù)據(jù)庫,然后對數(shù)據(jù)庫進(jìn)行一些基本的增刪改查操作。
1、設(shè)計(jì)數(shù)據(jù)庫表
先設(shè)計(jì)一個數(shù)據(jù)庫表,用于保存用戶信息,建表語句如下:
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表示用戶的性別,這里的性別用數(shù)字表示,0表示女性,1表示男性,create_dt表示創(chuàng)建的時間。預(yù)先在數(shù)據(jù)庫中插入幾條數(shù)據(jù),數(shù)據(jù)如下。
?
2、定義實(shí)體類
定義一個Bean,與數(shù)據(jù)庫表中的各個字段對應(yīng):
package com.imooc.jdbc;
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、定義數(shù)據(jù)庫連接類
定義一個數(shù)據(jù)庫連接類,用于獲取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、加載數(shù)據(jù)庫驅(qū)動
Class.forName(DRIVER);
//2、獲取數(shù)據(jù)庫連接
Connection conn = DriverManager.getConnection(URI);
return conn;
}
}
MySQL的JDBC URL編寫方式為:jdbc:mysql://主機(jī)名稱:連接端口/數(shù)據(jù)庫的名稱?參數(shù)=值,在這個例子中我連接的數(shù)據(jù)庫主機(jī)是一臺遠(yuǎn)程主機(jī),所以主機(jī)名稱為遠(yuǎn)程主機(jī)的ip地址,如果數(shù)據(jù)庫主機(jī)為本機(jī),則可以定義為localhost,在參數(shù)中指定用戶名為root,密碼也是root,為了避免中文亂碼要指定useUnicode和characterEncoding。因?yàn)檫B接的是MySQL數(shù)據(jù)庫,所以程序一開始需要加載MySQL的數(shù)據(jù)庫驅(qū)動,然后通過DriverManager.getConnection(String URL)方法獲取數(shù)據(jù)庫的連接。
4、實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查
在獲取了數(shù)據(jù)庫的連接之后,就可以操作數(shù)據(jù)庫了,下面分別實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查操作,定義一個UserDao類用于操作數(shù)據(jù)庫。
1)查詢
先看查詢操作,查詢可以一次查詢出所有的數(shù)據(jù),也可以根據(jù)相應(yīng)的條件查詢。
查詢所有的數(shù)據(jù),在UserDao中定義一個queryAll()方法:
public List
Connection conn = DBUtil.connectDB();
String sql = “SELECT * FROM tbl_user_info”;
List
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對象,這個對象里面有很多的方法可以操作數(shù)據(jù)庫,使用excuteQuery(String sql)執(zhí)行查詢操作,查詢結(jié)果為一個結(jié)果集ResultSet,可以通過這個結(jié)果集獲取相關(guān)的信息。
定義main函數(shù):
public static void main(String[] args) {
UserDao dao = new UserDao();
try {
List
for(UserVO user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
執(zhí)行結(jié)果:
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]
根據(jù)條件查詢,定義一個queryByParams方法:
public List
Connection conn = DBUtil.connectDB();
StringBuilder sql = new StringBuilder(“SELECT * FROM tbl_user_info WHERE 1=1 ”);
for(Map
sql.append(“ and ”);
sql.append(“ ” + param.get(“col”) + “ ”);
sql.append(“ ” + param.get(“rel”) + “ ”);
sql.append(“ ” + param.get(“value”) + “ ”);
}
System.out.println(sql.toString());
List
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表示查詢條件對應(yīng)哪一列,rel表示查詢條件的關(guān)系是什么,value是指查詢條件的值。這樣寫集成了多查詢條件的方法,很多的業(yè)務(wù)下,查詢的邏輯可能很多,這樣寫只用一個統(tǒng)一的方法就可以解決多種不同查詢條件的業(yè)務(wù)邏輯。
再寫一個簡單的main函數(shù)測試一下:
public static void main(String[] args) {
UserDao dao = new UserDao();
List
Map
param1.put(“col”, “user_name”);
param1.put(“rel”, “l(fā)ike”);
param1.put(“value”, “‘%John%’”);
params.add(param1);
Map
param2.put(“col”, “sex”);
param2.put(“rel”, “=”);
param2.put(“value”, 1);
params.add(param2);
try {
List
for(UserVO user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
在這個main方法中設(shè)定了兩個查詢條件,一是user_name like %John%,另一個是sex=1,當(dāng)然條件也可以是其他的,執(zhí)行程序運(yùn)行結(jié)果為:
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)增加
現(xiàn)在在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對象,使用這個方法可以傳入帶參數(shù)的SQL語句,而參數(shù)的值可以通過PreparedStatement.setXXX(int index, XXX value)的方法指定,其中XXX為各種不同的類型,index指定第幾個參數(shù)的下標(biāo)。指定了參數(shù)的值之后,便可以執(zhí)行excute()方法執(zhí)行SQL語句了。
接下來寫一個main方法來驗(yàn)證這個增加的方法:
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();
}
}
執(zhí)行后再查看數(shù)據(jù)庫,發(fā)現(xiàn)Tom這個用戶已經(jīng)插入成功了。
?
3)刪除
接下來再寫一個刪除的方法,根據(jù)用戶的id來刪除數(shù)據(jù):
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方法來驗(yàn)證:
public static void main(String[] args) {
UserDao dao = new UserDao();
try {
dao.deleteUser(7);
} catch (Exception e) {
e.printStackTrace();
}
}
刪除id為7的用戶,也就是剛剛用新增方法創(chuàng)建的用戶名為Tom的這個用戶,運(yùn)行后查看數(shù)據(jù)庫:
?
4)更新數(shù)據(jù)庫
最后來看一下更新數(shù)據(jù)庫:
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語句中可以看出更新也是根據(jù)用戶的id進(jìn)行選擇性的更新的。
寫一個main方法來驗(yàn)證:
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歲,執(zhí)行程序,運(yùn)行后查看數(shù)據(jù)庫:
?
可以看到Mary的年齡確實(shí)變成了30,,刪除成功。
三、結(jié)語
由此使用JDBC連接MySQL數(shù)據(jù)庫并進(jìn)行基本的增刪改查操作就已經(jīng)完成了,這些只是最簡單的數(shù)據(jù)庫操作,實(shí)際開發(fā)過程中操作數(shù)據(jù)庫比這些要復(fù)雜得多,包括事務(wù)的處理、存儲過程等等,那就需要使用JDBC更高級的功能了,這些下次再寫。
評論
查看更多