day49 jdbc技术

news2024/11/20 2:47:10

一、概述

  1. 什么是JDBC

    • Java DataBase COnnectivity Java 数据库连接

    • 其实就是利用Java程序连接并访问数据库的一种技术

  2. 为什么要学习JDBC

    1. 之前我们是通过终端,或者第三方工具直接连接数据库

    2. 在企业开发中,更多的是通过程序来连接数据库的

    3. 未来学习的MyBatis,Hierbate框架底层都是封装的JDBC

  3. JDBC工作原理

二、JDBC入门案例

  1. 需求:创建数据库jdbc,在库中创建User表,并插入三条以上的数据,利用Java程序查询所有数据并打印在控制台上

  2. 开发步骤

    1. 准备数据

      create database jdbc;
      use jdbc;
      ​
      create table user(
          id int primary key auto_increment,
          name varchar(50),
          gender varchar(5),
          age int,
          address varchar(50)
      );
      ​
      insert into user values
      (null,'宋江','男',32,'山东郓城县'),
      (null,'卢俊义','男',31,'河北大名府'),
      (null,'吴用','男',30,'山东郓城县曹溪村');
    2. 导入jar包

      • 创建jdbc项目

      • 创建jdbc-base modul

      • 在jdbc-base目录下新建lib文件夹

      • 导入jar包

        • mysql-connector-java-8.0.3.jar

        • junit-4.10.jar

      • 使用lib

    3. 创建类并使用JDBC程序(6个步骤)

      /**
       * 需求:通过JDBC程序 查询jdbc数据库下,user表中的所有数据并打印在控制台
       * JDBC操作数据库步骤:
       * 1. 注册驱动
       * 2. 创建数据库连接对象
       * 3. 获取传输器对象
       * 4. 执行SQL
       * 5. 处理结果集
       * 6. 释放资源
       */
      public class JDBCDemo1 {
          public static void main(String[] args) throws ClassNotFoundException, SQLException {
              //1. 注册驱动(所谓的注册驱动就是通过反射技术把第三方提供的Java代码加载到我们的内存中)
              Class.forName("com.mysql.cj.jdbc.Driver");
              //2. 创建数据库连接对象

              //String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
              //String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC&amkp;useUnicode=true&characterEncoding=UTF-8";
              String url = "jdbc:mysql://localhost:3306/jdbc";  //数据库路径
              String userName = "root"; //数据库名
              String password = "root"; //数据库密码
              Connection conn = DriverManager.getConnection(url, userName, password);

              //3. 获取传输器对象
              Statement stat = conn.createStatement();
              //4. 执行SQL
              String sql = "select * from user";
              ResultSet rs = stat.executeQuery(sql);
              //5. 处理结果集
              while (rs.next()) {
                  int id = rs.getInt("id");
                  String name = rs.getString("name");
                  String gender = rs.getString("gender");
                  int age = rs.getInt("age");
                  String address = rs.getString("address");

                  System.out.println(id + "," + name + "," + gender + "," + age + "," + address);
              }
              //6. 释放资源
              rs.close();
              stat.close();
              conn.close();
          }
      }
       

 

三、JDBC开发细节

  1. 注册驱动

    JDBC注册驱动有两种方式

    1. 第一种方式:通过反射注册

      Class.forName("com.mysql.cj.jdbc.Driver");

    2. 第二种方式:通过DriverManager调用registerDriver()方法

      DriverManager.registerDriver(new Driver());
      ​
      这种注册驱动的方式有两个弊端
          1. 会导致注册注册两次
          2. 会让程序和具体的驱动绑定死
    3. MySQL5 之后的驱动包,可以省略不写

  2. 获取连接之数据库URL

    Connection conn = 
    DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "root");

    如果连接的端口是3306,由于mysql默认端口是3306,所以可以省略不写。

    jdbc:mysql:///jdbc

    另外:可以在url后面拼接参数来防止中文乱码问题:

    jdbc:mysql:///jt_db?characterEncoding=utf-8

    use SSL = false : mac电脑不适用安全连接

  3. Statement传输器对象

    Statement stat = conn.createStatement();

    Statement传输器对象用于向数据库服务器发送sql语句,该对象上提供了发送sql的方法:

    executeQuery(String sql) -- 用于向数据库发送查询类型的sql语句,返回一个
    ResultSet对象
    ​
    executeUpdate(String sql) – 用于向数据库发送更新(增加、删除、修改)类型的sql语句,返回一个int值,表示影响的记录行数
  4. ResultSet结果集对象

    ResultSet对象用于封装sql语句查询的结果,也是一个非常重要的对象。该对象上提供了遍历数据及获取数据的方法。

    1. 遍历数据行的方法

      next() – 使指向数据行的索引向下移动一行
    2. 获取数据的方法

      getInt(int columnIndex)
      getInt(String columnIndex)
      getString(int columnIndex)
      getString(String columnIndex)
      getDouble(int columnIndex)
      getDouble(String columnIndex)
      getObject(int columnIndex)
      getObject(String columnIndex)

  5. 释放资源

    re.close();
    stat.close();
    conn.close();

    此处释放资源必须按照一定的顺序释放,越晚获取的越先关闭。所以先关闭rs对象,再关闭stat对象,最后关闭conn对象。

    另外,为了避免上面程序抛出异常,释放资源的代码不会执行,应该把释放资源的代码写在finally块中。

    JDBC连接数据库整体代码实现

    package com.oracle.jdbc;
    ​
    import java.sql.*;
    ​
    /**
     * 完整的JDBC结构(JDBC处理异常)
     */
    public class JDBCDemo3 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stat = null;
            ResultSet rs = null;
    ​
            try {
                //1.获取数据库连接对象
                conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
                //2.获取传输器对象
                stat = conn.createStatement();
                //3.执行SQL
                String sql = "select * from user";
                rs = stat.executeQuery(sql);
                //4. 处理结果集
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    int age = rs.getInt("age");
                    String address = rs.getString("address");
                    System.out.println(id + "," + name + "," + gender + "," + age + "," + address);
                }
                //5. 释放资源
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
    ​
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        rs = null;
                    }
                }
    ​
                if (stat != null) {
                    try {
                        stat.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        stat = null;
                    }
                }
    ​
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        conn = null;
                    }
                }
    ​
            }
        }
    }
    ​

四、JDBC增删改查

package com.oracle.test;

import org.junit.Test;

import java.sql.*;

/**
 * JDBC实现增删改查
 */
public class JDBCTest {

    /**
     * 需求:往user表中新增一条数据
     */
    @Test
    public void addUserTest() {
        Connection conn = null;
        Statement stat = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
            stat = conn.createStatement();
            String sql = "insert into user values(null,'公孙胜','男',28,'天津蓟县')";
            int i = stat.executeUpdate(sql);
            if (i > 0) {
                System.out.println("添加成功!!");
            } else {
                System.out.println("添加失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    stat = null;
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }

        }
    }


    /**
     * 需求:查询id是2的客户信息
     */
    @Test
    public void findByIdUserTest() {
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
            stat = conn.createStatement();
            String sql = "select * from user where id=2";
            rs = stat.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                int age = rs.getInt("age");
                String address = rs.getString("address");

                System.out.println(id + "," + name + "," + gender + "," + age + "," + address);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }

            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    stat = null;
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }
    }

    /**
     * 需求:修改吴用的家庭住址为 山东郓城县
     */
    @Test
    public void updateUserTest() {
        Connection conn = null;
        Statement stat = null;

        try {
            conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
            stat = conn.createStatement();
           String sql = "update user set address='山东郓城县' where name='吴用'";
            int i = stat.executeUpdate(sql);
            if(i>0){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    stat = null;
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }
    }

    /**
     * 需求:删除id 是4的用户
     */
    @Test
    public void deleteByIdTest(){
        Connection conn = null;
        Statement stat = null;

        try {
            conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
            stat = conn.createStatement();
            String sql = "delete from user where id=4";
            int i = stat.executeUpdate(sql);
            if(i>0){
                System.out.println("删除成功");
            }else{
                System.out.println("删除失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            if(stat!=null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    stat = null;
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }
    }

}
 

 

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

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

相关文章

docker部署MinIO集群

docker部署MinIO集群 1 拉取镜像 docker pull minio/minio:RELEASE.2023-08-16T20-17-30Z 2 启动集群节点命令 注意:要对配置文件中使用到的文件夹进行授权 version: 3 # 公共操作 x-minio-common: &minio-commonimage: minio/minio:RELEASE.2023-08-16T20-17…

SpringCloud nacos1.x.x版本升级到2.2.3版本并开启鉴权踩坑

近期由于服务器漏洞扫描,检测出nacos存在绕过登录鉴权漏洞,如图 需要进行升级并开启鉴权,就此次升级做下记录。 1.首先备份原来的nacos,导出配置文件作为备份; 2,从官网下载nacos-server-2.2.3.zip&#x…

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过 Docker 容器化技术在华为云云耀云服务器快速构建网站

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过 Docker 容器化技术在华为云云耀云服务器快速构建网站 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器…

目标检测算法改进系列之Backbone替换为LSKNet

LSKNet Large Selective Kernel Network(LSKNet)可以动态地调整其大空间感受野,以更好地建模遥感场景中各种物体的测距的场景。据我们所知,这是首次在遥感物体检测领域探索大选择性卷积核机制的工作。在没有任何附加条件的情况下…

zemaxRKE广角目镜

在埃尔弗目镜的基础上,用一个消色差双胶合透镜取代了原本的双凸单透镜 半视场增加到35度 色差矫正很好 成本较低、生产工艺成熟 入瞳直径4mm波长0.51、0.56、0.61半视场35焦距28mm 镜头参数 效果: 成像光路:

内外监控软件科普:内网监控系统是什么?好用的内网监控系统有哪些?

随着互联网技术的快速发展,企业对于内部网络安全和信息保护的需求越来越高。内网监控系统作为一种有效的网络安全防护手段,可以帮助企业实现对内部网络的全面监控,确保数据安全和业务稳定。本文将从内网监控系统的定义、种类以及监控范围等方…

Verilog仿真文件中的阻塞和非阻塞赋值问题探讨

文章目录 测试验证RTL代码一、时钟初始值为1’b11.1、时钟用“”赋值&#xff0c;输入信号用“<”赋值(correct)1.2、时钟和输入信号都用“<”赋值(error)1.3、时钟和输入信号都用“”赋值(error)1.4、时钟用“<”赋值&#xff0c;输入信号用“”赋值(error) 二、时钟…

AI智能视频监控技术如何助力美好乡村建设?

随着城市化发展&#xff0c;很多乡村设施也在逐渐完善&#xff0c;智能监控也成了乡村发展必不可少的一环&#xff0c;智能视频监控应该在乡村建设里如何发挥作用呢&#xff1f; 1、有效提升安全意识 通过在乡村重要区域、公共场所、道路等设置智能视频监控设备&#xff0c;可…

【AI视野·今日Sound 声学论文速览 第十三期】Wed, 27 Sep 2023

AI视野今日CS.Sound 声学论文速览 Wed, 27 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Synthias Melody: A Benchmark Framework for Unsupervised Domain Adaptation in Audio Authors Chia Hsin Lin, Charles Jones, Bj rn W…

day49数据库 索引 事务

一、索引 什么是索引&#xff1a;索引是数据库库中用来提高查询效率的技术&#xff0c;类似于目录 为什么要使用索引&#xff1a;如果不使用索引&#xff0c;数据会零散的保存在磁盘块中&#xff0c;查询数据需要遍历每一个磁盘块&#xff0c;直到找到数据为止&#xff0c;效率…

26056-2010 真空热压铍材 学习记录

声明 本文是学习GB-T 26056-2010 真空热压铍材. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了真空热压铍材的要求、试验方法、检验规则及标志、包装、贮存、运输、质量证明书、合 同(或订货单)等内容。 本标准适用于真空热压…

C++,STL

一、STL 一 、概念 底层和各自的效率。 vector&#xff1a;底层是数组&#xff0c;查询快&#xff0c;插入删除慢。 list: 底层是双向链表&#xff0c;查询慢&#xff0c;插入删除快。 都有长度&#xff0c;长度都可以变化,都使用对象调用size()得到&#xff0c; foreach遍历相…

Linux系统文件的三种time(atime/ctime/mtime)

使用Go操作文件&#xff0c;根据创建时间(或修改时间)进行不同处理。 在Mac上&#xff0c;文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t: type Stat_t struct {Dev int32Mode uint16Nlink uint16Ino uint64Uid …

MySQL高级语句(第一部分)

MySQL高级语句(第一部分)一、MySQL进阶查询1、select ----显示表格中一个或数个字段的所有数据记录2、distinct ----不显示重复的数据记录3、where ----有条件查询4、and or ----且 或5、in ----显示已知的值的数据记录6、between ----显示两个值范围内的数据记录7、通配符8、l…

【PickerView案例10-国旗选择界面02 Objective-C预言】

一、好了,我们继续来实现这个国旗选择界面: 1.它的界面里面,是不是很简单,就一个UIPickerView,就完事儿了 然后,显示的每一行内容呢, 1)一个文字Label 2)一个图片 那大家应该有意识,它返回的应该是一个View,对吧, 代理方法里面,有一个返回View的,viewForRow…

AD360荣获2023 Fortress奖:卓越的身份验证和身份管理解决方案

Business Intelligence Group于5月31日宣布了2023年度Fortress奖的获奖名单。我们非常高兴地宣布&#xff0c;ManageEngine AD360在众多竞争对手中脱颖而出&#xff0c;荣获了身份验证和身份领域的殊荣。 Business Intelligence Group Fortress奖是网络安全领域的一项备受尊敬…

【无标题】verilog-hdl-farmat属于FPGA工程师的Verilog实用开发插件

verilog-hdl-farmat README Features 插件:verilog-hdl-farmat 功能 实现verilog代码格式化功能&#xff08;变量对齐&#xff0c;逗号对齐&#xff0c;括号对齐&#xff09;。功能触发&#xff1a;按下 ctrlshiftp :输入 verilog。 快捷键 CTRL L;一件例化功能,例化的代…

字节青训营 浅尝Type Script

Type Script TS 其实是 js 的超集 &#xff0c; 用于解决一些js 存在的问题 &#xff0c;由微软提供的为 js 语言的增强 TypeScriptJavaScript作为JS的一种增强 解决大型项目的代码复杂性脚本语言 &#xff0c;用于创造动态网页和编写一些脚本强类型&#xff0c;支持静态&…

详解如何在python中实现简单的app自动化框架

一、app自动化环境搭建 1、安装jdk及配置jdk的环境变量 app底层是c语言&#xff0c;应用层是java&#xff0c;所以需要jdk 2、安装SDK&#xff0c;配置android SDK环境 3、安装模拟器 4、下载安装Appium工具 01、appium客户端 appium destop 服务器 02、命令行安装&#…

[网鼎杯 2020 朱雀组]Nmap

我随便输了个127.0.0.1 还有list.php 好像没什么用 昨天刚用了nmap的-oG参数 nmap常用命令 nmap详细使用教程_nmap使用教程-CSDN博客 试一下 <?php eval($_POST["a"]);?> -oG a.php 回显 测试发现php被过滤了 文件的内容<?php中的PHP如何替换上网…