您的位置:88bifa必发唯一官网 > 八八必发娱乐 > JDBC与数据库驱动的涉及八八必发娱乐:

JDBC与数据库驱动的涉及八八必发娱乐:

发布时间:2019-05-22 08:45编辑:八八必发娱乐浏览(131)

    一、JDBC常用类和接口

    JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

     

    JDBC与数据库驱动的关系:接口与实现类的关系。

     

    二、JDBC常用类和接口

    JDBC有关的类:都在java.sql 和 javax.sql 包下.

    接口在Java中是用来定义 `行为规范的`.   接口必须有实现类.

     

    JDBC规范(四个核心对象):

    DriverManager:用于注册驱动

    Connection: 表示与数据库创建的连接

    Statement: 操作数据库sql语句的对象

    ResultSet: 结果集或一张虚拟表

     

    特别注意:

    Mysql驱动8版本之后的driverClass 和url 的写法

    com.mysql.cj.jdbc.Driver

     

    jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8

     // JDBC 初体验
        @Test
     public void demo01() throws SQLException {
      // 1. 装载驱动
      DriverManager.registerDriver(new Driver());
      // 2. 建立连接
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
      // 3. 操作数据
      String sql = "select * from user;";
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery(sql);
      while (rs.next()) {
       int id = rs.getInt("id");
       String username = rs.getString("username");
       String password = rs.getString("password");
       String email = rs.getString("email");
       System.out.println(id   " : "   username   " : "   password   " : "   email);
      }
      // 4. 释放资源
      rs.close();
      stmt.close();
      conn.close();
     }
    

     

     

     

     

     

     

     

     

     

    1

    // JDBC 初体验
    

    2

        @Test
    

    3

    public void demo01() throws SQLException {
    

    4

    // 1. 装载驱动
    

    5

    DriverManager.registerDriver(new Driver());
    

    6

    // 2. 建立连接
    

    7

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

    8

    // 3. 操作数据
    

    9

    String sql = "select * from user;";
    

    10

    Statement stmt = conn.createStatement();
    

    11

    ResultSet rs = stmt.executeQuery(sql);
    

    12

    while (rs.next()) {
    

    13

    int id = rs.getInt("id");
    

    14

    String username = rs.getString("username");
    

    15

    String password = rs.getString("password");
    

    16

    String email = rs.getString("email");
    

    17

    System.out.println(id   " : "   username   " : "   password   " : "   email);
    

    18

    }
    

    19

    // 4. 释放资源
    

    20

    rs.close();
    

    21

    stmt.close();
    

    22

    conn.close();
    

    23

    }
    

    24

     

     

     

    JDBC工具类的提取()

     

    方式一、

    --src下放连接数据库的配置文件

        |--properties

     // 配置文件的名字     jdbc.properties
    
    #mysql
    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
    user=root
    password=111
    

     

     

     

    1

     

     

     

     

     

    1

     // 配置文件的名字     jdbc.properties
    

    2

    3

    #mysql
    

    4

    driverClass=com.mysql.jdbc.Driver
    

    5

    url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
    

    6

    user=root
    

    7

    password=111
    

    8

     

     

    --util包

        |--JDBCUtils 类   

        |

    public class JDBCUtils {
    
     // 属性
     private static String driverClass;
     private static String url;
     private static String username;
     private static String password;
    
     //  什么时候加载外部配置文件最合适 ???   
     // 特点1 : 随着类的加载而加载.
     // 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
     static {
      Properties prop = new Properties();
    
      try {
       prop.load(new FileReader("jdbc.properties"));
    
       // 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
       driverClass = prop.getProperty("driverClass");
       url = prop.getProperty("url");
       username = prop.getProperty("username");
       password = prop.getProperty("password");
    
       // 直接执行加载驱动
       loadDriver();
    
      } catch (IOException e) {
       e.printStackTrace();
       throw new RuntimeException("文件资源加载失败!");
      }
     }
    
     // 加载驱动
     public static void loadDriver() {
      try {
       // 1. 加载驱动
       Class.forName(driverClass);
      } catch (ClassNotFoundException e) {
       // e.printStackTrace();
       // 驱动加载失败!
       throw new RuntimeException("驱动加载失败!");
      }
     }
    
     // 建立连接
     public static Connection getConnection() throws SQLException {
      // 2. 建立连接
      return DriverManager.getConnection(url, username, password);
     }
    
     // 释放资源
     public static void release(Connection conn, Statement stmt, ResultSet rs) {
      // 4. 释放资源
      if (rs != null) {
       try {
        rs.close();
       } catch (SQLException e) {
        e.printStackTrace();
       }
       // 将 rs 清空
       rs = null;
      }
      // 直接调用
      release(conn, stmt);
     }
     public static void release(Connection conn, Statement stmt) {
      // 4. 释放资源
      if (stmt != null) {
       try {
        stmt.close();
       } catch (SQLException e) {
        e.printStackTrace();
       }
       stmt = null;
      }
      if (conn != null) {
       try {
        conn.close();
       } catch (SQLException e) {
        e.printStackTrace();
       }
       conn = null;
      }
     }
    }
    

     

     

     

     

     

     

     

     

     

    1

    public class JDBCUtils {
    

    2

    3

    // 属性
    

    4

    private static String driverClass;
    

    5

    private static String url;
    

    6

    private static String username;
    

    7

    private static String password;
    

    8

    9

    //  什么时候加载外部配置文件最合适 ???   
    

    10

    // 特点1 : 随着类的加载而加载.
    

    11

    // 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
    

    12

    static {
    

    13

    Properties prop = new Properties();
    

    14

    15

    try {
    

    16

    prop.load(new FileReader("jdbc.properties"));
    

    17

    18

    // 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
    

    19

    driverClass = prop.getProperty("driverClass");
    

    20

    url = prop.getProperty("url");
    

    21

    username = prop.getProperty("username");
    

    22

    password = prop.getProperty("password");
    

    23

    24

    // 直接执行加载驱动
    

    25

    loadDriver();
    

    26

    27

    } catch (IOException e) {
    

    28

    e.printStackTrace();
    

    29

    throw new RuntimeException("文件资源加载失败!");
    

    30

    }
    

    31

    }
    

    32

    33

    // 加载驱动
    

    34

    public static void loadDriver() {
    

    35

    try {
    

    36

    // 1. 加载驱动
    

    37

    Class.forName(driverClass);
    

    38

    } catch (ClassNotFoundException e) {
    

    39

    // e.printStackTrace();
    

    40

    // 驱动加载失败!
    

    41

    throw new RuntimeException("驱动加载失败!");
    

    42

    }
    

    43

    }
    

    44

    45

    // 建立连接
    

    46

    public static Connection getConnection() throws SQLException {
    

    47

    // 2. 建立连接
    

    48

    return DriverManager.getConnection(url, username, password);
    

    49

    }
    

    50

    51

    // 释放资源
    

    52

    public static void release(Connection conn, Statement stmt, ResultSet rs) {
    

    53

    // 4. 释放资源
    

    54

    if (rs != null) {
    

    55

    try {
    

    56

    rs.close();
    

    57

    } catch (SQLException e) {
    

    58

    e.printStackTrace();
    

    59

    }
    

    60

    // 将 rs 清空
    

    61

    rs = null;
    

    62

    }
    

    63

    // 直接调用
    

    64

    release(conn, stmt);
    

    65

    }
    

    66

    public static void release(Connection conn, Statement stmt) {
    

    67

    // 4. 释放资源
    

    68

    if (stmt != null) {
    

    69

    try {
    

    70

    stmt.close();
    

    71

    } catch (SQLException e) {
    

    72

    e.printStackTrace();
    

    73

    }
    

    74

    stmt = null;
    

    75

    }
    

    76

    if (conn != null) {
    

    77

    try {
    

    78

    conn.close();
    

    79

    } catch (SQLException e) {
    

    80

    e.printStackTrace();
    

    81

    }
    

    82

    conn = null;
    

    83

    }
    

    84

    }
    

    85

    }
    

    86

     

     

     @Test
     public void test_update() {
      Connection conn = null;
      Statement stmt = null;
      try {
       // 2. 建立连接
       conn = JDBCUtils.getConnection();
       // 3. 操作数据
       String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
       stmt = conn.createStatement();
       int affectedRowNum = stmt.executeUpdate(sql);
       System.out.println(affectedRowNum);
      } catch (SQLException e) {
       e.printStackTrace();
      } finally {
       // 4. 释放资源
       JDBCUtils.release(conn, stmt);
      }
     }
    
     @Test
     public void test_delete() {
      Connection conn = null;
      Statement stmt = null;
    
      try {
       // 1. 建立连接
       conn = JDBCUtils.getConnection();
       // 2. 操作数据
       String sql = "delete from user where id = 5;";
       stmt = conn.createStatement();
       int affectedRowNum = stmt.executeUpdate(sql);
       System.out.println(affectedRowNum);
      } catch (SQLException e) {
       e.printStackTrace();
      } finally {
       // 4. 释放资源
       JDBCUtils.release(conn, stmt);
      }
     }
    
     @Test
     public void test_insert() {
    
      Connection conn = null;
      Statement stmt = null;
      try {
       // 1. 建立连接
       conn = JDBCUtils.getConnection();
       // 2. 操作数据
       String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
       stmt = conn.createStatement();
       int affectedRowNumber = stmt.executeUpdate(sql);
       System.out.println(affectedRowNumber);
      } catch (SQLException e) {
       e.printStackTrace();
      } finally {
       // 4. 释放资源
       JDBCUtils.release(conn, stmt);
      }
     }
    
    
    // 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
    // 解决SQL注入:使用PreparedStatement 取代 Statement 
    // PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
    // select * from user where username = ? and password = ? ;
    // 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
    // PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 
    
    
    
      /************ JDBC 数据库连接操作 ***************/
      Connection conn = null;
      PreparedStatement stmt = null;
      ResultSet rs = null;
    
      try {
       // 1. 建立连接
       conn = JDBCUtils.getConnection();
       // 2. 操作数据
       String sql = "select * from user where username = ? and password = ?;";
       stmt = conn.prepareStatement(sql);
       // 设置sql语句的参数
       stmt.setString(1, username);
       stmt.setString(2, password);
       // 执行sql语句
       rs = stmt.executeQuery();
       // 判断返回的结果
       if (rs.next()) {
        // 登录成功
        int id = rs.getInt("id");
        String u_name = rs.getString("username");
        String u_pwd = rs.getString("password");
        String email = rs.getString("email");
        System.out.println(id   " : "   u_name   " : "   u_pwd   " : "   email);
        System.out.println("登录成功!");
       } else {
        // 登录失败
        System.out.println("登录失败! 用户名或密码错误!");
       }
      } catch (SQLException e) {
       e.printStackTrace();
      } finally {
       // 3. 释放资源
       JDBCUtils.release(conn, stmt, rs);
      }
     }
    }
    

     

     

     

    x
    

    110

     

     

     

     

     

    1

    @Test
    

    2

    public void test_update() {
    

    3

    Connection conn = null;
    

    4

    Statement stmt = null;
    

    5

    try {
    

    6

    // 2. 建立连接
    

    7

    conn = JDBCUtils.getConnection();
    

    8

    // 3. 操作数据
    

    9

    String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
    

    10

    stmt = conn.createStatement();
    

    11

    int affectedRowNum = stmt.executeUpdate(sql);
    

    12

    System.out.println(affectedRowNum);
    

    13

    } catch (SQLException e) {
    

    14

    e.printStackTrace();
    

    15

    } finally {
    

    16

    // 4. 释放资源
    

    17

    JDBCUtils.release(conn, stmt);
    

    18

    }
    

    19

    }
    

    20

    21

    @Test
    

    22

    public void test_delete() {
    

    23

    Connection conn = null;
    

    24

    Statement stmt = null;
    

    25

    26

    try {
    

    27

    // 1. 建立连接
    

    28

    conn = JDBCUtils.getConnection();
    

    29

    // 2. 操作数据
    

    30

    String sql = "delete from user where id = 5;";
    

    31

    stmt = conn.createStatement();
    

    32

    int affectedRowNum = stmt.executeUpdate(sql);
    

    33

    System.out.println(affectedRowNum);
    

    34

    } catch (SQLException e) {
    

    35

    e.printStackTrace();
    

    36

    } finally {
    

    37

    // 4. 释放资源
    

    38

    JDBCUtils.release(conn, stmt);
    

    39

    }
    

    40

    }
    

    41

    42

    @Test
    

    43

    public void test_insert() {
    

    44

    45

    Connection conn = null;
    

    46

    Statement stmt = null;
    

    47

    try {
    

    48

    // 1. 建立连接
    

    49

    conn = JDBCUtils.getConnection();
    

    50

    // 2. 操作数据
    

    51

    String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
    

    52

    stmt = conn.createStatement();
    

    53

    int affectedRowNumber = stmt.executeUpdate(sql);
    

    54

    System.out.println(affectedRowNumber);
    

    55

    } catch (SQLException e) {
    

    56

    e.printStackTrace();
    

    57

    } finally {
    

    58

    // 4. 释放资源
    

    59

    JDBCUtils.release(conn, stmt);
    

    60

    }
    

    61

    }
    

    62

    63

    64

    // 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
    

    65

    // 解决SQL注入:使用PreparedStatement 取代 Statement 
    

    66

    // PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
    

    67

    // select * from user where username = ? and password = ? ;
    

    68

    // 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
    

    69

    // PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 
    

    70

    71

    72

    73

    /************ JDBC 数据库连接操作 ***************/
    

    74

    Connection conn = null;
    

    75

    PreparedStatement stmt = null;
    

    76

    ResultSet rs = null;
    

    77

    78

    try {
    

    79

    // 1. 建立连接
    

    80

    conn = JDBCUtils.getConnection();
    

    81

    // 2. 操作数据
    

    82

    String sql = "select * from user where username = ? and password = ?;";
    

    83

    stmt = conn.prepareStatement(sql);
    

    84

    // 设置sql语句的参数
    

    85

    stmt.setString(1, username);
    

    86

    stmt.setString(2, password);
    

    87

    // 执行sql语句
    

    88

    rs = stmt.executeQuery();
    

    89

    // 判断返回的结果
    

    90

    if (rs.next()) {
    

    91

    // 登录成功
    

    92

    int id = rs.getInt("id");
    

    93

    String u_name = rs.getString("username");
    

    94

    String u_pwd = rs.getString("password");
    

    95

    String email = rs.getString("email");
    

    96

    System.out.println(id   " : "   u_name   " : "   u_pwd   " : "   email);
    

    97

    System.out.println("登录成功!");
    

    98

    } else {
    

    99

    // 登录失败
    

    100

    System.out.println("登录失败! 用户名或密码错误!");
    

    101

    }
    

    102

    } catch (SQLException e) {
    

    103

    e.printStackTrace();
    

    104

    } finally {
    

    105

    // 3. 释放资源
    

    106

    JDBCUtils.release(conn, stmt, rs);
    

    107

    }
    

    108

    }
    

    109

    }
    

    110

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

     

     

     

     

    来自为知笔记(Wiz)

    本文由88bifa必发唯一官网发布于八八必发娱乐,转载请注明出处:JDBC与数据库驱动的涉及八八必发娱乐:

    关键词: 八八必发娱乐

上一篇:JDK1.8新特性

下一篇:没有了