IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Day04—详细总结JDBC -> 正文阅读

[大数据]Day04—详细总结JDBC

一:固定的步骤

//1:注册驱动(需要有驱动包)

//2:获取连接

//3:准备sql

//4:创建sql发送器 即 操作sql的对象

//5:sql执行

//6:获取数据并展示

//7:关闭资源

注意

使用jdbc 主要是进行 DML 操作 对数据的增删改查

?演示的表:

?二:statement 语句

2.1:增删改

@Test
    public void test01() throws SQLException {
        //1:注册驱动(需要有驱动包) (也可以不用写 默认会自动加载)
//        Class.forName("com.mysql.jdbc.Driver");
        DriverManager.registerDriver(new Driver());

        //2:获取连接
        String url = "jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8";
        String name = "root";
        String password = "123456";


        try (Connection connection = DriverManager.getConnection(url, name, password);
             //4:创建sql发送器 即 操作sql的对象
             Statement statement = connection.createStatement();
        ) {
            //3:准备sql
        /* insert into users values(4,"zbb","123456","赵冰冰");

        update users set name = "gbb" and nickName = "郭冰冰" where id = 4;

        delete from users where id = 4;*/
//            String sql = "insert into users values(4,\"zbb\",\"123456\",\"赵冰冰\")";
            String sql = "delete from users where id = 4";
            //5:sql执行
            int i = statement.executeUpdate(sql);


            //6:获取数据并展示
            System.out.println("i = " + i);

            //7:关闭资源使用 try - with -resource  资源可以自动关闭


        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

2.2:查

1.查询一条记录
??? 将一条记录封装为对象

2.查询多条记录
??? 使用集合存储多个对象
?? 注意:
????? 1. 当sql 中出现别名时? 在获取结果集数据时? 使用 名字获取数据时 注意是使用别名
??????? String sql = "select id, username uname ,password, nickname from user";
??????? String username = resultSet.getString("uname");

????? 2.在获取数据时 获取数据的方式 有四种
??????? get数据类型(字段的下标); 下标从1开始
??????? get数据类型(别名);

??????? getObject(字段的下标);
??????? getObject(别名);

?

@Test
    public void test02() {

        //2:获取连接
        String url = "jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8";
        String name = "root";
        String password = "123456";


        try (Connection connection = DriverManager.getConnection(url, name, password);
             //4:创建sql发送器 即 操作sql的对象
             Statement statement = connection.createStatement();
        ) {

            //String sql = "select * from users where id = 3";
            String sql = "select * from users";
            //5:sql执行
            ResultSet resultSet = statement.executeQuery(sql);
            //6:获取数据并展示
            ArrayList<User> list = new ArrayList<>();
            while (resultSet.next()) {
                Object id = resultSet.getObject(1);
                Object name1 = resultSet.getObject(2);
                Object pwd = resultSet.getObject(3);
                Object nickName = resultSet.getObject(4);

                //直接打印
                //System.out.println("id = " + id + ",name = " + name1 + ",password = " + pwd + " ,nickName =" + nickName);
                Integer id1 = (Integer)id;
                String name2 = (String)name1;
                String password2 = (String)pwd;
                String nickName2 = (String)nickName;
                User user = new User(id1,name2,password2,nickName2);
                //封装成一个实体类进行打印
               // System.out.println("user = " + user);
                list.add(user);


            }
            //打印表中所有数据
            list.forEach(System.out::println);


            //7:关闭资源使用 try - with -resource  资源可以自动关闭
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

封装成实体类:

public class User {
    private Integer id;
    private String name;
    private String password;
    private String nickName;

    public User() {
    }

    public User(Integer id, String name, String password, String nickName) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.nickName = nickName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

2.3:statement对象的弊端

使用 statment 容易出现的问题:
??? 1. sql拼接? 比较麻烦

??? 2.sql拼接 有sql注入问题
???????????? 输入的数据不满足sql的校验 依然可以获取所有的数据

?2.4:sql注入演示

 @Test
    public void test03() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name3 = scanner.nextLine();
//        System.out.println("请输入密码");
//        String password = scanner.nextLine();

        //2:获取连接
        String url = "jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8";
        String name = "root";
        String password = "123456";


        try (Connection connection = DriverManager.getConnection(url, name, password);
             //4:创建sql发送器 即 操作sql的对象
             Statement statement = connection.createStatement();
        ) {

            //String sql = "select * from users where id = 3";
//            String sql = "select * from users";
            String sql = "select * from users where name = '"+name3+"'";  //ls' or  1 = '1  sql注入
            //5:sql执行
            ResultSet resultSet = statement.executeQuery(sql);
            //6:获取数据并展示
            ArrayList<User> list = new ArrayList<>();
            while (resultSet.next()) {
                Object id = resultSet.getObject(1);
                Object name1 = resultSet.getObject(2);
                Object pwd = resultSet.getObject(3);
                Object nickName = resultSet.getObject(4);

                //直接打印
                //System.out.println("id = " + id + ",name = " + name1 + ",password = " + pwd + " ,nickName =" + nickName);
                Integer id1 = (Integer)id;
                String name2 = (String)name1;
                String password2 = (String)pwd;
                String nickName2 = (String)nickName;
                User user = new User(id1,name2,password2,nickName2);
                //封装成一个实体类进行打印
                // System.out.println("user = " + user);
                list.add(user);


            }
            //打印表中所有数据
            list.forEach(System.out::println);


            //7:关闭资源使用 try - with -resource  资源可以自动关闭
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

三:PreparedStatement 语句对statement优化

?

3.1:PreparedStatement 语句

PreparedStatement:解决了 sql拼接 和sql注入问题

PreparedStatement 是 Statement的孩子

PreparedStatement 预编译对象

3.2:PreparedStatement 增删改

@Test
    public void test01() throws SQLException {
        //1:注册驱动

        //2:获取链接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8","root","123456");
        //3:准备sql
        /*
        insert into users values(4,"zbb","123456","赵冰冰");

update users set name = "gbb" and nickName = "郭冰冰" where id = 4;

delete from users where id = 4;
         */
        String sql = "insert into users values(?,?,?,?)";
        //4:创建对象
        PreparedStatement pst = connection.prepareStatement(sql);
        //5:填充数据
        pst.setObject(1, 4);
        pst.setObject(2, "gbb");
        pst.setObject(3, "123456");
        pst.setObject(4, "郭冰冰");


        //5:执行sql
        int i = pst.executeUpdate();
        System.out.println("i = " + i);
        //6:关闭资源
        pst.close();
        connection.close();


    }

3.3:PreparedStatement查

 @Test
    public void test02() throws SQLException {
        //1:注册驱动

        //2:获取链接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8","root","123456");
        //3:准备sql

     //查询一条
//        String sql = "select * from users where id = ?";
        //查询所有
        String sql = "select * from users";
        //4:创建对象
        PreparedStatement pst = connection.prepareStatement(sql);
        //5:填充数据
       /* pst.setObject(1, 4);
        pst.setObject(2, "gbb");
        pst.setObject(3, "123456");
        pst.setObject(4, "郭冰冰");*/
       //查询
//        pst.setObject(1, 2);

        //5:执行sql
//        int i = pst.executeUpdate();
        ResultSet resultSet = pst.executeQuery();
        ArrayList<User> list = new ArrayList<>();

        while (resultSet.next()){
            int id = resultSet.getInt(1);
            String name1 = resultSet.getString(2);
            String pwd = resultSet.getString(3);
            String nickName = resultSet.getString(4);
            //直接打印
//            System.out.println("id = " + id + ",name = " + name1 + ",password = " + pwd + " ,nickName =" + nickName);
            /*Integer id1 = (Integer)id;
            String name2 = (String)name1;
            String password2 = (String)pwd;
            String nickName2 = (String)nickName;
            User user = new User(id1,name2,password2,nickName2);*/
            //封装成一个实体类进行打印
            // System.out.println("user = " + user);
            User user = new User(id,name1,pwd,nickName);
            list.add(user);

        }
        list.forEach(System.out::println);
//        System.out.println("i = " + i);
        //6:关闭资源
        pst.close();
        connection.close();


    }

3.4:获取自动增长键

?

 //传入参数 Statement.RETURN_GENERATED_KEYS  返回自动增长值
        PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

?

 ResultSet resultSet = pst.getGeneratedKeys();
        while (resultSet.next()){
            int id = resultSet.getInt(1);
            System.out.println("id = " + id);

        }
 @Test
    public void test01() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8";
        Connection connection = DriverManager.getConnection(url, "root", "123456");
//        String sql = "insert into users values(null,?,?,?)";
        String sql = "insert into users values(null,?,?,?)";
        //传入参数 Statement.RETURN_GENERATED_KEYS  返回自动增长值
        PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        //填充数据
        pst.setString(1, "zbb");
        pst.setString(2, "123456");
        pst.setString(3, "赵冰冰");
        //获取数据
        int i = pst.executeUpdate();
        //数据展示
        System.out.println("i = " + i);

        //获取自动增长值
        ResultSet resultSet = pst.getGeneratedKeys();
        while (resultSet.next()){
            int id = resultSet.getInt(1);
            System.out.println("id = " + id);

        }

        resultSet.close();
        pst.close();
        connection.close();


    }
}

3.4:批处理

注意点:(需要配置url)

jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true

?主要方法:addBatch()? 和? ??executeBatch()

 @Test
    public void test02() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true";
        Connection connection = DriverManager.getConnection(url, "root", "123456");
        String sql = "insert into users values(null,?,?,?)";
        //传入参数 Statement.RETURN_GENERATED_KEYS  返回自动增长值
        PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        long start = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            //填充数据
            pst.setString(1, "fbb" + i);
            pst.setString(2, "123456");
            pst.setString(3, "范冰冰" + i);
            pst.addBatch();

        }
        pst.executeBatch();
        long end = System.currentTimeMillis();
        System.out.println("用的时间" + (end - start));
        //获取数据
//        pst.executeUpdate();
        //数据展示
        pst.close();
        connection.close();


    }

四:JDBC封装工具包

4.1:jdbc:properties? 文件(每一句末尾绝对不能放;否则报错)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///test?rewriteBatchedStatements=true
user=root
password=123456

?

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myexer?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/myexer
user=root
password=123456

4.2:JDBC封装工具包

????????property的作用

 properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));

?

public class JDBCUtils {

   
    static String url;
    static String user;
    static String password;

    static {
        //1.创建Properties 对象
        Properties properties = new Properties();
        try {
            properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
            String driver = properties.getProperty("driver");
            Class.forName(driver);
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            System.out.println("----------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //硬编码
    public static Connection getConnection() throws ClassNotFoundException, SQLException, IOException {
        Connection connection = DriverManager.getConnection(url, user, password);
        return connection;
    }


    public static void closeResource(ResultSet resultSet, Connection connection, Statement statement) throws SQLException {

        //此为工具方法 部门资源可能没有值 因此在关闭前 进行非空校验

        if (resultSet != null) {
            resultSet.close();
        }

        if (connection != null) {
            connection.close();
        }
        if (statement != null) {
            statement.close();
        }


    }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:47:10  更:2021-11-14 21:47:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:43:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码