Java 使用jdbc操作数据库
注:本文演示操作的为MySQL数据库,请确保自己电脑已经安装。
JDBC
JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。例如,我们在Java代码中如果要访问MySQL,那么必须编写代码操作JDBC接口。注意到JDBC接口是Java标准库自带的,所以可以直接编译。而具体的JDBC驱动是由数据库厂商提供的。因此,访问某个具体的数据库,我们只需要引入该厂商提供的JDBC驱动,就可以通过JDBC接口来访问,这样保证了Java程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的JDBC驱动:
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ ┌───────────────┐ │
│ Java App │
│ └───────────────┘ │
│
│ ▼ │
┌───────────────┐
│ │JDBC Interface │<─┼─── JDK
└───────────────┘
│ │ │
▼
│ ┌───────────────┐ │
│ MySQL Driver │<───── Oracle
│ └───────────────┘ │
│
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
▼
┌───────────────┐
│ MySQL │
└───────────────┘
实际上,一个MySQL的JDBC的驱动就是一个jar包,它本身也是纯Java编写的。我们自己编写的代码只需要引用Java标准库提供的java.sql包下面的相关接口,由此再间接地通过MySQL驱动的jar包通过网络访问MySQL服务器,所有复杂的网络通讯都被封装到JDBC驱动中,因此,Java程序本身只需要引入一个MySQL驱动的jar包就可以正常访问MySQL服务器:
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
┌───────────────┐
│ │ App.class │ │
└───────────────┘
│ │ │
▼
│ ┌───────────────┐ │
│ java.sql.* │
│ └───────────────┘ │
│
│ ▼ │
┌───────────────┐ TCP ┌───────────────┐
│ │ mysql-xxx.jar │──┼────────>│ MySQL │
└───────────────┘ └───────────────┘
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
JVM
我们要去这里http://dev.mysql.com/downloads/下载MySQL的驱动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lbxYWSw-1649996475043)(C:\Users\13499\AppData\Roaming\Typora\typora-user-images\image-20220415115426402.png)]
下完后在新建的java_project导入驱动包
假设数据库运行在本机localhost
,端口使用标准的3306
,数据库名称是jdbctest
,那么URL如下:
jdbc:mysql://localhost:3306/jdbctest?useSSL=false&characterEncoding=utf8
后面的两个参数表示不使用SSL加密,使用UTF-8作为字符编码(注意MySQL的UTF-8是utf8
)。
要获取数据库连接,使用如下代码:
// JDBC连接的URL, 不同数据库有不同的格式:
String JDBC_URL = "jdbc:mysql://localhost:3306/jdbctest";
String JDBC_USER = "root";
String JDBC_PASSWORD = "password";
// 获取连接:
Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
// TODO: 访问数据库...
// 关闭连接:
conn.close();
有了驱动,我们还要确保MySQL在本机正常运行,并且还需要准备一点数据。这里我们用一个创建数据库和表,然后插入一些数据:
-- jdbctest:
DROP DATABASE IF EXISTS jdbctest;
CREATE DATABASE jdbctest;
-- 创建表students:
USE jdbctest;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`ident` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '0普通用户\r\n1管理员',
`telephone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`address` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unique-username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- 插入数据
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', '123', '1', '0', '0');
INSERT INTO `user` VALUES (2, 'user1', '123', '0', '041184835202', '大连东软信息学院A3座117室');
INSERT INTO `user` VALUES (3, 'user2', '123', '0', '041184835207', '大连理工大学计算机系');
INSERT INTO `user` VALUES (4, 'user3', '123', '0', '041184832264', '新新园100号2门103');
然后在Java工程里面创建实体类
package com.kgy.entity;
public class User {
private int id;
private String username;
private String password;
private int ident;
private String telephone;
private String address;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getIdent() {
return ident;
}
public void setIdent(int ident) {
this.ident = ident;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User(int id, String username, String password, int ident, String telephone, String address) {
super();
this.id = id;
this.username = username;
this.password = password;
this.ident = ident;
this.telephone = telephone;
this.address = address;
}
public User() {
super();
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", ident=" + ident
+ ", telephone=" + telephone + ", address=" + address + "]";
}
}
编写DBUtil.java
package com.kgy.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
// 建立连接方法
public static Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");//8.0,如果是5.1对应驱动名称为:com.mysql.jdbc.Driver
// System.out.println("1、驱动加载成功!");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest?serverTimezone=UTC&useSSL=false", "root", "password");
// System.out.println("2、建立连接");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return con;
}
// 关闭连接方法
public static void closeConnection(ResultSet rs,Statement st,Connection con) {
try {
if(rs!=null) {
rs.close();
}
if(st!=null) {
st.close();
}
if(con!=null) {
con.close();
}
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
查询
//获取所有用户
public List<User> getAllUser(){
List<User> list = new ArrayList<User>();
try {
Connection con = DBUtil.getConnection();
String sql="select * from user";//增删改查 insert into user values(),delete user ,update user set ,select
Statement st = con.createStatement();
System.out.println("3、创建语句对象");
ResultSet rs = st.executeQuery(sql);//增删改的函数是executeUpdate(sql)
System.out.println("4、产生结果集");
while(rs.next()) { //如果对象中有数据,就会循环出来
User user = new User();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
user.setIdent(rs.getInt(4));
user.setTelephone(rs.getString(5));
user.setAddress(rs.getString(6));
list.add(user);
}
DBUtil.closeConnection(rs, st, con);
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return list;
}
//判断参数user中带的用户名密码是否正确,根据条件获取用户
public User login(User user) {
User u = null;
try {
Connection con = DBUtil.getConnection();
String sql="select * from user where username=? and password=?"; //参数用?表示,相当于占位符
//预编译sql语句
PreparedStatement st = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
st.setString(1, user.getUsername());
st.setString(2, user.getPassword());
//执行SQL语句
ResultSet rs = st.executeQuery();
while (rs.next()) {
u.setId(rs.getInt(1));
u.setUsername(rs.getString(2));
u.setPassword(rs.getString(3));
u.setIdent(rs.getInt(4));
u.setTelephone(rs.getString(5));
u.setAddress(rs.getString(6));
}
}catch (SQLException e) {
e.printStackTrace();
}
return u;
}
修改、删除、插入数据
//将参数user中内容插入到数据库中
public int inert(User user) {
int n = 0;
try {
Connection con = DBUtil.getConnection();
String sql="insert into user(id,username,password,ident,telephone,address) values(?,?,?,?,?,?)";
PreparedStatement st = con.prepareStatement(sql);
st.setObject(1, user.getId());
st.setObject(2, user.getUsername());
st.setObject(3, user.getPassword());
st.setObject(4, user.getIdent());
st.setObject(5, user.getTelephone());
st.setObject(6, user.getAddress());
n = st.executeUpdate(); //增删改的函数是executeUpdate(sql),成功返回1,失败返回0
}catch (SQLException e) {
e.printStackTrace();
}
return n;
}
// 根据id删除
public void delUser(Integer id) throws SQLException{
int n = 0;
try {
Connection con=DBUtil.getConnection();//首先拿到数据库的连接
String sql="delete from user where id=?";
//预编译sql语句
PreparedStatement st = con.prepareStatement(sql);
//先对应SQL语句,给SQL语句传递参数
st.setInt(1, id);
//执行SQL语句
n = st.executeUpdate(); // 成功返回1,失败返回0
}catch (SQLException e) {
e.printStackTrace();
}
return n;
}
// 根据id修改数据
public int updUser(User user) {
int n = 0;
try {
Connection con = DBUtil.getConnection();
// 看需求更新哪些数据
String sql="update user set username=?,password=?,ident=?,telephone=?,address=? where id=?) ";
PreparedStatement st = con.prepareStatement(sql);
st.setObject(1, user.getUsername());
st.setObject(2, user.getPassword());
st.setObject(3, user.getIdent());
st.setObject(4, user.getTelephone());
st.setObject(5, user.getAddress());
st.setObject(6, user.getId());
n = st.executeUpdate(); //增删改的函数是executeUpdate(sql),成功返回1,失败返回0
}catch (SQLException e) {
e.printStackTrace();
}
return n;
}
事务
在这里简单说明一下事务,想了解更多请自行去了解。要在JDBC中执行事务,本质上就是如何把多条SQL包裹在一个数据库事务中执行。我们来看JDBC的事务代码:
Connection con = DBUtil.getConnection();
try {
// 关闭自动提交:
con.setAutoCommit(false);
// 执行多条SQL语句:
insert(); update(); delete();
// 提交事务:
conn.commit();
} catch (SQLException e) {
// 回滚事务:
con.rollback();
} finally {
con.setAutoCommit(true);
con.close();
}
自行去了解。要在JDBC中执行事务,本质上就是如何把多条SQL包裹在一个数据库事务中执行。我们来看JDBC的事务代码:
```Java
Connection con = DBUtil.getConnection();
try {
// 关闭自动提交:
con.setAutoCommit(false);
// 执行多条SQL语句:
insert(); update(); delete();
// 提交事务:
conn.commit();
} catch (SQLException e) {
// 回滚事务:
con.rollback();
} finally {
con.setAutoCommit(true);
con.close();
}