CRUD操作
导入数据库驱动
在src
目录下建一个名为lib
的包,用于存放jar文件
File
——>Project Structure...
——>Moudules
在文件中勾选lib
,ok
导入成功
编写一个配置文件
# 数据库驱动
driver=com.mysql.cj.jdbc.Driver
# 在/后添加本地数据库名
url=jdbc:mysql://localhost:3306/
# 用户名
username=root
# 密码
password=*******
编写一个JDBCUtil工具类
便于控制连接的关闭
- Connection类
- 代表数据库的链接
- 使用的一些方法
方法 | 作用 |
---|---|
createStatement() | 创建向数据库发送sql的Statement 对象 |
prepareStatement(sql) | 创建向数据库发送预编译sql的PrepareSatement 对象 |
repareCall(sql) | 创建执行存储过程的callableStatement 对象 |
setAutoCommit(boolean autoCommit) | 设置事务是否自动提交 |
commit() | 在链接上提交事务 |
rollback() | 在此链接上回滚事务 |
- Statement类
- 用于向数据库发送SQL语句
- 使用的一些方法
方法 | 作用 |
---|---|
ecuteQuery(String sql) | 用于向数据发送select 语句 |
executeUpdate(String sql) | 用于向数据库发送insert 、update 或delete 语句 |
execute(String sql) | 用于向数据库发送任意sql语句 |
addBatch(String sql) | 把多条sql语句放到一个批处理中 |
executeBatch() | 向数据库发送一批sql语句执行 |
- PreparedStatement类
PreperedStatement是Statement的子类
- PreperedStatement可以避免SQL注入的问题
- PreparedStatement可对SQL进行预编译
- 对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句
- ResultSet类
- 用于代表Sql语句的执行结果
- 使用的一些方法
方法 | 作用 |
---|---|
getObject() | 获取任意类型的数据 |
getInt() | 获取int 类型的数据 |
getString() | 获取String 类型数据 |
next() | 移动到下一行 |
Previous() | 移动到前一行 |
absolute(int row) | 移动到指定行 |
beforeFirst() | 移动resultSet 的最前面 |
afterLast() | 移动到resultSet 的最后面 |
JDBCUtil工具类
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtils {
private static final String url;
private static final String username;
private static final String password;
// static块不依赖于任何对象就可以进行访问
static {
try {
//读取db.properties文件的数据库连接信息
JdbcUtils jdbcUtils = new JdbcUtils();
// 利用反射取得当前对象所属的Class对象,取得该Class对象的类装载器,读取文件
InputStream in = jdbcUtils.getClass().getClassLoader().getResourceAsStream("db.properties");
Properties prop = new Properties();
prop.load(in);
//获取数据库连接驱动
String driver = prop.getProperty("driver");
//获取数据库连接URL地址
url = prop.getProperty("url");
//获取数据库连接用户名
username = prop.getProperty("username");
//获取数据库连接密码
password = prop.getProperty("password");
//加载数据库驱动
//DriverManager.registerDriver(driver);
Class.forName(driver);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
// DriverManager类加载驱动,创建与数据库的链接
return DriverManager.getConnection(url, username, password);
}
// 释放资源
public static void release(Connection conn, Statement st, ResultSet rs) {
if (rs != null) {
try {
//关闭存储查询结果的ResultSet对象
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (st != null) {
try {
//关闭负责执行SQL命令的Statement对象
st.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
//关闭Connection数据库连接对象
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
CRUD操作
对数据库增删改查
- insert
插入数据
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
// 要插入的数据用占位符代替
String sql = "insert into user(name,age,school,grade,gender,date) VALUES(?,?,?,?,?,now())";
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 利用索引设立插入的数据值
st.setInt(2, age);
st.setString(1, name);
st.setString(3, school);
st.setString(4, grade);
st.setString(5, gender);
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
int num = st.executeUpdate();
if (num > 0) {
System.out.println("数据添加成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
— delete
删除数据
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
// 要删除的数据的行数用占位符代替
String sql = "delete from user where id="+id;
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
int num = st.executeUpdate();
if (num > 0) {
System.out.println("数据删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
— update
更新数据
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
// 要更新的数据的行数用占位符代替
String sql = " update user set name=? where id="+id;
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 利用索引设立插入的数据值
st.setString(1,name);
int num = st.executeUpdate();
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
if (num > 0) {
System.out.println("数据更新成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
- select
查询数据
Connection conn=null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
String sql = " select * from user ";
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 调用executeQuery()返回查询结果的ResultSet对象
rs = st.executeQuery(sql);
// 取出查询的结果
while (rs.next()) {
System.out.print(rs.getString("name") + " ");
System.out.print(rs.getInt("age") + " ");
System.out.print(rs.getString("school") + " ");
System.out.print(rs.getString("grade") + " ");
System.out.print(rs.getString("gender") + " ");
System.out.println(rs.getString("date"));
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, rs);
}
编写一个类JDBC
CRUD
操作的方法
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Jdbc {
// 数据添加
public void insert() {
Scanner scanner = new Scanner(System.in);
// 表结构
//+--------+-------------+------+-----+---------+----------------
//| Field | Type | Null | Key | Default | Extra |
//| name | varchar(10) | NO | | NULL | |
//| age | tinyint | NO | | NULL | |
//| school | varchar(15) | YES | | NULL | |
//| grade | varchar(5) | YES | | NULL | |
//| gender | char(1) | NO | | NULL | |
//| id | int | NO | PRI | NULL | auto_increment |
//| date | varchar(20) | YES | | NULL | |
//+--------+-------------+------+-----+---------+----------------+
System.out.println("name");
String name = scanner.next();
System.out.println("school");
String school = scanner.next();
System.out.println("age");
int age = scanner.nextInt();
System.out.println("grade");
String grade = scanner.next();
System.out.println("gender");
String gender = scanner.next();
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
// 要插入的数据用占位符代替
String sql = "insert into user(name,age,school,grade,gender,date) VALUES(?,?,?,?,?,now())";
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 利用索引设立插入的数据值
st.setInt(2, age);
st.setString(1, name);
st.setString(3, school);
st.setString(4, grade);
st.setString(5, gender);
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
int num = st.executeUpdate();
if (num > 0) {
System.out.println("数据添加成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
}
// 删除数据
public void delete() {
Scanner scanner = new Scanner(System.in);
System.out.println("id");
int id = scanner.nextInt();
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
// 要删除的数据的行数用占位符代替
String sql = "delete from user where id="+id;
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
int num = st.executeUpdate();
if (num > 0) {
System.out.println("数据删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
}
// 更新数据
public void update() {
Scanner scanner = new Scanner(System.in);
System.out.println("id");
Connection conn=null;
PreparedStatement st = null;
try {
// 使用之前编写的工具类
String name=scanner.next();
int id=scanner.nextInt();
conn = JdbcUtils.getConnection();
// 要更新的数据的行数用占位符代替
String sql = " update user set name=? where id="+id;
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 利用索引设立插入的数据值
st.setString(1,name);
int num = st.executeUpdate();
// 调用executeUpdate()返回的是改变的行数,在这里sql语句才开始执行
if (num > 0) {
System.out.println("数据更新成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, null);
}
}
// 查询数据
public void select() {
Connection conn=null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 使用之前编写的工具类
conn = JdbcUtils.getConnection();
String sql = " select * from user ";
// 向数据库发送预编译的sql语句
st = conn.prepareStatement(sql);
// 调用executeQuery()返回查询结果的ResultSet对象
rs = st.executeQuery(sql);
// 取出查询的结果
while (rs.next()) {
System.out.print(rs.getString("name") + " ");
System.out.print(rs.getInt("age") + " ");
System.out.print(rs.getString("school") + " ");
System.out.print(rs.getString("grade") + " ");
System.out.print(rs.getString("gender") + " ");
System.out.println(rs.getString("date"));
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.release(conn, st, rs);
}
}
}
编写一个类JdbcTest
检查是否可以正常运行
- 编写测试类
import java.util.Scanner;
public class JDBCTest {
public static void main(String[] args) {
Jdbc test = new Jdbc();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
switch (n) {
case 1:
test.insert();
break;
case 2:
test.update();
break;
case 3:
test.select();
break;
case 4:
test.delete();
break;
default:
System.out.println("你输入的数据有误!");
}
}
}
- 运行结果如下
3
小明 17 xx大学 大一 男 2022-02-18 20:59:51
小红 18 xx大学 大一 女 2022-02-18 21:00:17
小张 17 xx大学 大一 男 2022-02-18 21:00:26
小璃 17 xx大学 大一 女 2022-02-18 21:00:35
小晴 17 xx大学 大一 女 2022-02-18 21:00:49
小方 17 xx大学 大一 男 2022-02-18 21:00:56
小宋 17 xx大学 大一 男 2022-02-18 21:01:03
小滢 19 xx大学 大一 女 2022-02-19 10:19:09
小胡 19 xx大学 大二 女 2022-02-19 12:14:26
小何 17 xx大学 大一 女 2022-02-21 16:19:42
Process finished with exit code 0