OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3221|回复: 0

Java进阶之JDBC 收藏方便找到该网站

[复制链接]

143

主题

145

帖子

0

精华

高级会员

Rank: 4

积分
585
金钱
585
注册时间
2020-5-25
在线时间
42 小时
发表于 2020-9-7 16:29:08 | 显示全部楼层 |阅读模式
什么是JDBC
  • 它是Java操作数据库的一组接口
  • 它也是数据库开发的规范
    • 针对程序开发人员的规范
    • 针对于数据库厂商的规范
操作JDBC

    • 下载JDBC
    • 在项目中导入下载的jar包
    • Java操作MySQL基本步骤
      • 加载驱动,默认情况下,Java程序中是没有JDBC的,需要在程序启动时,将JDBC加载到Java程序中后,即可在程序中使用JDBC
        • Class.forName("com.mysql.jdbc.Driver")
      • 连接数据库
        • 使用驱动管理器连接数据库 DriverManager.getConnection(URL,USER,PASSWORD)
        • 如果连接成功后返回数据库连接对象Connection,是Java程序与数据库进行通信的桥梁
        • 一定要使用java.sql下的Connection
      • 操作数据库
        • 使用Statement接口进行数据库操作
        • Statement接口的来源必须是由Connection对象创建
      • 释放资源
        • close关闭连接
        • 一般创建对象放置在异常块外部,在finally释放资源时,抛出空指针异常
      • 一些常见问题
        • 创建的类名称不要和API库名称一样
        • 保证MySQL数据库的版本与JDBC的版本要一致,否则会报出异常,比如时区异常,检查性异常

[backcolor=var(--hl-base)  !important]import
java.io.*[backcolor=var(--hl-base)  !important];
[backcolor=var(--hl-base)  !important]import java.sql.*[backcolor=var(--hl-base)  !important];[backcolor=var(--hl-base)  !important]public [backcolor=var(--hl-base)  !important]class[backcolor=var(--hl-base)  !important] JDBC {    [backcolor=var(--hl-base)  !important]/**[backcolor=var(--hl-base)  !important]     * 导包 mysql-connector-java-5.1.34-bin     * @珍珠奶茶不加糖     [backcolor=var(--hl-base)  !important]*/    [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]静态内部类加载驱动    [backcolor=var(--hl-base)  !important]static[backcolor=var(--hl-base)  !important]{        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]处理类加载异常        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            Class.forName("com.mysql.jdbc.Driver"[backcolor=var(--hl-base)  !important]);        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (ClassNotFoundException e) {            e.printStackTrace();        }    }    [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]建立连接    [backcolor=var(--hl-base)  !important]public [backcolor=var(--hl-base)  !important]void[backcolor=var(--hl-base)  !important] JDBC(){        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]从文件中读取URL,USER,PASSWORD        File file = [backcolor=var(--hl-base)  !important]new File("E:\\JAVA\\Java2006\\src\\com\\xumouren\\work0823\\jdbc.txt"[backcolor=var(--hl-base)  !important]);        FileReader fileReader = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        BufferedReader bufferedReader = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        String URL = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        String USER = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        String PASSWORD = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            fileReader = [backcolor=var(--hl-base)  !important]new FileReader(file);[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]抛文件处理异常            bufferedReader = [backcolor=var(--hl-base)  !important]new[backcolor=var(--hl-base)  !important] BufferedReader(fileReader);            URL = bufferedReader.readLine();[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]抛IO流异常            USER =[backcolor=var(--hl-base)  !important] bufferedReader.readLine();            PASSWORD =[backcolor=var(--hl-base)  !important] bufferedReader.readLine();        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (FileNotFoundException e) {            e.printStackTrace();        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (IOException e) {            e.printStackTrace();        }[backcolor=var(--hl-base)  !important]finally {[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]关闭连接            [backcolor=var(--hl-base)  !important]if(bufferedReader!=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    bufferedReader.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (IOException e) {                    e.printStackTrace();                }            }            [backcolor=var(--hl-base)  !important]if(fileReader!=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    fileReader.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (IOException e) {                    e.printStackTrace();                }            }        }        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]连接数据库        Connection connection = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        Statement statement = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        PreparedStatement preparedStatement = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        ResultSet resultSet = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]抛数据库异常        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            connection =[backcolor=var(--hl-base)  !important] DriverManager.getConnection(URL,USER,PASSWORD);            [backcolor=var(--hl-base)  !important]if(connection.getAutoCommit()){[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]关闭数据库自动提交                connection.setAutoCommit([backcolor=var(--hl-base)  !important]false[backcolor=var(--hl-base)  !important]);            }        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {            e.printStackTrace();        }        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]使用sql语句两种方式            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]方式一            String sql1 = "insert EMP values(7000,'张三','写bug',7839,null,2000,null,10)"[backcolor=var(--hl-base)  !important];            statement =[backcolor=var(--hl-base)  !important] connection.createStatement();            statement.execute(sql1);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]方式二 -- 预编译形式            String sql2 = "select * from EMP where ENAME = ? "[backcolor=var(--hl-base)  !important];            preparedStatement =[backcolor=var(--hl-base)  !important] connection.prepareStatement(sql2);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]将所要求的值传入问号处            preparedStatement.setObject(1,"张三"[backcolor=var(--hl-base)  !important]);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]将查询结果按结果集输出            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]查询用executeQuery(); 修改改用executeUpdate();  excute()可以执行所有的SQL语句            resultSet =[backcolor=var(--hl-base)  !important] preparedStatement.executeQuery();            [backcolor=var(--hl-base)  !important]while(resultSet.next()){[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]迭代输出                String ename = resultSet.getString("ENAME"[backcolor=var(--hl-base)  !important]);                [backcolor=var(--hl-base)  !important]int empno = resultSet.getInt("EMPNO"[backcolor=var(--hl-base)  !important]);                [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important] 变量[类型与后面数据库数据类型对应]  = resultSet.get[数据库数据类型](字段名);                System.out.println(ename+empno);[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]输出结果[backcolor=var(--hl-base)  !important]            }            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]如果上述都没有异常,则提交[backcolor=var(--hl-base)  !important]            connection.commit();        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]如果出现异常,则回滚            [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                connection.rollback();            } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException ex) {                ex.printStackTrace();            }            e.printStackTrace();        }[backcolor=var(--hl-base)  !important]finally {[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]关闭连接            [backcolor=var(--hl-base)  !important]if(resultSet!=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    resultSet.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {                    e.printStackTrace();                }            }            [backcolor=var(--hl-base)  !important]if(preparedStatement!=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    preparedStatement.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {                    e.printStackTrace();                }            }            [backcolor=var(--hl-base)  !important]if(statement !=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    statement.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {                    e.printStackTrace();                }            }            [backcolor=var(--hl-base)  !important]if(connection!=[backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important]){                [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {                    connection.close();                } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {                    e.printStackTrace();                }            }        }    }    [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]入口    [backcolor=var(--hl-base)  !important]public [backcolor=var(--hl-base)  !important]static [backcolor=var(--hl-base)  !important]void[backcolor=var(--hl-base)  !important] main(String[] args) {        JDBC jdbc = [backcolor=var(--hl-base)  !important]new[backcolor=var(--hl-base)  !important] JDBC();        jdbc.JDBC();    }}


    • JDBC核心接口
      • Connection
        • 与数据库进行连接
        • 作用:与数据库进行交互
        • 常用的API方法
          • DriverManager.getConnection(url,user,password)
          • 对数据库进行事务操作
          • SetAutoCommit(boolean)
      • Statement
        • 实现在Java中执行SQL语句
        • 通过excute(sql)方法,将指定的SQL传入到MySQL数据库中执行
        • 执行excute有三种形式
          • excute(sql) -- 执行所有的sql命令
          • excuteQuery(sql) -- 此方法只能执行对MySQL进行查询的命令
          • excuteUpdate(sql) -- 此方法只能执行对MySQL修改的命令
        • 返回值
          • 当执行select命令后,所有的数据将封装的对象(ResultSet)返回给Java程序
          • 返回的是数据表的快照,返回到内存中
        • 子接口PreparedStatement
          • 出现子接口原因
          • 因为在使用Statement执行查询的时候,会出现SQL注入问题
          • 什么是SQL注入
            • 破坏原有的SQL语句结构,添加新的SQL指令
            • 使原有SQL失去效果
          • PreparedStatement预编译
            • 防止SQL注入
            • 执行SQL命令时,数据的组装更简单
            • 预编译会使执行效率更高
      • ResultSet
        • 该接口是MySQL数据查询后,返回的数据记录集
        • 此接口默认指向内存表中第一行数据的上面
        • 此接口的方法可以实现访问内存表
        • 所有的数据都存储到ResultSet对象
        • 常用API
          • next() -- 可以判断下一行有没有数据,返回值类型Boolean
          • get()<'Type'>(int) -- 参数int表示列的序号,通过列的序号来获取当前数据
          • get()<'Type'>(String) -- 参数String表示列的名称,通过列的名称来获取数据

    • 操作日期类型数据
      • 在MySQL数据库中,常用日期的类型
        • date
        • datetime
        • year
        • timestamp
      • 使用java.sql包下时间类
        • 继承自java.util.Date下
    • 操作事务
      • 关闭自动提交SetAutoCommit(boolean)
      • 提交commit
      • 回滚rollback
    • JDBC操作大对象
      • 将大对象数据按照二进制通过流的方式写入
      • 例如存储一张图片
        • 方法一:将图片上传到服务器本地,在数据库中存放图片的路径
        • 方法二:将图片通过流按照二进制方式存放进数据库
      • 在MySQL中,操作大对象的数据类型有两种
        • text -- 针对文本的大对象类型
        • blob -- 针对于二进制的大对象类型
      • JDBC操作blob步骤
        • 写操作
        • 使用Connection对象创建blob对象
        • Blob blob = connection.createBlob()
        • 将要存储搭配数据库的二进制数据写入搭配blob对象中
          • 需要使用blob对象中提供的输出流对象,向blob对象存储二进制数据
          • 向blob对象中的指定位置,一般都是从头开始写入,设置参数为1
          • 使用OutputStream中的Write()方法向blob对象输出数据
          • 使用preparedStatament将blob对象执行到MySQL数据库
        • 读取与写入操作相反

[backcolor=var(--hl-base)  !important]import
java.io.*[backcolor=var(--hl-base)  !important];
[backcolor=var(--hl-base)  !important]import java.sql.*[backcolor=var(--hl-base)  !important];[backcolor=var(--hl-base)  !important]public [backcolor=var(--hl-base)  !important]class[backcolor=var(--hl-base)  !important] TestBlob {    [backcolor=var(--hl-base)  !important]static {[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]加载驱动        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            Class.forName("com.mysql.jdbc.Driver"[backcolor=var(--hl-base)  !important]);        } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (ClassNotFoundException e) {            e.printStackTrace();        }    }    [backcolor=var(--hl-base)  !important]public [backcolor=var(--hl-base)  !important]static [backcolor=var(--hl-base)  !important]void[backcolor=var(--hl-base)  !important] main(String[] args) {        String url = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        String user = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        String password = [backcolor=var(--hl-base)  !important]null[backcolor=var(--hl-base)  !important];        [backcolor=var(--hl-base)  !important]try[backcolor=var(--hl-base)  !important] {            Connection connection =[backcolor=var(--hl-base)  !important] DriverManager.getConnection(url,user,password);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]创建文件流            File file = [backcolor=var(--hl-base)  !important]new File("E:\\img\\图片一.jpg"[backcolor=var(--hl-base)  !important]);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]读取文件            FileInputStream fileInputStream = [backcolor=var(--hl-base)  !important]new[backcolor=var(--hl-base)  !important] FileInputStream(file);            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]创建Blob对象,用来存储二进制数据            Blob blob =[backcolor=var(--hl-base)  !important] connection.createBlob();                        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]创建输出流,用来将二进制数据存储到Blob对象中            OutputStream outputStream = blob.setBinaryStream(1[backcolor=var(--hl-base)  !important]);                        [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]创建字节数组            [backcolor=var(--hl-base)  !important]byte[] bytes = [backcolor=var(--hl-base)  !important]new [backcolor=var(--hl-base)  !important]byte[100[backcolor=var(--hl-base)  !important]];            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]检测是否读取到数据            [backcolor=var(--hl-base)  !important]int size = -1[backcolor=var(--hl-base)  !important];            [backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]将读取到的值存入bytes,返回存储字符个数            [backcolor=var(--hl-base)  !important]while((size = fileInputStream.read(bytes))!=-1[backcolor=var(--hl-base)  !important]){                outputStream.write(bytes,0,size);[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]将字节写入,从0开始,到最后一个[backcolor=var(--hl-base)  !important]            }            outputStream.close();[backcolor=var(--hl-base)  !important]//[backcolor=var(--hl-base)  !important]关闭流[backcolor=var(--hl-base)  !important]            fileInputStream.close();            String sql = "insert img values(?,?)"[backcolor=var(--hl-base)  !important];            PreparedStatement preparedStatement =[backcolor=var(--hl-base)  !important] connection.prepareStatement(sql);            preparedStatement.setString(1,"图片一.jpg"[backcolor=var(--hl-base)  !important]);            preparedStatement.setBlob(2[backcolor=var(--hl-base)  !important],blob);            preparedStatement.close();            connection.close();                    } [backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (SQLException e) {            e.printStackTrace();        }[backcolor=var(--hl-base)  !important]catch[backcolor=var(--hl-base)  !important] (IOException e){            e.printStackTrace();        }    }}


    • 元数据
      • 元数据是用来描述数据的数据
      • 主要用来说明“数据”的意义
      • 元数据的分类
        • 数据库“元数据”
          • 数据库的元数据体现了数据库相关的信息
          • 包含数据库的版本、驱动名称等等
          • 通过Connection下的getMetaData()获取元数据信息
          • 数据库元数据存储到返回的Database对象中


    • 数据表“元数据”
      • 主要是用来描述表的信息的
      • 数据表元数据与数据无关
      • 常用API
        • 获取数据表列的总数 -- getColumnCount
        • 获取数据表列的原名称 -- getColumnName
        • 获取数据表列的别名 -- getColumnLable 没有别名则获取原名称
        • 获取数据表列的类型对应的常量值 -- getColumnType
        • 获取数据表列的类型名称 -- getColumnTypeName
  • JDBC主键返回与批量添加
    • 主键数据的自动返回
      • 使用主键数据自动返回,会自动返回主键值,可以省去一步查询过程
      • 使用主键自动返回操作
        • 创建PreparedStatement时,要指定是否自动返回主键
        • PreparedStatement preparedStatement = connection.preparedStatement(sql,[1 | PreparedStatement.RETURN_GENERATED_KEYS])
        • 如果输入2,或NOT_RETURN_GENERATED_KEYS则不返回
        • 使用preparedStatement.getGeneratedKeys获取主键,返回一个ResultSet
    • 批量添加
      • 执行批量命令与执行单条命令是不一样的
      • 将待插入的数据存储到缓存中 -- preparedStatement.addBatch()
      • 批量执行,将缓存中每一条记录循环插入到数据表中 -- preparedStatement.excuteBatch()

import java.io.*;import java.sql.*;
public class TestBlob {    static {//加载驱动        try {            Class.forName("com.mysql.jdbc.Driver");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        String url = null;        String user = null;        String password = null;        try {            Connection connection = DriverManager.getConnection(url,user,password);            //创建文件流            File file = new File("E:\\img\\图片一.jpg");            //读取文件            FileInputStream fileInputStream = new FileInputStream(file);
            //创建Blob对象,用来存储二进制数据            Blob blob = connection.createBlob();                        //创建输出流,用来将二进制数据存储到Blob对象中            OutputStream outputStream = blob.setBinaryStream(1);                        //创建字节数组            byte[] bytes = new byte[100];            //检测是否读取到数据            int size = -1;            //将读取到的值存入bytes,返回存储字符个数            while((size = fileInputStream.read(bytes))!=-1){                outputStream.write(bytes,0,size);//将字节写入,从0开始,到最后一个            }            outputStream.close();//关闭流            fileInputStream.close();            String sql = "insert img values(?,?)";            PreparedStatement preparedStatement = connection.prepareStatement(sql);            preparedStatement.setString(1,"图片一.jpg");            preparedStatement.setBlob(2,blob);            preparedStatement.close();            connection.close();                    } catch (SQLException e) {            e.printStackTrace();        }catch (IOException e){            e.printStackTrace();        }    }}
有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 20:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表