even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、概念

JDBC就是使用java语言操作关系型数据库的一套API, 全称:(Java DataBase Connectivity)Java数据库连接

本质:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则 ,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

 2、快速入门

package site.ieven;

import java.sql.*;

public class FirstJava {
    public static void main(String[] args) throws Exception {
        // 注册驱动(该行代码可以省略)
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "";

        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 获取执行sql的对象
        Statement stmt = conn.createStatement();
        // 定义sql语句
        String sql = "select * from info";
        // 执行sql语句
        ResultSet res = stmt.executeQuery(sql);

        // 处理返回的结果
        while (res.next()) {
            int id = res.getInt("id");
            int userId = res.getInt("user_id");
            String desc = res.getString("desc");

            System.out.println("id:" + id);
            System.out.println("userId:" + userId);
            System.out.println("desc:" + desc);
        }


        res.close();
        stmt.close();
        conn.close();
    }
}

注意:为了方便操作,需要创建一个模型类(属性与数据表的属性一致,添加get, set, toString等基本方法),把数据放到模型类中,并且可以定义一个ArrayList来存放数据 

3、api详解

DriverManager对象

DriverManager对象主要目前的两个功能,一个是注册Driver,在jdbc的代码如下

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

功能二:获取连接

// 获取连接
Connection conn = DriverManager.getConnection(url, username, password);

// 获取执行sql的对象
Statement stmt = conn.createStatement();

 dml操作: 目前update与delete, insert一样都是使用 executeUpdate进行操作

public class FirstJava {
    public static void main(String[] args) throws Exception {
        // 注册驱动(该行代码可以省略)
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "";

        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        // 获取执行sql的对象
        Statement stmt = conn.createStatement();

        long dt = new Date().getTime() / 1000;
        // 定义sql语句
        String sql = "INSERT INTO info(user_id, `desc`, create_time, update_time) VALUES (1, \"efg\", "+ dt +", "+ dt +")";
        // 执行sql语句
        int res = stmt.executeUpdate(sql);

        System.out.println(res);  // 执行成功后返回受影响的行数

        stmt.close();

        conn.close();

    }
}

 dql参看快速案例中的例子

 jdbc中的事务操作 

package site.ieven;

import java.sql.*;

public class FirstJava {
    public static void main(String[] args) throws Exception {
        // 注册驱动(该行代码可以省略)
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "";

        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        // 获取执行sql的对象
        Statement stmt = conn.createStatement();

        String sql1 = "UPDATE `info` SET `desc`='AAA' WHERE `id`=1";
        String sql2 = "UPDATE `info` SET `desc`='BBB' WHERE `id`=2";
        String sql3 = "UPDATE `info` SET `desc`='CCC' WHERE `id`=3";

        try{
            // 开启事务
            conn.setAutoCommit(false);

            int res1 = stmt.executeUpdate(sql1);
            int res2 = stmt.executeUpdate(sql2);
            int res3 = stmt.executeUpdate(sql3);

            System.out.println(res1);
            System.out.println(res2);
            System.out.println(res3);

            //提交事务
            conn.commit();
        }catch(Exception err) {
            conn.rollback();

            err.printStackTrace();

        }

        stmt.close();
        conn.close();
    }
}

3、API扩展

 preparedStatement: 预编译SQL语句并执行,预防SQL注入问题

注:SQL注入是通过操作输入来修改事先定义好的SQL语句, 用以达到执行代码对服务器进行攻击的方法

 

posted on 2020-08-21 13:07  even_blogs  阅读(119)  评论(0编辑  收藏  举报