源码
本项目源码下载
步骤
1.获取数据库连接
此处直接用写好的DBUtil操作,这里查看详解
Connection conn = DBUtil.getConnection();
2.创建会话,有两种方式
1.使用Statement创建(因为有注入问题,现今几乎不使用)
Statement stmt = conn.createStatement();
2.使用PreparedStatement创建(常用)
PreparedStatement ps = conn.prepareStatement(sql);
3.进行具体的增删改查操作
两种情况:
1. 执行增删改操作:需要用到以下语句,它相当于在数据库中按下了执行sql语句的按钮。
注意:它的返回值是受影响的行数,我们通常用这个返回值来判断对数据的增上哎是否成功
ps.executeUpdate();
- 执行查询操作:需要用到以下语句:它相当于在数据库中按下了执行sql语句的按钮。
ps.executeQuery();
3.1书写sql语句
分两种情况:
1.步骤2用PreparedStatement创建的会话
2.步骤2用Statement创建的会话
由于Statement已经不怎么使用,本文主要介绍第二种。
- 在Java中,sql中的问号表示占位符,表示需要有参数来替代这个占位符
- 占位符可以设置值,用PreparedStatement的对象设置,假如要设置的值是int类型,应该这样写:
ps.setInt(1, id);
- 类似地,还能设置String、Double等其他类型:
ps.setString(2, name);
ps.setDouble(3, salary);
- 第一个参数代表第几个占位符(也就是第几个问号),只能传递int类型
- 第二个参数代表要传入的具体的值
1)增加
insert into employee values(?,?,?,?);
完整的添加过程:
int id = 5;
String name = "张三";
double salalry = 5000.00;
String gender = "男";
// sql 语句
String insertSql= insert into employee values(?,?,?,?);
ps.setInt(1, id);
ps.setString(2, name);
ps.setDouble(3, salary);
ps.setString(4, gender);
// 在数据库中执行增加操作
int count = ps.executeUpdate();
return count;
2)修改
update employee set name=? where id =?
完整的修改过程:
int id = 5;
String name = "张三";
// sql 语句
String updateSql = "update employee set name=? where id =? ";
ps = conn.prepareStatement(sql);
// 设置第1个占位符的字段为传递过来的name
ps.setString(1, name);
// 设置第2个占位符的值为传递过来的id
ps.setInt(2, 1);
// 在数据库中执行修改操作
int count = ps.executeUpdate();
return count;
3)删除
delete form employee where id = ?
完整的删除过程:
int id = 5;
// sql 语句
String deleteSql = "delete form employee where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
// 在数据库中执行删除操作
int count = ps.executeUpdate();
return count;
4)查询
在数据库中查询的结果需要使用Java中的ResultSet类将进行保存。声明如下:
ResultSet rs = ps.executeQuery();
查询分两种情况:
①简单查询
②带参数查询
Ⅰ.简单查询语句:
select * from employee
完整的查询过程:
int id = 5;
// sql 语句
String selectSql = "select * from employee";
ps = conn.prepareStatement(sql);
// 在数据库中执行查询语句,并将结果(查询到的多条记录)赋值给rs
rs = ps.executeQuery();
// 输出查询结果的表头
System.out.println("\tID\tName\tSlary\tGender");
// 将结果集的值取出,并循环输出
while(rs.next()) {
id = rs.getInt("id");
name = rs.getString("name");
salary = rs.getDouble("salary");
gender = rs.getString("gender");
// 输出查询结果
System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);
}
Ⅰ.带参数的查询语句(以按id查询为例,其他查询以此类推):
select * from employee where id = ?
完整的查询过程:
String selectSql1 = "select * from employee where id = ?";
ps = conn.prepareStatement(sql);
// 在数据库中执行查询语句,并将结果(查询到的多条记录)赋值给rs
rs = ps.executeQuery();
// 设置 id
ps.setInt(1, id);
// 输出查询结果的表头
System.out.println("\tID\tName\tSlary\tGender");
// 将结果集的值取出,并循环输出
while(rs.next()) {
id = rs.getInt("id");
name = rs.getString("name");
salary = rs.getDouble("salary");
gender = rs.getString("gender");
// 输出查询结果
System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);
}
完整工具类
这样的操作应该封装成一个工具类重复使用(代码重用原则)
package beans;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import utils.DBUtil;
public class CRUDDemo {
private Connection conn = DBUtil.getConnection();
private PreparedStatement ps;
private ResultSet rs;
// 声明结果集中字段
int id;
String name;
double salary;
String gender;
/*
* 添加
*/
public int insert(String sql,int id,String name,double salary,String gender) throws SQLException {
ps = conn.prepareStatement(sql);
// 设置参数
ps.setInt(1, id);
ps.setString(2, name);
ps.setDouble(3, salary);
ps.setString(4, gender);
// 在数据库中执行增加操作
int count = ps.executeUpdate();
System.out.println("新增了"+count+"条记录");
return count;
}
/*
* 修改
*/
public int update(String sql,String name,int id)throws SQLException {
ps = conn.prepareStatement(sql);
// 设置第1个占位符的字段为传递过来的name
ps.setString(1, name);
// 设置第2个占位符的值为传递过来的id
ps.setInt(2, 1);
// 判断数据是否更新成功
int count = ps.executeUpdate();
if(count!=0) {
System.out.println("数据修改成功!");
System.out.println("修改了了"+count+"条记录");
}
return 0;
}
/*
* 删除
*/
public int delete(String sql,int id) throws SQLException {
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
int count = ps.executeUpdate();
System.out.println("删除了"+count+"条记录");
return 0;
}
/*
* 简单查询
*/
public void select(String sql)throws SQLException {
ps = conn.prepareStatement(sql);
// 在数据库中执行查询语句
rs = ps.executeQuery();
// 输出查询结果的表头
System.out.println("\tID\tName\tSlary\tGender");
// 保存结果集到Java变量中
while(rs.next()) {
id = rs.getInt("id");
name = rs.getString("name");
salary = rs.getDouble("salary");
gender = rs.getString("gender");
// 输出查询结果
System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);
}
}
/*
* 带条件的查询(以按id查询为例,其他查询以此类推)
*/
public void select(String sql,int id)throws SQLException {
ps = conn.prepareStatement(sql);
// 设置 id
ps.setInt(1, id);
// 在数据库中执行查询语句
rs = ps.executeQuery();
// 输出查询结果的表头
System.out.println("\tID\tName\tSlary\tGender");
// 保存结果集到Java变量中
while(rs.next()) {
id = rs.getInt("id");
name = rs.getString("name");
salary = rs.getDouble("salary");
gender = rs.getString("gender");
// 输出查询结果
System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);
}
}
}
测试类
package test;
import java.sql.SQLException;
import org.junit.jupiter.api.Test;
import beans.CRUDDemo;
class TestCRUDDemo {
CRUDDemo cd = new CRUDDemo();
@Test
void testInsert() throws SQLException {
// 测试增加
String insertSql = "insert into employee values(?,?,?,?)";
cd.insert(insertSql,3,"谢春花",12000.00,"女");
}
@Test
void testUpdate() throws SQLException {
// 测试修改(更新),假设更新姓名,更新其他字段类似
String updateSql = "update employee set name=? where id =? ";
cd.update(updateSql, "银临", 3);
}
@Test
void testDelete() throws SQLException {
// 测试删除
String deleteSql = "delete from employee where id = ?";
cd.delete(deleteSql, 3);
}
@Test
void testSelectString() throws SQLException {
// 测试查询表中所有数据
String selectSql = "select * from employee";
cd.select(selectSql);
}
@Test
void testSelectStringInt() throws SQLException {
// 测试带条件的查询(以按id查询为例,其他查询以此类推)
String selectSql1 = "select * from employee where id = ?";
cd.select(selectSql1,1);
}
}