JDBC的学习(第四节:使用PreparedStatement接口实现增、删、改的操作)
程序员文章站
2022-03-29 19:39:06
...
本次的学习主要分为九个部分
第一节:JDBC的概述
第二节:JDBC连接数据库
第四节:使用PreparedStatement接口实现增、删、改的操作
第五节:Resultset结果集
第六节:处理大数据对象
第七节:使用CallableStatement接口调用存储过程
第八节:使用元数据分析数据库
第九节:JDBC的事务处理事务
下面是第三部分,其他部分可以通过上面的链接访问
4.**使用PreparedStatement接口实现增、删、改的操作 **
- PreparedStatement 接口引入 使用PreparedStatement接口实现增、删、改的操作
PreparedStatement 是 Statement 的子接口,属于预处理操作,与直接使用 Statement 不同的是,PreparedStatement
在操作时,是先在数据表中准备好了一条 SQL 语句,但是此 SQL 语句的具体内容暂时不设置,而是之后再进
行设置。
(现在开发一般用 PreparedStatement ,不用 Statement )- 使用 PreparedStatement 接口实现添加数据操作
- 使用 PreparedStatement 接口实现更新数据操作
- 使用 PreparedStatement 接口实现删除数据操作
老样子,先看一下jdk文档吧,红色区域圈的是这个方法使用的一个例子
看一下添加语句的代码,比较一下与上一章的不同在哪里
package chap4_sec02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import model.Book;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil = new DbUtil();
private static int addBook(Book book) throws Exception{
Connection con=null;
con=dbUtil.getCon();//获取连接
//数据添加的sql语句,然后挖四个坑,四个坑代表表中的四个属性
//这个做的就是预编译
String sql="insert into t_book values(null,?,?,?,?)";
PreparedStatement pstmt= con.prepareStatement(sql);
//下面是给四个坑填值
pstmt.setString(1, book.getBookName());
pstmt.setFloat(2, book.getPrice());
pstmt.setString(3, book.getAuthor());
pstmt.setInt(4, book.getBookTypeId());
//返回的值是执行sql语句之后得表受影响的数据的条数
int result=pstmt.executeUpdate();
dbUtil.close(pstmt, con);
return result;
}
public static void main(String[] args) {
//float数据类型必须加f,不加默认小数是double类型的
Book book=new Book("星火英语",42.3f,"李白",5);
try {
int result = addBook(book);
System.out.println("数据添加成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("数据添加失败!");
}
}
}
一定要注意一致性的问题,下面的1就代表第一个坑,必须要一一对应!!!
执行的效果
看一下数据库中的表
看一下我写的代码:简单的说一下
相同:
- 都要获取数据库的连接,并且获取的方法一样,都是得到con
- 都得关闭打开的两个东西,数据库连接和preparestatement(statement)
- 执行sql语句之后返回的结果与前面的statement一样,返回的都是受到影响的条(行)数,行这个字在这里其实用数据库语言写完整的数据库(创建,增删改查,事务)的时候,就能看到数据库下面写的受影响的条数
不同:
- sql语句中把变量替换成了问号,把变量从sql语句里面抽离出来了,在后面再添加
个人看法
- 第二种更适合Java,其中也有面向对象的思维,用第一种方法,很明显是面向过程的,
- 用第一种方法真的很容易写错,第二种方法写的我目前没错过
- 第二种方法的sql语句的书写的语法更像真正的sql语句,第一种方法写出来的感觉就乱了
下面就不写看法了,直接上删和改的部分的代码
===========================================================================================================
据库的数据的更新(修改)的代码
package chap4_sec03;
import java.sql.Connection;
import java.sql.PreparedStatement;
import model.Book;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil = new DbUtil();
private static int updateBook(Book book) throws Exception{
Connection con=null;
con=dbUtil.getCon();//获取连接
//数据更新的sql语句,然后挖五个坑,四个坑代表表中的四个属性
String sql="update t_book set bookName=?,price=?,author=?,bookTypeId=? where id=?";
PreparedStatement pstmt= con.prepareStatement(sql);
//下面是给五个坑填值
pstmt.setString(1, book.getBookName());
pstmt.setFloat(2, book.getPrice());
pstmt.setString(3, book.getAuthor());
pstmt.setInt(4, book.getBookTypeId());
//千万不要把第五条漏了,where语句后面跟的是条件
pstmt.setInt(5, book.getId());
//返回的值是执行sql语句之后得表受影响的数据的条数
int result=pstmt.executeUpdate();
//关闭数据库
dbUtil.close(pstmt, con);
return result;
}
public static void main(String[] args) {
//float数据类型必须加f,不加默认小数是double类型的
Book book=new Book(5,"星火英语2",52.3f,"李白",10);
try {
int result = updateBook(book);
System.out.println("数据更新成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("数据更新失败!");
}
}
}
看下效果
sql语句不一样了,然后注意,这里是五个“坑”,还要注意坑的顺序
上面把添加和更新的部分写完了,下面写的是删除
=========================================================================================================
老样子,还是删除部分的最简单 直接把主键(id) 传过去就行了,只需要一个坑
package chap4_sec04;
import java.sql.Connection;
import java.sql.PreparedStatement;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil=new DbUtil();
private static int deleteBook(int id)throws Exception{
Connection con=null;
con=dbUtil.getCon();
String sql="delete from t_book where id=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, id);
int result = pstmt.executeUpdate();
return result;
}
public static void main(String[] args) {
try {
int result=deleteBook(5);
System.out.println("数据删除成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("数据删除失败!");
}
}
}
看效果
通过上面的学习我们知道,其实第四节的方法和第三节的方法其实是差不多的,主要区别就是挖坑和填坑上面,记住一定要一一对应。