通过JDBC对mysql数据库进行增删改查
摘要
本文提供了一个简单的java实例,利用JDBC,实现了对mysql数据库的增删改查操作,并提供了完整代码见附录。
一、准备工作
本文使用的编译器为IDEA2018.2,可参考
在IDEA中建立一个简单的JDBC项目。
二、涉及的java知识点
可参考Java Api手册
Connection
与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。
相关方法 | 描述 |
---|---|
prepareStatement() | 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 |
close() | 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。 |
DriverManager.getConnection() | 试图建立到给定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序 |
ResultSet
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
相关方法 | 描述 |
---|---|
next() | 将光标从当前位置向前移一行。 |
getString() | 以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。 |
getInt() | 以 Java 编程语言中 int的形式获取此 ResultSet 对象的当前行中指定列的值。 |
close(); | 立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 |
PreparedStatement
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement(“UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?”);
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
相关方法 | 描述 |
---|---|
setString() | 将指定参数设置为给定 Java String 值。 |
setInt() | 将指定参数设置为给定 Java int 值。 |
executeQuery() | 在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。 |
executeUpdate() | 在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。 |
ArrayList
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)
相关方法 | 描述 |
---|---|
add(E e) | 将指定的元素添加到此列表的尾部。 |
get(int index) | 返回此列表中指定位置上的元素。 |
size() | 返回此列表中的元素数。 |
三、代码目录结构解释
package名称 | 解释 | 包含的java类 |
---|---|---|
bean | 实体层,与数据库中的表对应 | UserInfo |
dao | 持久层,数据库增删改查操作 | UserInfoDao |
util | 工具,数据库的连接 | DBUtil |
四、实体类的建立
为了与数据库中数据对应,我们建立一个与数据库中表结构一样的实体类。
一个实体类应该包含以下内容:
1.数据成员变量
2.数据操作方法(Getter,Setter,toString等)
3.构造函数
首先创建与表中字段类型数据类型相同的私有成员变量,然后为其创建Getter、Setter方法和构造函数。
本文数据库中的userinfo表中包含的字段为id(INT),username(VARCHAR),password(VARCHAR),故创建Userinfo实体类如下
public class UserInfo {
//ID,用户名,密码
private int id;
private String username;
private String password;
public UserInfo() {
}
//用ID,用户名,密码构造
public UserInfo(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
//为私有成员变量创建Getter方法和Setter方法,可通过右键点击Generate自动创建
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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;
}
//右键点击Generate,自动生成toString()方法
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
五、数据库的连接和关闭
为了降低代码的耦合度,提高程序的可复用性,本文将数据库的连接操作提取出来,封装到了DBUtil类的静态方法中。当数据库操作需要进行数据库连接操作时,只需要调用DBUtil.getConnection()方法即可,不需要考虑其内部具体实现,且对该方法的修改不会影响外部的代码,降低了代码耦合性。
本文这里只实现了最简单的连接方式,若想提高性格,可考虑采用数据库连接池对DBUtil.getConnection()方法进行改进。
5.1数据库的连接
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useSSL=true&characterEncoding=utf-8&user=root&password=root");
// System.out.println("创建连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
5.2关闭连接
public static void close(ResultSet rs,Statement statement,Connection connection){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
六、JDBC基本操作
为了对数据进行操作,本文为此定义了操作类UserinfoDao,并将所有对数据库操作的sql语句封装到该类中。
6.1 增加操作
public void add(UserInfo userInfo){
PreparedStatement statement = null;
Connection connection = null;
String sql = "insert into userinfo (id,username,password) values(?,?,?)";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.setInt(1,userInfo.getId());
statement.setString(2,userInfo.getUsername());
statement.setString(3,userInfo.getPassword());
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
6.2 删除操作
//根据用户名删除用户
public void deleteFromUsername(String username){
PreparedStatement statement = null;
Connection connection = null;
String sql="delete from userinfo where username='"+username+"'";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
6.3 修改操作
public int update(UserInfo userInfo){
PreparedStatement statement = null;
Connection connection = null;
String sql="update userinfo set username='"
+userInfo.getUsername()
+"',password='"
+userInfo.getPassword()
+"' where id='"
+userInfo.getId()
+"'";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
6.4 查找操作
查找所有用户
public List<UserInfo> findAll() {
ResultSet rs = null;
Connection connection = null;
PreparedStatement statement = null;
List<UserInfo> list = new ArrayList<>();
try {
connection = DBUtil.getConnection();
//写sql
String sql = "select * from userinfo";
//得到statement对象执行sql
statement = connection.prepareStatement(sql);
//得到结果集
rs = statement.executeQuery();
//处理结果集
while (rs.next()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt(1));
userInfo.setUsername(rs.getString(2));
userInfo.setPassword(rs.getString(3));
list.add(userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
DBUtil.close(rs, statement, connection);
}
return list;
}
根据用户名查找用户
//根据用户名查找用户
public List<UserInfo> selectFromUsername(String username){
ResultSet rs = null;
Connection connection = null;
PreparedStatement statement = null;
List<UserInfo> list = new ArrayList<>();
try {
connection = DBUtil.getConnection();
//写sql
String sql = "select * from userinfo where username = '"+username+"'";
//得到statement对象执行sql
statement = connection.prepareStatement(sql);
//得到结果集
rs = statement.executeQuery();
//处理结果集
while (rs.next()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt(1));
userInfo.setUsername(rs.getString(2));
userInfo.setPassword(rs.getString(3));
list.add(userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
DBUtil.close(rs, statement, connection);
}
return list;
}
七、测试类的实现
本文在主函数中对上述操作进行了测试。
//Main.java
import bean.UserInfo;
import dao.UserInfoDao;
public class Main {
public static void main(String[] args) {
//查找全部
System.out.println("查找全部");
System.out.println(new UserInfoDao().findAll());
//增加
System.out.println("增加");
new UserInfoDao().add(new UserInfo(10,"王五","王五的密码"));
System.out.println(new UserInfoDao().findAll());
//更新
System.out.println("更新");
new UserInfoDao().update(new UserInfo(10,"张三","张三的密码"));
System.out.println(new UserInfoDao().findAll());
//按照用户名查找
System.out.println("按照用户名查找");
System.out.println(new UserInfoDao().selectFromUsername("张三"));
//按照ID进行删除
System.out.println("按照ID删除");
new UserInfoDao().deleteFromUsername("张三");
System.out.println(new UserInfoDao().findAll());
}
}
测试结果如下,可以看到增删改查操作运行成功。
附录
代码目录结构如下
UserInfo.java
//UserInfo.java
package bean;
//实体类,对应数据库中的表结构
public class UserInfo {
//ID,用户名,密码
private int id;
private String username;
private String password;
public UserInfo() {
}
//用ID,用户名,密码构造
public UserInfo(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
//为私有成员变量创建Getter方法和Setter方法,可通过右键点击Generate自动创建
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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;
}
//右键点击Generate,自动生成toString()方法
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserInfoDao.java
//UserInfoDao.java
package dao;
import bean.UserInfo;
import util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserInfoDao {
//select查找所有用户
public List<UserInfo> findAll() {
ResultSet rs = null;
Connection connection = null;
PreparedStatement statement = null;
List<UserInfo> list = new ArrayList<>();
try {
connection = DBUtil.getConnection();
//写sql
String sql = "select * from userinfo";
//得到statement对象执行sql
statement = connection.prepareStatement(sql);
//得到结果集
rs = statement.executeQuery();
//处理结果集
while (rs.next()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt(1));
userInfo.setUsername(rs.getString(2));
userInfo.setPassword(rs.getString(3));
list.add(userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
DBUtil.close(rs, statement, connection);
}
return list;
}
//添加用户信息
public void add(UserInfo userInfo){
PreparedStatement statement = null;
Connection connection = null;
String sql = "insert into userinfo (id,username,password) values(?,?,?)";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.setInt(1,userInfo.getId());
statement.setString(2,userInfo.getUsername());
statement.setString(3,userInfo.getPassword());
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
//更新用户信息
public int update(UserInfo userInfo){
PreparedStatement statement = null;
Connection connection = null;
String sql="update userinfo set username='"
+userInfo.getUsername()
+"',password='"
+userInfo.getPassword()
+"' where id='"
+userInfo.getId()
+"'";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
//根据用户名删除用户
public void deleteFromUsername(String username){
PreparedStatement statement = null;
Connection connection = null;
String sql="delete from userinfo where username='"+username+"'";
try {
connection = DBUtil.getConnection();
statement=connection.prepareStatement(sql);
statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, statement, connection);
}
}
//根据用户名查找用户
public List<UserInfo> selectFromUsername(String username){
ResultSet rs = null;
Connection connection = null;
PreparedStatement statement = null;
List<UserInfo> list = new ArrayList<>();
try {
connection = DBUtil.getConnection();
//写sql
String sql = "select * from userinfo where username = '"+username+"'";
//得到statement对象执行sql
statement = connection.prepareStatement(sql);
//得到结果集
rs = statement.executeQuery();
//处理结果集
while (rs.next()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt(1));
userInfo.setUsername(rs.getString(2));
userInfo.setPassword(rs.getString(3));
list.add(userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
DBUtil.close(rs, statement, connection);
}
return list;
}
}
DBUtil.java
//DBUtil.java
package util;
import java.sql.*;
public class DBUtil {
/***
*本文使用的数据库名称为user,账号密码均为root,
*数据库含表userinfo,
*该表有三个字段,id(INT),userinfo(VARCHAR),password(VARCHAR)
*读者可根据数据库的实际情况对语句进行修改
***/
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useSSL=true&characterEncoding=utf-8&user=root&password=root");
// System.out.println("创建连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void close(ResultSet rs,Statement statement,Connection connection){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Main.java
//Main.java
import bean.UserInfo;
import dao.UserInfoDao;
public class Main {
public static void main(String[] args) {
//查找全部
System.out.println("查找全部");
System.out.println(new UserInfoDao().findAll());
//增加
System.out.println("增加");
new UserInfoDao().add(new UserInfo(10,"王五","王五的密码"));
System.out.println(new UserInfoDao().findAll());
//更新
System.out.println("更新");
new UserInfoDao().update(new UserInfo(10,"张三","张三的密码"));
System.out.println(new UserInfoDao().findAll());
//按照用户名查找
System.out.println("按照用户名查找");
System.out.println(new UserInfoDao().selectFromUsername("张三"));
//按照ID进行删除
System.out.println("按照ID删除");
new UserInfoDao().deleteFromUsername("张三");
System.out.println(new UserInfoDao().findAll());
}
}