day49 jdbc技术

一、概述

  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.执行SQLString 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.rhkb.cn/news/145585.html

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

相关文章

JJJ:添加开机自启动项

比如我希望一个截图软件能开机自启动: 1、打开任务管理器: 进入启动栏: 发现没有snipaste可以设置 2、win r, 输入 shell:startup 然后回弹出一个新的窗口,把截图软件的快捷方式放里头 这样snipaste就能开机自启动…

排序篇(三)----交换排序

排序篇(三)----交换排序 1.冒泡排序 基本思想: ​ 通过不断地比较相邻的元素,将较大的元素往后移动,从而实现排序的目的。 具体的步骤如下: 从待排序的数组中选择相邻的两个元素进行比较,如果前一个元素大于后一个元素&#…

【IDEA】maven项目添加模块时,webapp没有被标识,无法识别的解决方法

问题 新添加maven项目模块后,webapp目录未被标识,即没有小蓝点的图标显示。如下图 解决方法 点击“File”下的“Project Strucure”,在弹出的框中,选中“Modules”下的项目名称,也就是“demo1”,点击“…

ASUS华硕ZenBook 13灵耀U 2代U3300F笔记本UX333FN/FA原装出厂Win10系统工厂安装模式

系统自带所有驱动、出厂主题壁纸、系统属性华硕专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序 下载链接:https://pan.baidu.com/s/1dK0vMZMECPlT63Rb6-jeFg?pwdbym5 所需要工具:16G或以上的U盘(非必需) 文件格式:HDI,SWP,O…

FPGA设计时序约束二、输入延时与输出延时

目录 一、背景 二、set_input_delay 2.1 set_input_delay含义 2.2 set_input_delay参数说明 2.3 使用样例 三、set_output_delay 3.1 set_output_delay含义 3.2 set_output_delay参数说明 3.3 使用样例 四、样例工程 4.1 工程代码 4.2 时序报告 五、参考资料 一、…

整理mongodb文档:副本集二

个人博客 整理mongodb文档:副本集二 个人博客,求推荐,本片内容较为乱 文章概叙 本文章主要讲在MongoDB的副本集中的一些注意点,主要是如何对seconadry进行数据操作,以及对更新数据的一些介绍 查看当前节点 上一集讲了关于搭…

机器人制作开源方案 | 四轴飞行器

1. 概述 基于探索者搭建的模块化四轴飞行器研究平台,采用独特的设计方式,可实现在室内完成对四轴飞行器、无人机等运动控制的原理研究,以及学习飞行控制的原理知识。 2. 组装 请按照下图进行机架的组装。 整体图 请解压文末资料中的 /软件/Mi…

智能文字识别技术——AI赋能古彝文保护

前言 人工智能在古彝文古籍保护方面具有巨大的潜力和意义。通过数字化、自动化和智能化的手段,可以更好地保护和传承古彝文的文化遗产,促进彝族文化的传承和发展。 文章目录 前言一、古彝文是什么?1.1古彝文的背景1.2古彝文古籍保护背景 二、…

福利!这两款我自制的免费配色工具你领到了吗?

​前两天刚入职,还没干过啥活儿,就迎来了中秋3天国庆7天总共8天的假期,美滋滋。 在这么喜庆的日子里,我觉得大家应该也无心科研,所以不如给大家发点儿福利,继续乐呵乐呵。 当然,说是福利&…

【聊天系统的优化】RPC方式的优化

RPC方式的优化 聊天系统的中RPC的选择Jsonprotobufmsgpack 聊天系统的中RPC的选择 在RPC方式中,常用的三种方式:Json,protobuf,Msgback 设定一个简单的加和服务,客户端发送一个list给服务端,需要将list的…

API接口数据流转常见安全机制

01 什么是API? 百度百科给出了API的定义: API(应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

Vue以及整合ElementUI

初始化vue项目 #vue 脚手架使用 webpack 模板初始化一个 appname 项目 vue init webpack appname启动 vue 项目 #项目的 package.json 中有 scripts,代表我们能运行的命令 npm start npm run dev #启动项目 npm run build:将项目打包项目结构 运行流程…

el-menu 导航栏学习(1)

最简单的导航栏学习跳转实例效果: (1)index.js路由配置: import Vue from vue import Router from vue-router import NavMenuDemo from /components/NavMenuDemo import test1 from /components/test1 import test2 from /c…

Firefox 开发团队对 Vue 3 进行优化效果显著

Mozilla 官方博客近日发表文章《Faster Vue.js Execution in Firefox》,介绍了 Firefox 开发团队对 Vue 3 进行的优化。 文章写道,在使用 Speedometer 3 对 Firefox 进行基准测试时,他们发现 Vue.js test 的测试结果从 Vue 2 升级到 Vue 3 后…

MySQL单表查询与多表查询

目录 一、单表查询 ​编辑 1、显示所有职工的基本信息。 ​编辑2、查询所有职工所属部门的部门号,不显示重复的部门号。 ​编辑3、求出所有职工的人数。 4、列出最高工和最低工资。 ​编辑5、列出职工的平均工资和总工资。 ​编辑6、创建一个只有职…

【数据结构】队列实现+层序遍历详解+一些练题

欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言队列的实现层序遍历详解强化练习1.判断是不是完全二叉树求二叉树的最大深度 总结 前言 国庆到了,也要内卷一下,感…

ElasticSearch 同步数据变少了

一、前言 这几天对接ES遇到几个坑,我们将一张库存表同步到ES发现Docs Count和我们表中的数据对不上,需要加上Docs deleted才对得上,也不知道批量写入数据为什么有些数据就会成 Docs deleted。 二、ID和版本号 ES中每一个Document都有一个_…

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…

oracle-使用PLSQL工具自行修改用户密码

1、使用PLSQL工具,输入用户名和原密码登录,如下图 2、登录后,在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码,修改完成后单击”确认”,后退出PLSQL 4、重新打开PLSQL,使用新密码登…