PreparedStatement的增删改操作
1.首先我们要知道Statement是干什么的
create a statement object for senting SQL statement to the databases
意思就是:创建一个语句对象,用于向数据库发送SQL语句
简单来说就是用这个类来对数据库进行增删改查
2.为什么不用statement用preparedstatement,
主要有两点:
一:拼接串过于麻烦
二:SQL注入问题(可以自行百度)
所以我们用他的子接口来实现这个方法
3.什么是preparedstatement
an object that represents a precompiled SQL statement
大致意思为:表示预编译SQL语句的对象
4.我会根据讲三种方法来演示(我直接写函数,具体的自己在类中加载就行,以及customers这个表我已经插入进去了)
4.1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // 向customers表中添加一条记录 @Test public void testInsert() { Connection conn = null ; PreparedStatement ps = null ; try { // 1.读取配置文件中的4个基本信息 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream( "jdbc.properties" ); Properties pros = new Properties(); pros.load(is); String user = pros.getProperty( "user" ); String password = pros.getProperty( "password" ); String url = pros.getProperty( "url" ); String driverClass = pros.getProperty( "driverClass" ); // 2.加载驱动 Class.forName(driverClass); // 3.获取连接 conn = DriverManager.getConnection(url, user, password); // System.out.println(conn); //4.预编译sql语句,返回PreparedStatement的实例 String sql = "insert into customers(name,email,birth)values(?,?,?)" ; //?:占位符 ps = conn.prepareStatement(sql); //5.填充占位符 ps.setString( 1 , "哪吒" ); ps.setString( 2 , "nezha@gmail.com" ); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ); java.util.Date date = sdf.parse( "1000-01-01" ); ps.setDate( 3 , new Date(date.getTime())); //6.执行操作 ps.execute(); } catch (Exception e) { e.printStackTrace(); } finally { //7.资源的关闭 try { if (ps != null ) ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null ) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } |
这个里面我要说明一个点
就是ps.setDate这个方法他是在Java.util.Date不是SQL语句下的Date,所以要进行转换
4.2因为增删改的操作无非就是SQL语句的不同
链接数据库,关闭啥的方法都重复,所以我们考虑用一个类来封装
类中直接用两个方法,一个链接方法,一个关闭方法,直接调用方法就可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package com.atguigu3.util; import com.atguigu1.connection.ConnectionTest; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * * * */ public class JDBCUtils { public static Connection getConnection() throws ClassNotFoundException, IOException, SQLException { //1.读取配置文件中的4个基本信息 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream( "jdbc.properties" ); Properties pros = new Properties(); pros.load(is); String user = pros.getProperty( "user" ); String password = pros.getProperty( "password" ); String url = pros.getProperty( "url" ); String driverClass = pros.getProperty( "driver" ); //2.加载驱动 Class.forName(driverClass); //3.获取连接 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); return conn; } public static void closeResource(Connection conn, Statement ps){ try { if (ps != null ) ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null ) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } |
利用方法改良版增删改来啦!
//修改customers表的一条记录 @Test public void testUpdate(){ Connection conn = null; PreparedStatement ps = null; try { //1.获取数据库的连接 conn = JDBCUtils.getConnection(); //2.预编译sql语句,返回PreparedStatement的实例 String sql = "update customers set name = ? where id = ?"; ps = conn.prepareStatement(sql); //3.填充占位符 ps.setObject(1,"莫扎特"); ps.setObject(2, 18); //4.执行 ps.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ //5.资源的关闭 JDBCUtils.closeResource(conn, ps); } }
这不就少了很多,但是还可以减少!!
4.3 不清楚需要几个占位符?,所以可以用一个args直接代替即可,到时候一个for循环就可以解决
@Test public void TestCommonUpdate() { String sql = "delete from customers where id = ?"; update(sql,3); }
public void update(String sql,Object...args) { Connection conn = null; PreparedStatement ps = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length;i++) { ps.setObject(i+1,args[i]); } ps.execute(); } catch (ClassNotFoundException | SQLException | IOException e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn,ps); }
这几个关系是递进关系,得需要一个个搞明白才行
遇见问题(已解决):
1.Date的util下还是SQL语句下的Date的转换问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端