JDBC基本操作

JDBC基本操作

create table user(
    id int primary key auto_increment,
    name varchar(50)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

JDBC概念

JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,定义了用来访问数据库的标准的Java类库

连接步骤

  • 加载驱动

  • 进行数据库连接

// 驱动
private static final String DRIVER = "com.mysql.jdbc.Driver";
// 地址
private static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
private static final String USER_NAME = "root";
// 密码
private static final String PSW = "123456";

/**
 *  获取连接
 */

public static Connection getConnection(){
  Connection conn = null;
  try {
    // 加载驱动
    Class.forName(DRIVER);
    // 数据库连接
    conn = DriverManager.getConnection(URL,USER_NAME,PSW);

  } catch (ClassNotFoundException e) {
    System.out.println("加载驱动失败,请检查是否引入Jar包或者驱动名称是否正确");
    throw new RuntimeException("加载驱动失败,请检查是否引入Jar包或者驱动名称是否正确",e);
  } catch (SQLException throwables) {
    System.out.println("连接数据库失败,请检查数据库地址,用户名,密码是否正确");
    throw new RuntimeException("连接数据库失败,请检查数据库地址,用户名,密码是否正确",throwables);
  }
  return conn;
}

/**
* 关闭连接
@param conn
*/

public static void close(Connection conn){
  if(conn != null){
    try {
      conn.close();
    } catch (SQLException throwables) {
      throwables.printStackTrace();
    }
  }
}

注意:为什么需要使用Class.forName()来加载数据库驱动

是因为在每个Driver中都包含有一个静态代码块,实际调用的是DriverManager.registerDriver(new Driver());方法

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

DriverManager

该类进行数据库驱动的管理,可以注册多个数据库驱动,根据url来动态的选择不同的数据库连接。

操作数据库

Statement接口

使用Statement接口来操作静态的SQL语句

executeUpdate方法
添加
/**
* 插入操作
@param sql
*/

public static void doInsert(String sql){
  Connection conn = getConnection();
  Statement statement = null;

  try {
    statement = conn.createStatement();
    int result = statement.executeUpdate(sql);
    System.out.println(sql+"执行成功,插入"+result+"条数据");
  } catch (SQLException e) {
    throw new RuntimeException("执行失败",e);
  } finally {
    if(statement != null){
      try {
        statement.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn);
  }
}
修改
/**
     * 修改操作
     * @param sql
     */

    public static void doUpdate(String sql){
        Connection conn = getConnection();
        Statement statement = null;

        try {
            statement = conn.createStatement();
            int result = statement.executeUpdate(sql);
            System.out.println(sql+"执行成功,修改"+result+"条数据");
        } catch (SQLException e) {
            throw new RuntimeException("执行失败",e);
        } finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
          close(conn);
        }
    }
删除
/**
     * 删除操作
     * @param sql
     */

    public static void doDelete(String sql){
        Connection conn = getConnection();
        Statement statement = null;

        try {
            statement = conn.createStatement();
            int result = statement.executeUpdate(sql);
            System.out.println(sql+"执行成功,删除"+result+"条数据");
        } catch (SQLException e) {
            throw new RuntimeException("执行失败",e);
        } finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
          close(conn);
        }
        
    }
PreparedStatement接口

该接口为Statement的子接口,属于预处理操作,可以传入带有占位符的SQL,然后再进行补充占位符,索引值从1开始。

可以有效地禁止SQL注入

executeUpdate方法
插入
public static void doPreparedInsert(String name){
  Connection conn = getConnection();
  PreparedStatement statement = null;

  try {
    String sql = "insert into user (name) values (?)";
    statement = conn.prepareStatement(sql);
    statement.setString(1,name);
    int result = statement.executeUpdate();
    System.out.println(sql+"执行成功,插入"+result+"条数据");
  } catch (SQLException e) {
    throw new RuntimeException("执行失败",e);
  } finally {
    if(statement != null){
      try {
        statement.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn);
  }
}

在创建preparedStatement对象时,有一个重载方法

// 第二个参数表示一个是否返回自增主键的一个biaoshi
// Statement.RETURN_GENERATED_KEYS
// Statement.NO_GENERATED_KEYS
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)

在使用该PreparedStatement执行插入操作时,可以使用statement.getGeneratedKeys()来返回一个新生成主键的ResultSet对象,结果集中只有一列GENERATED_KEY,存放的新生成的主键值

更新

与插入类似

删除

与插入类似

结果集

在查询数据时,返回的是一个二维的结果集,使用ResultSet来遍历结果集

public static void doQuery(){
  String sql = "select * from user";
  Connection conn = getConnection();
  PreparedStatement statement = null;
  ResultSet resultSet = null;
  try {
    statement = conn.prepareStatement(sql);
    resultSet = statement.executeQuery();
    // resultSet.next 方法  将光标向前移动一行,最初为第一行之前,第一次调用使得第一行为当前行
    while (resultSet.next()){
      int id = resultSet.getInt("id");
      String name = resultSet.getString("name");
      System.out.println("查询到id为"+id+",name为"+name+"的记录");
    }

  } catch (SQLException throwables) {
    throwables.printStackTrace();
  } finally {
    if(resultSet != null){
      try {
        resultSet.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn,statement);
  }
}

批量操作

public static void doBatchInsert(String sql){
  Connection conn = getConnection();
  PreparedStatement statement = null;
  try {
    statement = conn.prepareStatement(sql);
    for(int i = 0;i<1000;i++){
      statement.setString(1,"张三"+i);
      // 积攒sql
      statement.addBatch();
    }
    // 执行sql
    statement.executeBatch();
    // 清除积攒的sql
    statement.clearBatch();
  } catch (SQLException throwables) {
    throwables.printStackTrace();
  } finally {
    close(conn,statement);
  }

}

https://zhhll.icu/2020/java基础/JDBC/1.JDBC基本操作/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Java虚拟机-GC

深入理解Java虚拟机-GC 当需要排查各种内存溢出、内存泄漏时&#xff0c;当垃圾回收成为系统到达更高并发量的瓶颈时&#xff0c;我们必须对内存动态分配和内存回收技术这样的“自动化”技术采用必要的监控和调节。 Java堆和方法区&#xff1a;一个接口的多个实现类需要的内存…

element表格头部加入图标

首先看看效果 下面是代码 <el-table-column prop"integralBalance"><template slot"header" slot-scope"scope"><div style"display: flex;justify-content: center;align-items: center;">积分余额<i class&qu…

android APP使用指定网络上网的原理

【精选】Android app 指定网络发送数据包的实现与原理分析_bindprocesstonetwork-CSDN博客 补充&#xff1a; frameworks/base/core/java/android/net/ConnectivityManager.java 函数&#xff1a; bindProcessToNetwork 调用到了 NetworkUtils.bindProcessToNetwork 但是N…

Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7

获取 GPG 密钥失败&#xff1a;[Errno 14] curl#37 - “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7” 这个就是安装的时候会检查key这个可以再repo文件中关闭即可 $ vim /etc/yum.repos.d/epel.repo 文件内容如下&#xff1a; [epel]nameExtra Packages for…

苹果ios企业签名一个月多少钱?

苹果ios企业签名一个月的费用因签名类型、应用类型等因素而异。 在某些情况下&#xff0c;苹果ios企业签名一个月的费用可能在2000&#xff5e;3000元之间。但也有特殊行业&#xff0c;例如金融行业&#xff0c;其企业签名费用可能会高于这个价格。同时&#xff0c;一些苹果io…

【Android】Hilt比Android好在哪里

Hilt框架的功能和设计理念&#xff0c;和Dagger基本是完全一致的&#xff0c;Hilt也是完全在Dagger基础上进行开发的 但是Dagger的用法比较繁琐&#xff0c;Hilt主要是做了便用性上的改进&#xff0c;主要有以下点 提供常用Component&#xff0c;不用再为每个InjectTarget都创…

创建 Springboot 项目

前言 创建 Spring Boot 项目是很多Java开发人员入门的重要一步&#xff01; 欢迎来到本篇关于创建 Spring Boot 项目的博客&#xff01;Spring Boot作为一个快速、便捷的开发框架&#xff0c;为我们提供了简化和加速应用程序开发的利器。 在这个数字化时代&#xff0c;快速响…

C语言从入门到实战——数组和指针的强化练习题

数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot死信模式)

说明&#xff1a; 生产者P 往交换机X&#xff08;typedirect&#xff09;会发送两种消息&#xff1a;一、routingKeyXA的消息&#xff08;消息存活周期10s&#xff09;&#xff0c;被队列QA队列绑定入列&#xff1b;一、routingKeyXB的消息&#xff08;消息存活周期40s&#xf…

迪文科技工业串口屏(DMG10600C070-03WTC)更新程序烧录刷机

迪文科技工业串口屏(DMG10600C070-03WTC)更新程序烧录刷机 问题 使用SD卡上电烧录&#xff0c;SD卡文件路径如下&#xff1a; 烧录时&#xff0c;无法写入&#xff0c;成功烧录文件数为0 解决方法 格式化读卡器 格式化脚本 echo off %1 %2 ver|find "5.">…

Android 13.0 无源码app修改它的icon图标

1.概述 在13.0的系统产品rom定制化开发中,有些产品需要对Launcher3中桌面显示的app的icon做替换,如果没有源码的话更换会麻烦点,需要从pms解析app的时候, 可以替换掉app的icon图标就可以了,接下来就来实现相关的功能 2.无源码app修改它的icon图标的相关核心类 framework…

Debian 12 / Ubuntu 22.04 安装 Docker 以及 Docker Compose 教程

Debian 12 / Ubuntu 22.04 安装 Docker 以及 Docker Compose 教程 本文将指导如何在 Debian 12 和 Ubuntu 22.04 下安装 Docker 以及 Docker Compose。 PS&#xff1a;本文同时适用于 Debian 11 以及 Ubuntu 20.04 什么是 Docker&#xff1f; Docker 是一种容器化技术&#x…

工厂模式之工厂方法模式(常用)

工厂方法模式 简单工厂模式违背了开闭原则&#xff0c;而工厂方法模式则是简单工厂模式的进一步深化&#xff0c;其不像简单工厂模式通过一个工厂来完成所有对象的创建&#xff0c;而是通过不同的工厂来创建不同的对象&#xff0c;每个对象有对应的工厂创建。 定义&#xff…

git 把项目托管到码云

码云&#xff1a; 把项目托管到码云 1.注册并微活码云账号(https://gitee.com/] 2.牛成井前博 SSH公钥 (运行 ssh -t gitgitee.com 构测 SSH 公明是否有开成功) 3.创建率户的码人伦;库 4.把本地项口上传到码云对应的空白仓库中 第一&#xff1a;上传个新项目 cd existing_git_…

【Redis篇】简述Redis | 详解Redis命令

文章目录 &#x1f38d;什么是Redis&#x1f38d;Redis特点&#x1f38d;Redis应用场景&#x1f354;Windows安装Redis⭐启动Redis &#x1f33a;Redis数据类型&#x1f33a;Redis常用命令⭐字符串string操作命令⭐哈希hash操作命令⭐列表list操作命令⭐集合set操作命令⭐有序集…

C++实战学习笔记

文章目录 erase()uniquevector的insert()std::string::npos erase() &#xff08;1&#xff09;erase(pos,n); 删除从pos开始的n个字符&#xff0c;比如erase(0,1)就是删除第一个字符 &#xff08;2&#xff09;erase(position);删除position处的一个字符(position是个string类…

linux下流媒体压力测试工具的使用

前言 因为领导要求做linux的推拉流时服务器压力测试&#xff0c;于是在网上找了找。一顿操作下来&#xff0c;发现很多软件盗用一款名为srs-bench的开源软件。 该代码仓库有详细的使用说明&#xff0c;而且可以在issues中找到可能会遇到的问题的解决办法 需要下载该仓库的源…

RK3568开发板在工控工业物联网网关方面的应用

在数字化转型的浪潮中&#xff0c;工控物联网关产品扮演着重要的角色。这些产品通过连接工业设备和网络&#xff0c;为数据传输和分析提供了便利。而迅为RK3568核心板作为一款高性能的芯片&#xff0c;为工控物联网关产品的性能提升和功能扩展提供了强大的支持。 迅为RK3568核心…

postgres in (?,?) 和 =any(?) 用法/性能对比

刚刚回顾了一下 JDBC 操作 SQL Server 时如何传入列表参数&#xff0c;即如何给 in (?) 条件直接传入一个列表参数&#xff0c;然而本质上是不支持&#xff0c;最终不得不展开为 in (?, ?,...?) 针对每个元素单独设置参数&#xff0c;不定长的参数对于重用已编译 PreparedS…

Win10 删除文件需要管理员权限

按住Shift&#xff0c;在空白处点击右键&#xff0c;在此处打开PowerShell PowerShell rm -force E:\test\test.txt