IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【JDBC】-- PreparedStatement实现数据库增删改操作 -> 正文阅读

[大数据]【JDBC】-- PreparedStatement实现数据库增删改操作

连接数据库后,可对数据库操作,java.sql包中有3个接口分别定义了对数据库的调用的不同方式:

Statement:用于执行静态SQL语句并返回它所生成结果的对象。

PreparedStatement:SQL语句被预编译并存储在此对象中,可使用此对象多次高效执行该语句。

CallableStatement:用于执行SQL存储过程。

下面使用PreparedStatement完成数据库增删改操作。

不使用Statement的原因:1、存在拼串操作,繁琐

????????????????????????????????????????? 2、存在SQL注入问题


前提

准备配置文件jdbc.properties

此文件作用是保存连接数据库的基本信息如用户名、密码。

user=root
password=ad
url=jdbc:mysql://localhost:3306/jdbc
driverClass=com.mysql.cj.jdbc.Driver

?

一、“增”操作

1、实例化

后面需要将使用的资源关闭,先实例化并赋null,后面通过判断是否使用资源,再进行关闭。

    public static void testInsert(){
            Connection conn = null;//获取连接
            PreparedStatement ps = null;//预编译SQL实例
           

2、连接数据库

先读取配置文件连接数据库的基本信息;

然后创建一个Properties集合(保存配置文件内容),并加载配置文件;

用字符串将集合中相应的内容读取;

最后加载驱动,并使用前面实例化的对象conn获取连接。

 try {
                //读取配置文件基本信息
        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");
                //加载驱动
                Class.forName(driverClass);
                //获取连接
                conn = DriverManager.getConnection(url,user,password);
               

3、预编译sql语句、填充占位符、执行

成功连接数据库后,用字符串保存sql语句(其中的?是占位符);

用前面实例化的对象ps保存预编译sql语句;

然后通过调用ps相关方法填充占位符,第一个参数表示第几个"?",第二个参数表示值;

最后执行execute。

 //预编译sql语句,返回实例
                String sql = "insert into customers(name,email,birth)values(?,?,?)";
                ps = conn.prepareStatement(sql);
                //填充占位符
                ps.setString(1,"张修宇");
                ps.setString(2,"940107148@qq.com");

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//日期格式
                Date date = sdf.parse("2002-4-30");
                ps.setDate(3, new java.sql.Date(date.getTime()));

                //执行操作
                ps.execute();
            }
catch (Exception e){
                e.printStackTrace();
            }

4、关闭资源

最后需要将所使用的资源关闭。

finally {
                //资源关闭
                try {
                    if(ps != null)
                        ps.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
                try {
                    if(conn != null)
                        conn.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
        }
    }

二、优化“增”操作

由于前面的连接数据库操作在“删改”操作也使用,频繁使用,所以将连接数据库操作封装,如需使用直接调用。

创建一个软件包util,软件包下创建类JDBCUtils

类下封装连接数据库方法和关闭资源方法。

package util;
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 Exception{
        //读取配置文件基本信息
        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");
        //加载驱动
        Class.forName(driverClass);
        //获取连接
        Connection conn = DriverManager.getConnection(url,user,password);
        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();
        }
    }
}

三、“删”操作

实现原理如上,修改操作也类似。

1、实例化

    /**修改一条记录*/
    public static void testUpdate(){
        Connection conn = null;
        PreparedStatement ps = null;
      

2、连接数据库

  try {
            //获取数据库连接
            conn = JDBCUtils.getConnection();
          

3、预编译、填充占位符、执行

            //预编译
            String sql = "update customers set name = ? where id = ?";
            ps = conn.prepareStatement(sql);
            //填充占位符
            ps.setObject(1,"莫扎特");
            ps.setObject(2,18);
            //执行
            ps.execute();
        }

4、关闭资源。

catch (Exception e){
            e.printStackTrace();
        }finally {
            //资源关闭
            JDBCUtils.closeResource(conn,ps);
        }
    }

四、“增删改”通用方法

可以通过一个方法实现“增删改”操作,在不同情况传入不同参数;

与前面不同的是,需要传入sql语句、值参数。

1、定义方法、设置参数

将所用sql语句、值传入,args为可变形参,传入值对应sql语句中的"?"占位符;

 /**通用增删改操作*/
    public static void update(String sql,Object ...args){//args可变形参,占位符长度
       

2、实例化

 Connection conn = null;
 PreparedStatement ps = null;
       

?3、连接数据库

 try {
            //获取连接
            conn = JDBCUtils.getConnection();
           

4、预编译、填充占位符、执行

 //预编译
            ps = conn.prepareStatement(sql);
            //填充占位符
            for(int i = 0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }
            //执行
            ps.execute();
        }

5、关闭资源

catch (Exception e){
            e.printStackTrace();
        }finally {
            //资源关闭
            JDBCUtils.closeResource(conn,ps);
        }
    }

?

使用示例

    public static void testCommonUpdate(){
        //删除
        String sql = "delete from customers where id = ?";
        update(sql,3);

        //修改
        String sql1 = "update `order` set order_name = ? where order_id = ?";
        update(sql1,"DD","2");
    }

“查询”操作比前面的操作稍复杂,将在下篇文章讲解。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:37:17  更:2022-07-21 21:38:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:01:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码