day49 jdbc技术

一、概述

  1. 什么是JDBC

    • Java DataBase COnnectivity Java 数据库连接

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

  2. 为什么要学习JDBC

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

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

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

  3. JDBC工作原理day49 jdbc技术_第1张图片

二、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;
                }
            }
        }
    }

}
 

 

你可能感兴趣的:(数据库)