JDBC 笔记

课程地址

JDBC = Java Database Contectivity

同一套 java 代码操作不同的关系型数据库

在这里插入图片描述

入门程序

创建工程,导入 jar 包。工程目录结构:

在这里插入图片描述

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        String sql = "update account set money = 1000 where name = 'lisi'";
        // 执行器
        Statement stmt = conn.createStatement();

        int count = stmt.executeUpdate(sql);
        stmt.close();
        conn.close();
    }
}

API 详解

DriverManager

工具类,作用:

  • 注册驱动,静态代码块中的 registerDriver
  • 获取数据库连接:静态方法 getConnection

静态代码块(随着类的加载而执行,而且只执行一次):

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

作用:

  • 获取 SQL 的执行对象
  • 管理事务

在这里插入图片描述

事务案例:

public class JDBCDemo_connection {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        String sql1 = "update account set money = 2000 where name = 'lisi'";
        String sql2 = "update account set money = 1000 where name = 'zhangsan'";
        // 执行器
        Statement stmt = conn.createStatement();

        try {
            conn.setAutoCommit(false);
            int count1 = stmt.executeUpdate(sql1);
            int count2 = stmt.executeUpdate(sql2);
            conn.commit();  // 提交事务
        } catch (Exception e) {
            conn.rollback();    // 回滚事务
            e.printStackTrace();
        }

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

Statement

在这里插入图片描述

ResultSet

在这里插入图片描述

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        // 执行器
        Statement stmt = conn.createStatement();

        String sql1 = "select * from account";
        ResultSet res = stmt.executeQuery(sql1);
        while (res.next()) {
            String name = res.getString("name");
            // String name = res.getString(1);
            int money = res.getInt(2);
            System.out.println(name + " " + money);
        }
        res.close();
        stmt.close();
        conn.close();
    }
}

案例:查询 account 账户表数据,封装为 Account 对象中,并且存储到 ArrayList 集合中

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        // 执行器
        Statement stmt = conn.createStatement();

        String sql1 = "select * from account";
        ResultSet res = stmt.executeQuery(sql1);
        List<Account> accounts = new ArrayList<>();
        while (res.next()) {
            Account a = new Account();
            String name = res.getString(1);
            int money = res.getInt(2);
            a.setName(name);
            a.setMoney(money);
            accounts.add(a);
        }
        System.out.println(accounts);
        res.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement

预编译 SQL 并执行,防止 SQL 注入问题

SQL 注入:输入预先定义好的 SQL 语句,修改 SQL 的执行逻辑

        String name = "daisiqi";
        String age = "' or '1' = '1";
        String sql1 = "select * from tb_user where name='" + name + "' and age = '" + age + "'";
        ResultSet res = stmt.executeQuery(sql1);
        if (res.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }

上面的 SQL 被拼接为:

select * from tb_user where name='daisiqi' and age = '' or '1'='1';

where 条件恒为真
在这里插入图片描述
使用 PreparedStatement 防止 SQL 注入:

        String name = "daisiqi";
        String age = "19";
        String sql1 = "select * from tb_user where name = ? and age = ?";
        PreparedStatement pstmt = conn.prepareStatement(sql1);
        pstmt.setString(1, name);
        pstmt.setString(2, age);

        ResultSet res = pstmt.executeQuery();
        if (res.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }
        pstmt.close();
        conn.close();

原理:

在这里插入图片描述

数据库连接池

导入 jar 包

public class Druid {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileReader("jdbc-demo/src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
}

练习

准备数据库

drop table if exists tb_brand;

create table tb_brand (
    id int primary key auto_increment,
    brand_name varchar(20),
    company_name varchar(20),
    ordered int,
    description varchar(100),
    status int
)DEFAULT CHARSET=utf8mb4;

insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为牛逼', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);

创建实体类

public class Brand {
    private Integer id;     // 在实体类中,建议使用其对应的包装类型
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer status;

    public Integer getId() {
        return id;
    }

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

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

查询所有

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false&useServerPreStmts=true";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 执行器
        String sql1 = "select * from tb_brand";
        PreparedStatement pstmt = conn.prepareStatement(sql1);

        ResultSet res = pstmt.executeQuery();
        List<Brand> brands = new ArrayList<>();
        while (res.next()) {
            Brand brand = new Brand();
            brand.setId(res.getInt("id"));
            brand.setBrandName(res.getString("brand_name"));
            brand.setCompanyName(res.getString("company_name"));
            brand.setOrdered(res.getInt("ordered"));
            brand.setDescription(res.getString("description"));
            brand.setStatus(res.getInt("status"));
            brands.add(brand);
        }
        System.out.println(brands);
        pstmt.close();
        conn.close();
    }
}

添加

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false&useServerPreStmts=true";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 执行器
        String sql1 = "insert into tb_brand(brand_name, company_name, ordered, description, status) values (?, ?, ?, ?, ?)";
        // 参数
        String brandName = "香飘飘";
        String companyName = "香飘飘";
        int ordered = 1;
        String description = "绕地球一圈";
        int status = 1;

        PreparedStatement pstmt = conn.prepareStatement(sql1);
        pstmt.setString(1, brandName);
        pstmt.setString(2, companyName);
        pstmt.setInt(3, ordered);
        pstmt.setString(4, description);
        pstmt.setInt(5, status);

        int count = pstmt.executeUpdate();
        System.out.println(count > 0);
        pstmt.close();
        conn.close();
    }
}

修改

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false&useServerPreStmts=true";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 执行器
        String sql1 = "update tb_brand set brand_name=?, company_name=?, ordered=?, description=?, status=? where id=?";
        // 参数
        int id = 4;     // 要修改的数据
        String brandName = "香飘飘";
        String companyName = "香飘飘";
        int ordered = 100;
        String description = "绕地球三圈";
        int status = 1;

        PreparedStatement pstmt = conn.prepareStatement(sql1);
        pstmt.setString(1, brandName);
        pstmt.setString(2, companyName);
        pstmt.setInt(3, ordered);
        pstmt.setString(4, description);
        pstmt.setInt(5, status);
        pstmt.setInt(6, id);

        int count = pstmt.executeUpdate();
        System.out.println(count > 0);
        pstmt.close();
        conn.close();
    }
}

删除

public class JDBCDemo_ResultSet {
    public static void main(String[] args) throws Exception {
        // 注册驱动
        // Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://192.168.93.12:3306/itcast?useSSL=false&useServerPreStmts=true";
        String username = "root";
        String password = "syc13140";
        // 获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        // 执行器
        String sql1 = "delete from tb_brand where id=?";
        // 参数
        int id = 4;     // 要修改的数据

        PreparedStatement pstmt = conn.prepareStatement(sql1);
        pstmt.setInt(1, id);

        int count = pstmt.executeUpdate();
        System.out.println(count > 0);
        pstmt.close();
        conn.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/460665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新品牌推广怎么做?百度百科创建是第一站

创业企业的宣传推广怎么做&#xff1f;对于初创的企业、或者品牌来说&#xff0c;推广方式都有一个循序渐进的过程&#xff0c;但多数领导者都会做出同一选择&#xff0c;第一步就是给自己的企业创建一个百度百科词条。在百度百科建立自己的企业、或产品词条,不仅可以树立相关信…

Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项

Windows11去掉 右键菜单的 AMD Software:Adrenalin Edition 选项 运行regedit打开注册表编辑器 先定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package找到 AdvancedMicroDevicesInc-2.…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十六)-UL-AoA 定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

Unity类银河恶魔城学习记录10-10 p98 UI health bar源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili HealthBar_UI.cs using System.Collections; using System.Collections.G…

Unity PS5开发 天坑篇 之 申请开发者与硬件部署01

腾了好几天终于把PS5开发机调试部署成功, 希望能帮到国内的开发者, 主机游戏PlayStation/Nintendo Switch都是比较闭塞的&#xff0c;开发者账号是必须的。 开发环境有两个部分&#xff0c;一是DEV Kit 开发机, TEST Kit测试机两部分组成&#xff0c;二是Unity的支持库(安装后…

采用MQTT协议实现Android APP与阿里云平台的连接

前言 相信APP&#xff0b;单片机是很多同学毕设或者课设的模式&#xff0c;上学期做课设的时候用到了MQTT协议连接阿里云平台实现数据的通信&#xff0c;也是根据网上大佬的经验做的&#xff0c;中间也踩了很多坑。本文将介绍Android APP 通过MQTT协议与阿里云云平台连接的内容…

【矩阵】73. 矩阵置零【中等】

矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 解题思路 1、…

java数据结构与算法刷题-----LeetCode51. N 皇后

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( N ! N! N!)&#xff0c;空间复…

【IC设计】Verilog线性序列机点灯案例(一)(小梅哥课程)

文章目录 设计目标思路仿真结果时间点一&#xff1a;201ns时间点二&#xff1a;220ns时间点三&#xff1a;250,000,220ns时间点四&#xff1a;1,000,000,200ns时间点五&#xff1a;1,000,000,220ns 总结&#xff1a; 案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔…

Centos7安装ffmpeg

Centos7安装ffmpeg 用到的包压缩并安装 用到的包 压缩并安装 tar xvJf ffmpeg-5.0.1.tar.xz yum install -y gcctar -zxvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install yasm --versionyum install -y bzip2tar jxvf nasm-2.14.02.tar.bz2 cd n…

海格里斯HEGERLS托盘搬运机器人四向车引领三维空间集群设备柔性运维

随着市场的不断迅猛发展变化&#xff0c;在物流仓储中&#xff0c;无论是国内还是海外&#xff0c;都对托盘式解决方案需求量很大。顾名思义&#xff0c;托盘式解决方案简单理解就是将产品放置在托盘上进行存储、搬运和拣选。 面对托盘式方案需求&#xff0c;行业中常见的方案是…

git报: “fatal: detected dubious ownership in repository“

“fatal: detected dubious ownership in repository”的中文翻译是&#xff1a;“致命错误&#xff1a;检测到仓库中存在可疑的所有权问题”。 这句话意味着 Git 在检查代码仓库时发现所有权存在问题&#xff0c;可能是由于文件或目录的所有权与 Git 仓库预期的所有权不匹配。…

React18 后台管理模板项目:现代、高效与灵活

&#x1f389; 给大家推荐一款React18TypescriptVitezustandAntdunocss且超级好用的中后台管理框架 项目地址 码云&#xff1a;https://gitee.com/nideweixiaonuannuande/xt-admin-react18github&#xff1a;https://github.com/1245488569/xt-admin-react18 演示地址 http…

(done) 解释 python3 torch.utils.data DataLoader

特别注意&#xff1a;DataLoader 返回的迭代器是无尽的&#xff0c;依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的&#xff0c;因为它会无限地循环遍历数据集&#xff0c;以提供批量的数据。在训练神经网络时&#xff0c;通常会使用无尽的迭代器来循环遍历…

内存操作函数(C语言)

目录 memcpy使用和模拟实现 memcpy函数的模拟实现 memmove的使用和模拟实现 memmove的模拟实现 memset函数的使用 memcmp函数的使用 memcpy使用和模拟实现 mem--memory--记忆--内存 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置这…

Android Studio实现内容丰富的安卓校园二手交易平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号038 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看二手商品列表 3.查看二手商品详情 4.评论商品&…

Window11 下 git报: “fatal: detected dubious ownership in repository“

Window11 下 git报: “fatal: detected dubious ownership in repository” 一般是因为重装了系统或更换了用户, git文件夹的所有者发生了改变 可以右键点文件夹 属性 &#x1f449; 安全 &#x1f449; 高级 点完 高级,新对话框点 更改 点完 更改 新对话框点 高级 点完 高级…

【JavaEE -- 多线程3 - 多线程案例】

多线程案例 1.单例模式1.1 饿汉模式的实现方法1.2 懒汉模式的实现方法 2. 阻塞队列2.1 引入生产消费者模型的意义&#xff1a;2.2 阻塞队列put方法和take方法2.3 实现阻塞队列--重点 3.定时器3.1 定时器的使用3.2 实现定时器 4 线程池4.1 线程池的使用4.2 实现一个简单的线程池…

力扣大厂热门面试算法题 33-35

33. 搜索旋转排序数组&#xff0c;34. 在排序数组中查找元素的第一个和最后一个位置 &#xff0c;35. 搜索插入位置&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.15 可通过leetcode所有测试用例。 目录 33. 搜索旋转排序数组…

Java项目:52 springboot基于SpringBoot的旅游网站的设计与实现013

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 旅游网站主要功能如下&#xff1a; 1.用户管理&#xff1a;注册、登录、退出、修改密码&#xff1b; 2.分类显示&#xff1a;显示旅游路线的分类&am…