使用update语句的时候,需要通过JDBC实现update语句的执行,这个时候仍然通过PreparedStatement对象来使用,直接传入update语句,然后通过setObject传入占位符的值,最后通过executeUpdate()就可以执行这个update语句。
executeUpdate()返回值是int,代表符合条件的记录数量。

## 1. update
```#java
//update
try(Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)){
try(PreparedStatement ps = conn.prepareStatement("update students set name=? where id=?")){
ps.setObject(1, "Bob");
ps.setObject(2, 999);
ps.executeUpdate();
}
}
```
### 1.1 update修改示例 JdbcUpdate.java
```#java
package com.feiyangedu.sample.pop3;

import java.sql.*;

import java.util.ArrayList;

import java.util.List;

public class JdbcUpdate {

static final String JDBC_URL = "jdbc:mysql://localhost:13306/test0828?useSSL=false&characterEncoding=utf8&serverTimeZone=UTC";

static final String JDBC_USER="root";

static final String JDBC_PASSWORD = "123456";

public static  void main(String[] args) throws SQLException{
List<Student> students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
Student std = students.get(0);
std.classId = new Long(2);
std.name = "Alice";
std.gender = "F";
update(std);
System.out.println("--变更后--");
students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
} static void update(Student std) throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("update students set class_id=?,name=?,gender=? where id=?")){
ps.setObject(1, std.classId);
ps.setObject(2, std.name);
ps.setObject(3, std.gender);
ps.setObject(4, std.id);
int n = ps.executeUpdate();
System.out.println(n+"条记录发生变更.");
}
}
}
static List<Student> getAllStudents() throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("select * from students")){
ResultSet rs = ps.executeQuery();
List<Student> list = new ArrayList<>();
while(rs.next()){
Long id = rs.getLong("id");
Long classId = rs.getLong("class_id");
String name = rs.getString("name");
String gender = rs.getString("gender");
Student std = new Student(id,classId,name,gender);
list.add(std);
}
return list;
}
}
}
static Connection getConnection() throws SQLException {
return DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD);
}

}

<img src="https://img2018.cnblogs.com/blog/1418970/201909/1418970-20190901102130426-1636009720.png" width="500" />

##    2. delete语句是一样的
```#java
try(Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)){
try(PreparedStatement ps = conn.prepareStatement("delete from student where id=?")){
ps.setObject(1, 999);
int n = ps.executeUpdate(); //返回结果为删除记录的数量
}
}

2.1 delete示例JdbcDelete.java

package com.feiyangedu.sample.pop3;

import java.sql.*;
import java.util.ArrayList;
import java.util.List; public class JdbcDelete {
static final String JDBC_URL = "jdbc:mysql://localhost:13306/test0828?useSSL=false&characterEncoding=utf8&serverTimeZone=UTC";
static final String JDBC_USER="root";
static final String JDBC_PASSWORD = "123456";
public static void main(String[] args) throws SQLException{
List<Student> students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
long studentId = students.get(students.size()-1).id; //查找最后1条记录的id
delete(studentId);
System.out.println(studentId+"删除成功");
students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
}
static void delete(long studentId) throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("delete from students where id=?")){
ps.setObject(1, studentId);
ps.executeUpdate();
}
}
}
static List<Student> getAllStudents() throws SQLException {
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("select * from students")){
ResultSet rs = ps.executeQuery();
List<Student> list = new ArrayList<>();
while(rs.next()){
long id = rs.getLong("id");
long classId = rs.getLong("class_id");
String name = rs.getString("name");
String gender = rs.getString("gender");
Student std = new Student(id,classId,name,gender);
list.add(std);
}
return list;
}
}
}
static Connection getConnection() throws SQLException {
return DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD);
}
}

3. insert语句

3.1 单纯插入数据

    try(Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)){
try(PreparedStatement ps = conn.prepareStatement("insert into student(id, class_id, name, gender) values(?, ?, ?, ?)")){
ps.setObject(1, 999);
ps.setObject(2, 1);
ps.setObject(3, "Bob");
ps.setObject(4, "M");
int n = ps.executeUpdate();
}
}

3.2 插入后获自增的id

    try(Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)){
try(PreparedStatement ps = conn.prepareStatement("insert into students(class_id, name, gender) values (?, ? ,?)",Statement.RETURN_GENERATED_KEYS)){
//我们并没有指定id的值,而是由数据库自动生成。我们往往需要获取数据库自动生成主键的值。这就需要再调用preparedStatement的时候传入一个常量Statement.RETURN_GENERATED_KEYS,表示需要返回数据库生成的主键。在执行executeUpdate()方法以后,我们可以通过getGeneratedKeys()获取一个ResultKey对象。这个对象包含了数据库自动生成主键的值,因为我们只有1条插入的数据,因此获得第一条
ps.setObject(1, 1);
ps.setObject(2, "Bob");
ps.setObject(3, "M");
int n = ps.executeUpdate();
try(ResultSet rs = ps.getGeneratedKeys()){
if(rs.next()){
long id = rs.getLong(1);
}
}
}
}

3.3 insert示例代码 JdbcInsert.java

package com.feiyangedu.sample.pop3;

import java.sql.*;
import java.util.ArrayList;
import java.util.List; public class JdbcInsert {
static final String JDBC_URL = "jdbc:mysql://localhost:13306/test0828?useSSL=false&characterEncoding=utf8&serverTimeZone=UTC";
static final String JDBC_USER="root";
static final String JDBC_PASSWORD = "123456"; public static void main(String[] args) throws SQLException {
List<Student> students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
insertWithAutoGeneratedId(new Student(2,"Tim","M"));
insertWithId(new Student(999,2,"Bob","M"));
System.out.println("插入完成");
students = getAllStudents();
for(Student student:students){
System.out.println(student);
}
} static void insertWithId(Student std) throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("insert into students values (?, ?, ?, ?)")){
ps.setObject(1, std.id);
ps.setObject(2, std.classId);
ps.setObject(3, std.name);
ps.setObject(4, std.gender); int n = ps.executeUpdate();
System.out.println(n+"条记录被插入");
}
}
}
static void insertWithAutoGeneratedId(Student std) throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("insert into students(class_id, name, gender) values (?, ?, ?)",Statement.RETURN_GENERATED_KEYS)){ //需要返回数据库自动生成主键的值
ps.setObject(1, std.classId);
ps.setObject(2, std.name);
ps.setObject(3, std.gender);
int n = ps.executeUpdate();
System.out.println(n+"条记录被插入");
try(ResultSet rs = ps.getGeneratedKeys()){ //通过getGeneratedKeys()拿到主键
if(rs.next()){
long id = rs.getLong(1);
std.id = id;
}
}
}
}
}
static List<Student> getAllStudents() throws SQLException{
try(Connection conn = getConnection()){
try(PreparedStatement ps = conn.prepareStatement("select * from students")){
ResultSet rs = ps.executeQuery();
List<Student> list = new ArrayList<>();
while(rs.next()){
long id = rs.getLong("id");
long classId = rs.getLong("class_id");
String name = rs.getString("name");
String gender = rs.getString("gender");
Student std = new Student(id,classId,name,gender);
list.add(std);
}
return list;
}
}
}
static Connection getConnection() throws SQLException {
return DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD);
} }

4 JDBC更新总结

  • 使用PreparedStatement的executeUpdate()进行更新
  • 更新操作包括update, insert, delete语句
  • 更新结果是int

廖雪峰Java15JDBC编程-3JDBC接口-3JDBC更新的更多相关文章

  1. 廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池

    1. JDBC连接池 1.1 JDBC连接池简介 线程池可以复用一个线程,这样大量的小任务通过线程池的线程执行,就可以避免反复创建线程带来的开销. 同样JDBC可以复用一个JDBC连接 JDBC的连接 ...

  2. 廖雪峰Java15JDBC编程-3JDBC接口-4JDBC事务

    1 数据库事务:Transaction 1.1 定义 若干SQL语句构成的一个操作序列 要么全部执行成功 要么全部执行不成功 1.2 数据库事务具有ACID特性: Atomicity:原子性 一个事务 ...

  3. 廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介

    JDBC:Java DataBase Connectivity Java程序访问数据库的标准接口 使用Java程序访问数据库的时候,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接 ...

  4. 廖雪峰Java15JDBC编程-3JDBC接口-2JDBC查询

    我们可以使用JDBC查询来执行select语句. 1. Statement try(Connection conn = DriverManager.getConnection(JDBC_URL, JD ...

  5. 廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete

    1. INSERT用于向数据库的表中插入1条记录 insert into 表名 (字段1,字段2,...) values (数据1,数据2,数据3...) 示例 -- 如果表存在,就删除 drop t ...

  6. 廖雪峰Java15JDBC编程-2SQL入门-1SQL介绍

    1.SQL:结构化查询语言 Structured Query Language 针对关系数据库设计 各种数据库基本一致 允许用户通过SQL查询数据而不关心数据库底层存储结构 1.1 SQL使用: 可以 ...

  7. 廖雪峰Java15JDBC编程-1关系数据库基础-1关系数据库简介

    1.数据库 1.1 定义 数据库是按照数据结构来组合.存储和管理数据的软件. 1.2 数据库模型 数据库有层次模型.网状模型.关系模型三种模型. 2 关系数据库 关系数据库是建立在关系模型上的数据库, ...

  8. 廖雪峰Java6IO编程-1IO基础-1IO简介

    1.IO简介 IO是指Input/Output,即输入和输出: Input指从外部读取数据到内存,例如从磁盘读取,从网络读取. * 为什么要把数据读到内存才能处理这些数据呢? * 因为代码是在内存中运 ...

  9. 廖雪峰Java6IO编程-2input和output-1inputStream

    1.InputStream 1.1InputStream是所有输入流的超类: int read() * 读取下一个字节,并返回字节(0-255) * 如果已读到末尾,返回-1 * read()方法是阻 ...

随机推荐

  1. C#Object与XML文件或二进制文件之间的转化

    Object To Xml 文件 public static bool Serializer<T>(object obj, string path) { FileStream xmlfil ...

  2. 全面解析HTML5优缺点

    HTML5是当下最主流的网页标准,它的出现给在线应用和手机游戏开发者带来了不少新机会.基于HTML5,开发者可以制作自己的网络游戏,而这个游戏无 论你在PC.手机还是平板电脑上,无论你用Chrome. ...

  3. HDU 4325 离散化+树状数组 或者 不使用树状数组

    题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...

  4. LeetCode 67. Add Binary【个位补0,不必对齐】【easy】

    Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...

  5. Spring核心接口之InitializingBean

    一.InitializingBean接口说明 InitializingBean接口为bean提供了属性初始化后的处理方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在bea ...

  6. Ansible实现批量无密码登录

    如果机器多,假如有一百台服务器,每台服务器登录前都得先输入yes,使用交互式的方式下发公钥的话就很麻烦(ssh-copy-id). 第一次操作需要通过密码来操作服务器,所以配置文件需要把密码配置好 a ...

  7. .Net 动态编译(c# 脚本)

    1 用.NET提供的类动态编译代码字符串,生成DLL存于内存中,加载到程序域 2 用反射的方式调用这个DLL 将要被编译和执行的代码读入并以字符串方式保存声明CSharpCodeProvider对象实 ...

  8. [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏

    题目 题目大意 给你一个数列,每次给出\(r,a,b\),你要找到\(l\in [a,b]\)使得\([l,r-1]\)的异或和最小, 并且要修改\(r\)位置的数. 思考历程 当我看到这题的时候,已 ...

  9. chattr和lsattr命令,不能被删除、改名、设定链接关系,同时不能写入或新增内容

    chattr和lsattr命令详解 chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现.同样-D检查压缩文件中的错误的功能, ...

  10. STM32笔记——Power Controller(PWR)

    The device requires a 1.8 to 3.6 V operating voltage supply (VDD). An embedded linear voltage regula ...