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导入驱动包

img
img

假设数据库运行在本机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();
}