桂 林 理 工 大 学
实 验 报 告
班级 网络17-1班 学号 9527 姓名 v1rtue 同组实验者
实验名称 JDBC访问数据库 日期 2020年 5 月 5 日
一、实验目的:
理解 JDBC 的工作原理,掌握 JDBC 访问数据库;
掌握常见数据库 MYSQL ;
二、实验环境:
Eclipse && mysql-connector-java-5.0.8-bin && MySQL Server 5.5
三、实验要求:
- 理解 JDBC 的应用。
- 掌握 JDBC 的编程接口。
- 熟练使用 MYEclipse 开发简单应用
四、实验内容
现在使用 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://localhost:3306/database?"
+ "user=root&password=v1rtue&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()方法:
package com.imooc.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
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 函数:
package com.imooc.jdbc;
import java.util.List;
public class testUD {
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();
}
}
}
执行结果:
根据条件查询,定义一个 queryByParams 方法:
package com.imooc.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class UserDao {
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 函数测试一下:
package com.imooc.jdbc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class testUD {
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,
当然条件也可以是其他的,执行程序运行结果为:
2)增加
现在在 UserDao 中写一个 addUser 方法用于新增一条信息:
package com.imooc.jdbc;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class UserDao {
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;
}
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 方法来验证这个增加的方法:
package com.imooc.jdbc;
public class testUD {
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 来删除数据:
package com.imooc.jdbc;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class UserDao {
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;
}
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();
}
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方法来验证:
package com.imooc.jdbc;
public class testUD {
public static void main(String[] args) {
UserDao dao = new UserDao();
try {
dao.deleteUser(7);
} catch (Exception e) {
e.printStackTrace();
}
}
}
删除 id 为 7 的用户,也就是刚刚用新增方法创建的用户名为 Tom 的这个用户,运行后查看数据库:
4)更新数据库
最后来看一下更新数据库:
package com.imooc.jdbc;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class UserDao {
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;
}
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();
}
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();
}
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 方法来验证:
package com.imooc.jdbc;
public class testUD {
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 数据库进行简单的操作。