详解JDBC各个对象

这篇具有很好参考价值的文章主要介绍了详解JDBC各个对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DriverManager

  • 概述:DriverManager 是驱动管理类

  • 作用

    • 获取数据库连接
    // 返回数据库连接的对象,url 是指定连接路径,user 是数据库用户名 password 是数据库密码
    static Connection getConnection(String url , String user , String password);
    
    • url 语法
    jdbc:mysql://IP地址(域名):端口号/数据库名称
    

    如果连接的是本机 MySQL 服务器,并且端口号默认则 url简写为:jdbc:mysql:///数据库名称>

  • 示例代码

    // 1、获取数据库连接对象-自行更换数据库用户名和密码
    Connection con = DriverManager.getConnection("jdbc:mysql:///test","root","root");
    

Connection

  • 概述:Connection 是数据库连接类

  • 作用

    • 获取执行 SQL 的对象
    方法 作用
    Statement createStatement(); 返回执行 SQL 对象
    PreparedStatement prepareStatement(String sql); 返回执行 SQL 对象,和上述对象有区别
    • 管理事务
    方法 作用 注意事项
    setAutoCommit(boolean autoCommit); 开启事务 方法参数设置为 false ,即开启事务,反之
    commit(); 提交事务 事务执行中未出现错误,执行提交
    rollback(); 回滚事务 事务执行中出现错误,执行回滚
  • 示例代码(这里只为演示,并无实际效果,具体看后续案例)

    // 1、获取数据库连接对象
    Connection con = DriverManager.getConnection("jdbc:mysql:///test","root","root");
    // 2、获取执行 SQL 对象
    Statement st = con.createStatement();
    // ? 后续会讲,看下去
    PreparedStatement pst = con.prepareStatement("SELECT * FROM account WHERE id = ?");
    
    // 1、开启事务
    con.setAutoCommit(false);
    // 2、提交事务
    con.commit();
    // 3、回滚事务
    con.rollback();
    

Statement

  • 概述:执行 SQL 的对象

  • 常用方法

    方法 作用
    boolean execute(String sql); 可以执行任意的 SQL 语句
    int executeUpdate(String sql); 执行 DML、DDL语句,返回值:影响的行数,>0 则代表执行成功
    ResultSet executeQuery(String sql); 执行 DQL 查询语句
  • 示例代码

    • 数据库代码
    -- 创建一个数据库
    CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8;
    -- 使用数据库
    USE test;
    -- 创建一个账户表
    CREATE TABLE account(
    	id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20),
        balance DOUBLE
    );
    -- 向账户表中添加数据
    INSERT INTO account(NAME , balance) VALUES('张三',1000),('李四',1000);
    
    -- 查询账户表
    SELECT * FROM account;
    
    • Java 代码
    public class Test1 {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            // 1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、获取数据库连接对象
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
            // 3、获取执行 SQL 对象
            Statement st = con.createStatement();
            // 4、定义 SQL 语句
            String sql1 = "SELECT * FROM account WHERE id = 2";
            String sql2 = "UPDATE account SET balance = balance - 500 WHERE id = 1";
            // 5、执行 SQL 语句
            boolean flag = st.execute(sql1);
            int lineNum = st.executeUpdate(sql2);
            ResultSet rs = st.executeQuery(sql1);
            // 6、输出结果
            System.out.println(flag + " " + lineNum);
    
            // 输出 ResultSet 结果集结果
            while(rs.next()){
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);
                System.out.println(id + "---" + name + "---" + balance);
            }
    
            // 7、释放资源
            st.close();
            con.close();
        }
    }
    

    运行结果:

    true 1

    2—李四—1000.0


PreparedStatement

  • 概述:执行 SQL 的对象(可以防止 SQL 注入)

    • 作用:PreparedStatement 可以防止 SQL 注入,并且效率更高
  • SQL 注入!!!

    • 问题:在拼接 SQL 时候,有一些 SQL 特殊的关键字参与字符串的拼接,会造成安全性问题?(在案例中演示什么问题)
    • 解决此问题:使用 PreparedStatement 对象来解决,预编译的 SQL 参数使用>作为占位符
  • 常用方法

    方法 作用 参数
    setXxx(参数1,参数2) 给 ?赋值,Xxx代表数据类型 参数1:?的位置编号(从1开始)
    参数2:赋给?的值
  • 示例代码(此对象如何使用)

    • 数据库代码
    -- 创建一个数据库
    CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8;
    -- 使用数据库
    USE test;
    -- 创建一个账户表
    CREATE TABLE account(
    	id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20),
        balance DOUBLE
    );
    -- 向账户表中添加数据
    INSERT INTO account(NAME , balance) VALUES('张三',1000),('李四',1000);
    
    -- 查询账户表
    SELECT * FROM account;
    
    • Java 代码
    public class Test2 {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            // 1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、获取数据库连接对象
            Connection con = DriverManager.getConnection("jdbc:mysql:///test", "root", "root");
            // 3、定义 SQL 语句,这里使用占位符 ?
            String sql = "UPDATE account SET balance = balance - ? WHERE id = ?";
            // 4、创建 执行 SQL 对象
            PreparedStatement pst = con.prepareStatement(sql);
            // 5、设置参数,给第一个?设置值为 500 给第二个?设置值为 1
            pst.setInt(1,500);
            pst.setInt(2,1);
            // 6、执行 SQL 语句
            int lineNum = pst.executeUpdate();
            // 7、输出结果
            System.out.println(lineNum);
            // 8、释放资源
            pst.close();
            con.close();;
        }
    }
    

    运行后,可看到控制台输出结果 1 ,数据库中编号 1 的balance 变成了 500


ResultSet

  • 概述:结果集对象,用来封装查询结果的

  • 常用方法

    方法 作用 注意事项
    boolean next(); 游标向下移动一行,判断当前行是否有数据 有数据返回 true 无数据返回 false
    getXxx(参数); 获取数据 Xxx:代表数据类型
    参数是 int 类型,代表列的编号(从1开始),
    参数是 String 类型,代表列名称
  • 代码示例

    ResultSet rs = st.executeQuery(sql1);
    //循环判断游标是否是最后一行末尾。
    while(rs.next()){
        //获取数据
        int id = rs.getInt(1);
        String name = rs.getString("name");
        double balance = rs.getDouble(3);
        System.out.println(id + "---" + name + "---" + balance);
    }
    

案例

案例一:JDBC控制事务

  • 概述:事务,一个包含多个步骤的业务操作。如果这个业务操作被事务管理,多个步骤要么同时成功,要么同时失败。

  • 操作事务的三个步骤

    • 开始事务
    • 提交事务
    • 回滚事务
  • 代码示例(这里有很多的写法并不严谨,只是为了更好的演示效果,数据库还是上述步骤中用到过的)

    public class Test3 {
        public static void main(String[] args) {
            // 这里为了省事,简单这样写
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";
            Connection con = null;
            PreparedStatement pst1 = null;
            PreparedStatement pst2 = null;
            try {
                // 1、注册驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                // 2、获取数据库连接
                con = DriverManager.getConnection(url,user,password);
                // 3、开启事务
                con.setAutoCommit(false);
                // 4、定义 SQL 语句,sql1 张三-500 sql2 李四+500
                String sql1 = "UPDATE account SET balance = balance - ? WHERE id = ?";
                String sql2 = "UPDATE account SET balance = balance + ? WHERE id = ?";
                // 5、获取执行 SQL 对象
                pst1 = con.prepareStatement(sql1);
                pst2 = con.prepareStatement(sql2);
                // 6、设置 占位符值
                pst1.setInt(1,500);
                pst1.setInt(2,1);
                pst2.setInt(1,500);
                pst2.setInt(2,2);
                // 7、执行 SQL
                pst1.executeUpdate();
    
                // 手动制造异常,可以运行次后,看下数据库的数字,再注释掉这行再运行,再看数据库数字
                int i = 3/0;
    
                pst2.executeUpdate();
    
                // 提交事务,因为遇见异常,所以这步代码并不执行
                con.commit();
            } catch (Exception e) {
                try{
                    if(con != null){
                        // 事务回滚,当 con 不为空的时候,才回滚
                        con.rollback();
                    }
                }catch (SQLException e1){
                    e1.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                try {
                    // 释放资源
                    pst1.close();
                    pst2.close();
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

案例二:SQL 注入错误演示

  • 概述:SQL 语句拼接时,用一些特殊的关键字参与字符串拼接,会造成安全性问题

  • 代码示例

    • 数据库代码
    -- 创建数据库
    CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8;
    
    -- 创建 user 表
    CREATE TABLE USER(
    	username VARCHAR(20),		-- 用户名
    	PASSWORD VARCHAR(20)		-- 密码
    );
    
    -- 插入数据
    INSERT INTO USER VALUES('lisi',"a'or'a'='a");
    
    -- 查询数据,可发现下边 3行都会显示此条信息,这样错误太明显了,这是为什么?
    SELECT * FROM USER WHERE username = 'lisi' AND PASSWORD = 'a'OR'a'='a';
    
    SELECT * FROM USER WHERE username = 'fhdsjkf' AND PASSWORD = 'a' OR 'a' = 'a';
    
    SELECT * FROM USER WHERE username = 'a' AND PASSWORD = 'a' OR 'a' = 'a';
    

    注意:为什么上述3行都能显示呢?看下边两个框,可以知道,查询语句的条件有两个,中间又用 OR ,根据或的特性,只要满足其一即可,第二个红框,很明显一直是对的,所以就能查询出来。

    详解JDBC各个对象,Java 基础知识专栏,数据库,sql,java,mysql,sql注入文章来源地址https://www.toymoban.com/news/detail-807161.html

到了这里,关于详解JDBC各个对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图论专栏一《图的基础知识》

    图论(Graph Theory)是数学的一个分支 。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些实体之间的某种特定关系,用点代表实体,用连接两点的线表示两个实体间具有的某种关系。 相比矩阵、张量、序列等结构,

    2024年02月03日
    浏览(40)
  • [ XJTUSE ]JAVA语言基础知识——第一章 面向对象程序设计思想

    类描述了一组有相同 特性 (属性)和相同 行为 (方法)的对象,类和对象是面向对象思想的两个核心概念 · 人类是一种类,每一个具体的人则是这个类的对象 用面向对象程序来模拟真实世界 发现并创建类 发现类的特征 发现类的行为 在面向对象程序中,对象的特征由各种

    2023年04月13日
    浏览(93)
  • 【JavaEE基础学习打卡00】该专栏知识大纲在这里!

    📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所

    2024年02月10日
    浏览(34)
  • Java数组详解 -- 基础知识与常用操作

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码以及可以在我主页的资源里找到,如果在学

    2024年02月13日
    浏览(49)
  • Spring Boot数据访问基础知识与JDBC简单实现

    Spring Boot数据访问基础知识 Spring Data  ORM JDBC JPA JDBC简单实现 步骤1:新建Maven项目,添加依赖 步骤2:配置数据源—让程序可以访问到  步骤3:配置数据源—让IDEA可以访问到 步骤4:添加数据库和表 步骤5:建立各层级框架,写入相对应代码 步骤6:测试各个接口方法 总结  

    2024年02月14日
    浏览(37)
  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API

    Java 是一种由 Sun Microsystems 于 1995 年首次发布的编程语言和计算平台。Java 是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java 快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计算机、手机等领

    2024年03月24日
    浏览(91)
  • 【数据分析之道-基础知识(十一)】面向对象

    ✍ 作者简介: i阿极 ,CSDN Python领域新星创作者, 专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中全部文章内容

    2024年02月05日
    浏览(41)
  • jvm中类和对象定义存储基础知识

    Class文件结构主要有两种数据结构: 无符号数和表 • 无符号数 :用来表述数字,索引引用、数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数 • 表 :表是有由多个无符号数以及其它的表组成的复合结构,比如图1中类

    2024年02月08日
    浏览(54)
  • Pyhton基础知识:整理18 -> 基于面向对象的知识完成数据分析的案例开发

    数据准备:两份数据,一份是是字符串的形式,一份是json格式,之后对数据处理后,需要合并为一份的数据,进而进行图表的开发      

    2024年01月17日
    浏览(51)
  • C++ 基础知识 五 ( 来看来看 面向对象的继承 上篇 )

    C++ 继承是指派生类(子类)从基类(父类)继承属性和行为的过程。我们可以创建一个新的类,该类可以继承另一个类的数据属性和方法。 在上述代码中,我们定义了一个父类 Person 与一个子类 Student。Student 类继承了 Person 类的属性和方法,包括 name、age、gender 和 eat() 函数

    2024年02月03日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包