JDBC的常见的问题

Java DataBase Connectivity

  1. JDBC简述

    规范!!!
    Sun公司制定的通过Java连接数据库规范标准,而且是要求数据库提供商解决连接和操作的问题!!!
    JDK
    java.sql
    javax.sql

    这里需要从数据库提供商官网下载对应的JAR包
    mysql-connector-java-5.1.47.jar
    这里推荐MySQL官网,后期使用maven来解决问题

  2. MySQL数据库连接需要的参数

    cmd > mysql -hlocalhost -uroot -p
    Enter password: 123456
    1. 确定连接的数据库是哪一个? MySQL
    2. 确定连接的数据库是在哪一个主机上, 数据库服务器的地址
    3. 连接当前数据库的用户名
    4. 对应用户名的密码

    JDBC的URL=协议名+子协议名+数据源名。
    a 协议名总是“jdbc”。
    b 子协议名由JDBC驱动程序的编写者决定。
    c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
    几种常见的数据库连接

    -------------------------------oracle------------------
    驱动:oracle.jdbc.driver.OracleDriver
    URL:jdbc:oracle:thin:@machine_name:port:dbname
    注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是1521

    -------------------------------mysql-------------------
    驱动:com.mysql.jdbc.Driver
    URL:jdbc:mysql://machine_name:port/dbname
    注:machine_name:数据库所在的机器的名称;
    port:端口号,默认3306

    ---------------------------SQL Server------------------
    驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
    URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=
    注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是1433

    --------------------------DB2--------------------------
    驱动:com.ibm.db2.jdbc.app.DB2Driver
    URL:jdbc:db2://<machine_name><:port>/dbname
    注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是5000

    目前适用于我们的URL是
    jdbc:mysql://localhost:3306/javaee1904?useSSL=true

    需要对应的用户名和密码

    需要在项目中导入第三方Jar包
    方式1:[不推荐]
    1. 在项目中新建文件夹lib
    2. 复制对应JAR 粘贴到lib目录下
    3. 在JAR包上鼠标右键 Add as library

    方式2: [推荐]
    1. 菜单栏 File -> Project Structure
    2. Project Settings -> Modules -> Dependecies -> +
    3. JARs or Directories
    4. 找到对应的JAR

  3. 借助于JDBC,Java程序连接MySQL数据库

    package com.qfedu.a_mysql;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;

    public class Dome1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    /*
    1. 加载驱动
    JDBC是Java规定规范,但是没有实现,要求数据库服务商提供对应的程序
    JDK中没有直接连接MySQL的能力,需要借助于 MySQL JDBC实现

          static {
             try {
                 DriverManager 是驱动管理类
                 registerDriver 注册驱动
                 new Driver() 创建的就是com.mysql.jdbc.Driver类对象
                 DriverManager.registerDriver(new Driver());
             } catch (SQLException var1) {
                 throw new RuntimeException("Can't register driver!");
             }
         }
         */
         Class.forName("com.mysql.jdbc.Driver");
    
         // 2. 准备URL
         String url = "jdbc:mysql://localhost:3306/javaee1904?useSSL=true";
    
         // 3. 准备用户名和密码
         String user = "root";
         String password = "123456";
    
         // 4. 借助于 DriverManager驱动管理类对象,获取数据库连接对象 Connection
         Connection connection = DriverManager.getConnection(url, user, password);
    
         System.out.println(connection);
    
         // 5. 关闭数据库连接
         connection.close();
     }
    

    }

  4. JDBC核心API

    java.sql.Driver 接口
    –| connect(String url, Properties prop);
    url: Java连接数据库的URL协议
    prop: Java连接数据库所需的属性,通常是保存在文件中,读取文件获取对应的内容。

    java.sql.DriverManager 类
    –| static registerDriver(java.sql.Driver driver);
    用于注册驱动的方法,需要的参数是java.sql.Driver接口的实现类对象。
    –| java.sql.Connection getConnection(String url, String user, String password);
    获取数据库连接对象的方法,需要的参数是
    url: JDBC连接数据库的协议URL
    user:连接数据库的用户名
    password: 对应用户名的密码

    java.sql.Connection 接口
    –| java.sql.Statement createStatement();
    获取数据库的搬运工对象,Statement只是把Java中的SQL语句,直接搬运到数据库中执行,该对象也
    是一个资源性质的对象。需要close
    –| java.sql.PreparedStatement PrepareStatement(String sql);
    获取数据库预处理搬运工对象,会将传入的SQL语句搬运到数据库中,预处理,能够提高效率和避免最
    基本的【SQL注入】,这也是一个资源性质的对象,需要close

    java.sql.Statement 接口
    –| int exeuteUpdate(String sql);
    执行传入的SQL语句,主要执行的SQL语句有 create insert update delete drop… 返回值是int
    类型,返回的数据是 affected rows 受到影响的行数
    –| java.sql.ResultSet exeuteQuery(String sql);
    执行传入的SQL语句,主要执行的就是select DQL语句,返回值是一个java.sql.ResultSet 查询结
    果集对象

    interface java.sql.PreparedStatement extends java.sql.Statment
    –| int exeuteUpdate();
    执行预处理的SQL语句,主要执行的SQL语句有 create insert update delete drop… 返回值是
    int类型,返回的数据是 affected rows 受到影响的行数
    –| java.sql.ResultSet exeuteQuery();
    执行预处理的SQL语句,主要执行的就是select DQL语句,返回值是一个java.sql.ResultSet 查询
    结果集对象
    –| setXXX(int index, Object obj);
    XXX 任意类型 最常用的是setObject
    index是下标位置,从1开始
    Obj 参数
    下午告诉你

    java.sql.ResultSet 接口
    ResultSet也是一个资源性质的数据,需要close
    –| boolean next(); ===> boolean hasNext();
    判断当前结果集中是否可以继续遍历下面的数据
    –| getXXX(int columeIndex);
    XXX可以表示任何数据类型,根据字段的下标位置获取对应字段的数据
    –| getXXX(String fieldName); 【常用 反射】
    xxx可以表示任何数据类型,这里是根据字段名获取对应的数据

  5. 使用JDBC Statement操作数据库

    create table work(
    id int primary key auto_increment,
    name varchar(30) not null ,
    age int not null ,
    info text not null
    );

5.1 TestAdd

@Test
public void testAdd() {
    Connection connection = null;
    Statement statement = null;
    try {
        // 1. 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 准备URL user password
        String url = "jdbc:mysql://localhost:3306/javaee1904?useSSL=true";
        String user = "root";
        String password = "123456";
        // 3. 获取数据库连接
        connection = DriverManager.getConnection(url, user, password);
        // 4. 准备SQL语句
        String sql = "insert into work(name, age, info) values('骚杰',  66, '生化核武器')";
        // 5. 获取Statement对象
        statement = connection.createStatement();
        // 6. 执行SQL语句。使用executeUpdate方法
        int affectedRows = statement.executeUpdate(sql);
        System.out.println(affectedRows);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

5.2 TestDelete

@Test
public void testDelete() {
    Connection connection = null;
    Statement statement = null;
    try {
        // 1. 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 准备URL user password
        String url = "jdbc:mysql://127.0.0.1:3306/javaee1904?useSSL
        String user = "root";
        String password = "123456";
        // 3. 获取数据库连接对象
        connection = DriverManager.getConnection(url, user, passwor
        // 4. 准备SQL语句
        String sql = "delete from work where id=3";
        // 5. 获取Statement对象
        statement = connection.createStatement();
        // 6. 执行SQL语句
        int i = statement.executeUpdate(sql);
        System.out.println(i);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

5.3 TestUpdate

@Test
public void testUpdate() {
    Connection connection = null;
    Statement statement = null;
    // 1.获取数据库连接对象
    connection = JdbcUtil.getConnection();
    // 2. 准备SQL语句
    String sql = "update work set name = '宝哥哥' where id = 4";
    try {
        // 3. 获取Statement 对象
        statement = connection.createStatement();
        // 4. 执行SQL语句
        int i = statement.executeUpdate(sql);
        System.out.println(i);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, statement);
    }
}

5.4 TestSelect

@Test
public void testSelect() {
    Statement statement = null;
    ResultSet resultSet = null;
    Connection connection = null;
    // 1. 获取数据库连接
    connection = JdbcUtil.getConnection();
    // 2. 准备SQL语句
    String sql = "select * from work";
    try {
        // 3. 获取Statement对象
        statement = connection.createStatement();
        // 4. 执行SQL语句,获取的数据时一个查询结果集对象ResultSet
        resultSet = statement.executeQuery(sql);
        ArrayList<Work> works = new ArrayList<>();
        // 5. 这里需要解析ResultSet结果集对象
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            String info = resultSet.getString("info");
            works.add(new Work(id, name, age, info));
        }
        for (Work work : works) {
            System.out.println(work);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, statement, resultSet);
    }
}
  1. 被逼无奈的封装

    package com.qfedu.util;

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;

    /**

    • JdbcUtil 工具类

      1. 自动完成驱动的加载
      1. 自动完成必要数据的处理
      1. 简化 getConnection方法,提供给开发者使用
      1. 完成统一 close方法
        */
        public class JdbcUtil {
        private static String url = null;
        private static String user = null;
        private static String password = null;
        private static String driverClass = null;

      // 使用static修饰的静态代码块特征,完成驱动的自动加载
      static {
      try {
      // 需要读取在项目目录src下的一个db.properties文件
      // 1. 创建一个Properties对象
      Properties properties = new Properties();
      // 2. 使用load方法,加载文件,需要参数是一个FileInputStream
      properties.load(new FileInputStream("./src/db.properties"));

           // 3. 从Properties对象中读取对应的属性
           url =  properties.getProperty("url");
           user = properties.getProperty("user");
           password = properties.getProperty("password");
           driverClass = properties.getProperty("driver");
      
           // 4. 加载驱动
           Class.forName(driverClass);
       } catch (IOException | ClassNotFoundException e) {
           e.printStackTrace();
       }
      

      }

      /**

      • 简化数据库连接对象java.sql.Connection的获取方式,static修饰的静态成员方法

      • 直接通过类名调用

      • @return java.sql.Connection Java连接数据库的对象
        */
        public static Connection getConnection() {
        Connection connection = null;
        try {
        connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
        e.printStackTrace();
        }

        return connection;
        }

      /**

      • 关数据库连接对象
      • @param connection 传入的是一个java.sql.Connection 数据库连接对象
        */
        public static void close(Connection connection) {
        close(connection, null, null);
        }

      /**

      • 关闭数据库连接对象和Statement SQL语句搬运工对象
      • @param connection java.sql.Connection 数据库连接对象
      • @param statement java.sql.Statement SQL搬运工对象
        */
        public static void close(Connection connection, Statement statement) {
        close(connection, statement, null);
        }

      /**

      • 关闭数据库连接对象,Statement SQL语句搬运工对象和ResultSet结果集对象

      • @param connection java.sql.Connection 数据库连接对象

      • @param statement java.sql.Statement SQL搬运工对象

      • @param resultSet java.sql.ResultSet 数据库查询结果集对象
        */
        public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (connection != null) {
        try {
        connection.close();
        } catch (SQLException e) {
        e.printStackTrace();
        }
        }

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

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

    db.properties 存放在项目src目录下

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/javaee1904?useSSL=true
    user=root
    password=123456

  2. Statement SQL注入隐患

    Statement是一个SQL语句的搬运工,没有判断SQL和预处理SQL的能力,容易导致SQL注入

  3. 使用JDBC,PreparedStatement 操作数据库 【重点】

8.1 TestAdd

@Test
public void testAdd() {
    Connection connection = JdbcUtil.getConnection();
    PreparedStatement preparedStatement = null;
    // 1. 准备SQL语句
    String sql = "insert  into work(name, age, info) values(?,?,?)";
    String name = "林妹妹";
    int age = 15;
    String info = "天上掉下个林妹妹";
    try {
        // 2.通过Connection 获取 PreparedStatement对象
        preparedStatement = connection.prepareStatement(sql);
        // 3. 设置参数
        preparedStatement.setObject(1, name);
        preparedStatement.setObject(2, age);
        preparedStatement.setObject(3, info);
        // 4. 执行SQL语句
        int i = preparedStatement.executeUpdate();
        System.out.println(i);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement);
    }
}

8.2 TestDelete

@Test
public void testDelete() {
    Connection connection = JdbcUtil.getConnection();
    PreparedStatement preparedStatement = null;
    String sql = "delete from work where id = ?";
    try {
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, 2);
        int i = preparedStatement.executeUpdate();
        System.out.println(i);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement);
    }
}

8.3 TestUpdate

@Test
public void testUpdate() {
    Connection connection = JdbcUtil.getConnection();
    PreparedStatement preparedStatement = null;
    String sql = "update work set name = ?, age = ?, info = ? where 
    try {
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, "老刘");
        preparedStatement.setObject(2, 17);
        preparedStatement.setObject(3, "航海中路彭于晏");
        preparedStatement.setObject(4, 1);
        int i = preparedStatement.executeUpdate();
        System.out.println(i);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement);
    }
}

8.4 TestSelectOne

@Test
public void selectOne() {
    ResultSet resultSet = null;
    PreparedStatement preparedStatement = null;
    Connection connection = JdbcUtil.getConnection();
    String sql = "select * from work where id = ?";
    try {
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, 1);
        resultSet = preparedStatement.executeQuery();
        Work work = null;
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            String info = resultSet.getString("info");
            work = new Work(id, name, age, info);
        }
        System.out.println(work);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement, resultSet);
    }
}

8.5 TestSelectAll

@Test
public void selectAll() {
    ResultSet resultSet = null;
    PreparedStatement preparedStatement = null;
    Connection connection = JdbcUtil.getConnection();
    String sql = "select * from work";
    try {
        preparedStatement = connection.prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
        ArrayList<Work> works = new ArrayList<>();
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            String info = resultSet.getString("info");
            works.add(new Work(id, name, age, info));
        }
        for (Work work : works) {
            System.out.println(work);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement, resultSet);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值