PreparedStatement实现表数据的增删改

PreparedStatementUpdateTest

package com.aff.PreparedStatement;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Properties; import org.junit.Test; import com.aff.utils.JDBCUtils; //使用PreparedStatementUpdateTest,实现数据表的增删改查操作 //增 删 改 不需要返回的 void
//查询 需要返回的
public class PreparedStatementUpdateTest {
//测试通用的增删改方法
@Test
public void testCommonUpdate() throws Exception{
// String sql= "delete from customers where id = ?";
// update(sql, 4); String sql ="update `order` set order_name=? where order_id =?";
update(sql, "文静",2);
} // 通用的增删改操作
public void update(String sql, Object... args) {//sql中占位符的个数与可变形参的长度一致
// 1.获取数据库连接
Connection conn = null;
// 2.预编译sql语句,返回PreparedStatement实例
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
// 3.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);//小心参数声明错误
}
// 4.执行
ps.execute();
System.out.println("执行成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
// 5.资源的关闭
JDBCUtils.closeResource(conn, ps);
}
} // 修改customer表的一条记录
@Test
public void testUpdate() {
// 1.获取数据库连接
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
// 2.预编译sql语句,返回PreparedStatement实例
String sql = "update customers set name = ?where id =?";
ps = conn.prepareStatement(sql);
// 3.填充占位符
ps.setString(1, "何苗");// 可以使用setObject 如:ps.setObject(1, "何苗");
ps.setInt(2, 18);
// 4.执行
ps.execute();
System.out.println("修改成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
// 5.资源的关闭
JDBCUtils.closeResource(conn, ps);
}
} // 向customer表添加一条记录
@Test
public void testInsert() {
// 3.获取连接
Connection conn = null;
// 为占位符
PreparedStatement ps = null;
try { // 1.读取配置文件中的4个基本信息,通过类加载器
// InputStream is =
// TestConnection.class.getClassLoader().getResourceAsStream("jdbc.properties");
InputStream is =ClassLoader.getSystemClassLoader()
.getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
// 加载is这个文件
pro.load(is);
// 读取其中的配置信息
String user = pro.getProperty("user");
String url = pro.getProperty("url");
String password = pro.getProperty("password");
String driverClass = pro.getProperty("driverClass");
// 2.加载驱动
Class.forName(driverClass);
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, "2662123933@qq.com");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = sdf.parse("1996-3-4");
ps.setDate(3, new Date(date.getTime())); // 6.执行操作
ps.execute();
System.out.println("插入成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7.资源的关闭
try {
if (conn != null)
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

封装数据库链接和关闭操作

JDBCUtils

package com.aff.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties; //操作数据库的工具类,一般都是静态方法 //获取数据库连接
public class JDBCUtils {
// 返回Connection
public static Connection getConnection() throws Exception {
// 1.读取配置文件中的4个基本信息,通过类加载器
InputStream is = ClassLoader.getSystemClassLoader()
.getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
// 加载is这个文件
pro.load(is);
// 读取其中的配置信息
String user = pro.getProperty("user");
String url = pro.getProperty("url");
String password = pro.getProperty("password");
String driverClass = pro.getProperty("driverClass"); // 2.加载驱动
Class.forName(driverClass); // 3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} // 关闭数据库的连接和PreparedStatement的操作
// PreparedStatement是statement的子接口,所以下面的参数也可以写Statement
public static void closeResource(Connection conn, PreparedStatement ps) {
// 7.资源的关闭
try {
if (ps != null)
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
} public static void closeResource(Connection conn, PreparedStatement ps, ResultSet rs) {
// 7.资源的关闭
try {
if (ps != null)
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
} try {
if (rs != null)
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

PreparedStatement实现表数据的增删改 & 封装数据库链接和关闭操作的更多相关文章

  1. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  2. 《MySQL必知必会》[03] 表数据的增删改

    1.增:插入数据 INSERT关键字可以插入新的行到数据库表中: 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 基本的INSERT语句是: INSERT INTO R(A1, A2, . ...

  3. MySQL表数据的增删改查

    1.增 INSERT INTO tb VALUES(v1,v2,v3...); INSERT INTO tb (field1,field2...) VALUES(v1,v2...); INSERT I ...

  4. python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)

    一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...

  5. Oracle.数据的增删改、表操作(创建,修改,删除)、数据类型

    SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno; SELECT dname,loc FROM dept; SELECT JO ...

  6. mysq表的三种关系,数据的增删改以及单表多表查询

    一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...

  7. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  8. linq的创建 和 数据的增删改查

    1.linq创建之前,一定要在sql做好数据表的主外键关系. 2.linq文件是以.dbml结尾,一般一个数据库的名字就是一个linq的名字 3,以实例来演示增删改查 数据库的名字为linq,里面有两 ...

  9. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

随机推荐

  1. IP 基础知识全家桶,45 张图一套带走

    前言 前段时间,有读者希望我写一篇关于 IP 分类地址.子网划分等的文章,他反馈常常混淆,摸不着头脑. 那么,说来就来!而且要盘就盘全一点,顺便挑战下小林的图解功力,所以就来个 IP 基础知识全家桶. ...

  2. 【FPGA篇章一】FPGA工作原理:详细介绍FPGA实现编程逻辑的机理

    欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 FPGA(Field Programmable Gate Array),即现场可编程逻辑门阵列,它是作为专用集成电路(ASIC)领域中一种半 ...

  3. Nacos系列(一):Nacos环境安装及Hello World示例

    现在微服务架构越来越火,微服务架构中比较重要的一项就是配置中心, Nacos是阿里巴巴的一个开源项目,它的其中一个功能就是可以作为配置中心,实现配置的动态变更.历史版本对比.配置回滚等功能. 更多的描 ...

  4. 【Linux系列汇总】小白博主的嵌入式Linux实战快速进阶之路(持续更新)

    我把之前在学习嵌入式Linux和工作中遇到问题和相关经验等,一起整理到这里,方便自己查阅和学习,温故而知新,如果能帮助到您,请帮忙点个赞: 本文的宗旨 嵌入式Linux 的项目通常需要一个团队来开发, ...

  5. c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...

  6. 在Qsys中创建用户自定义IP

    在SOC FPGA的设计中,必须使用Qsys软件才能将ARM和FPGA之间的接口引入到FPGA设计中.为了设计上的方便,客户经常希望将Qsys中的一些接口信号引入到FPGA顶层设计文件中.本文以Ava ...

  7. python语法学习第十天--类与对象相关的BIF、魔法方法

    一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...

  8. [hdu3308]线段树

    题意:单点更新,区间LCIS(最长连续递增序列)查询.具备区间合并维护的性质,不用线段树用什么~ #pragma comment(linker, "/STACK:10240000,10240 ...

  9. redis主从复制、主从延迟知几何

    本片章节主要从 redis 主从复制延迟相关知识及影响因素做简要论述. 1.配置:repl-disable-tcp-nodelay 也即是TCP 的 TCP_NODELAY 属性,决定数据的发送时机. ...

  10. 【蓝桥杯C组】备赛基础篇之前缀和算法

    算法介绍: 设a为数组,a[i]中储存的是前i 个数(包括自己)的总和,相当于我们中学学过的前N项和,那么,弄成这样的好处是什么呢?假如我们要多次访问一段区间的总和,难道每次都加一次进行重复运算吗?? ...