• 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.执行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;
                    }
                }
            }
        }

    }
     

     

  • 相关阅读:
    开发中常用的鉴权方案
    使用opencv的透视变换裁剪倾斜人脸
    java8新特性-lambda表达式 和 方法引用
    # 解析Pikachu靶场:一个安全研究的练习场
    基于STM32的物联网下智能化养鱼鱼缸控制控制系统
    Spring的处理器映射器与适配器的架构设计
    HyBird App(混合应用)核心原理JSBridge
    项目进度管理(3-2)项目时间估算方法总结
    哪吒汽车的技术发布会都发布了什么?纯干货抢先看
    服务器64GB内存、8核CPU的MySQL 8配置参数
  • 原文地址:https://blog.csdn.net/weixin_45939821/article/details/133364216