当前位置:网站首页>JDBC学习(一)——实现简单的CRUD操作
JDBC学习(一)——实现简单的CRUD操作
2022-06-28 06:04:00 【木棣%】
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
边栏推荐
猜你喜欢

YYGH-6-微信登录

The custom cube UI pop-up dialog supports multiple and multiple types of input boxes

Yygh-6-wechat login

Independent station sellers are using the five e-mail marketing skills, do you know?

Drop down box for implementation

Lombok @equalsandhashcode annotation how to make objects The equals () method compares only some attributes

容量调度绝对值配置队列使用与避坑

cocoapod中的第三方库怎么引用本地头文件

What is the e-commerce conversion rate so abstract?

Difficulty calculation of Ethereum classic
随机推荐
Apple MDM Bypass 免越狱绕过MDM配置锁 免费
mysql常用函数
At first glance, I can see several methods used by motionlayout
YYGH-7-用户管理
Filecoin hacker song developer competition
Shanghai Yuge ASR CAT1 4G module 2-way low power 4G application
函数栈帧的创建和销毁
Yygh-8-appointment registration
简单手写debounce函数
【Paper Reading-3D Detection】Fully Convolutional One-Stage 3D Object Detection on LiDAR Range Images
Data warehouse: financial / banking theme layer division scheme
Object对象转 List集合
Valueerror: iterative over raw text documents expected, string object received
The custom cube UI pop-up dialog supports multiple and multiple types of input boxes
若依实现下拉框
Flink window mechanism (two waits and the last explanation)
Yygh-6-wechat login
Data middle office: construction ideas and implementation experience of data governance
Install redis on windows and permanently change the password, and integrate redis with the SSM framework
Maskrcnn, fast RCNN, fast RCNN excellent video