JDBC数据库连接

news2024/11/24 19:37:20
    • 下载jdbc jar包,中央仓库下载

https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.24

    • 项目导入

右键jar包,然后add as library

    • 数据库操作

3.1连接数据库
package com.heima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws Exception
    {
        // 1.注册驱动,目前已经不需要注册驱动,驱动默认加载
        // Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "hexiong";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3.定义sql
        String sql = "update account set money = 2000 where id = 1";

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

        // 5. 执行sql
        int count = stmt.executeUpdate(sql); //返回受影响结果

        // 6.处理结果
        System.out.println(count);

        // 7.释放资源
        stmt.close();
        conn.close();
    }
}
  1. 说明

Connection对象

获取执行sql对象

3.2 事务管理

定义了三个方法管理

try {
    conn.setAutoCommit(false);
    int count1 = stmt.executeUpdate(sql1);
    int count2 = stmt.executeUpdate(sql2);
    System.out.println(count1);
    System.out.println(count2);
    conn.commit();
}
catch (Exception throwables){
    conn.rollback();
    throwables.printStackTrace();
}

Statement对象

ResultSet对象

3.3 JDBC执行DQL数据查询

@Test单元测试,单元测试需要安装两个jar包

核心 ResultSet rs = stmt.executeQuery(sql);

package com.itheima.jdbc;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo_ResultSet {
    @Test
    public void testDQL() throws Exception {
        //        // 1.注册驱动
//        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "hexiong";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3.定义sql
        String sql = "SELECT * from account";

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

        // 5. 执行sql
        ResultSet rs = stmt.executeQuery(sql); //返回受影响结果
        // 受影响行数>0则执行成功,否则失败
        while (rs.next())
        {
            int id = rs.getInt(1);
            String name = rs.getString(2);
            int money = rs.getInt(3);
            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("+++++++++++++++++++++++");
        }

        // 7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

练习:

    @Test
    public void testResultSet() throws Exception {
        //        // 1.注册驱动
//        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "hexiong";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3.定义sql
        String sql = "SELECT * from account";

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

        // 5. 执行sql
        ResultSet rs = stmt.executeQuery(sql); //返回受影响结果
        //创建集合
        List<Account> list = new ArrayList<Account>();
        // 受影响行数>0则执行成功,否则失败
        while (rs.next())
        {
            Account account = new Account();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            int money = rs.getInt(3);
            account.setId(id);
            account.setName(name);
            account.setMoney(money);
            list.add(account);
        }
        System.out.println(list);
        // 7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
3.4 PreparedStatement

执行sql语句对象,预防SQL注入

模拟sql注入

public void testResultSet() throws Exception {
        //        // 1.注册驱动
//        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "hexiong";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3.定义sql
        String name = "zhangsan";
//        String pwd = "123";
        String pwd = "' or '1' = '1"; //sql 注入
        String sql = "SELECT * from user where name='" + name +"'and password='" + pwd +"'";
        System.out.println(sql);

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

        // 5. 执行sql
        ResultSet rs = stmt.executeQuery(sql); //返回受影响结果
        //创建集合
        // 受影响行数>0则执行成功,否则失败
        if(rs.next())
        {
            System.out.println("登录成功");
        }
        else {
            System.out.println("登录失败");
        }
        // 7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

分析,打印执行的语句如下,本质上利用了查询条件

SELECT * from user where name='zhangsan'and password='' or '1' = '1'

PreparedStatement 防sql注入

    public void testResultSet() throws Exception {
        //        // 1.注册驱动
//        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "hexiong";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3.定义sql
        String name = "zhangsan";
        String pwd = "1234";
        String sql = "SELECT * from user where name=? and password=?";
        System.out.println(sql);

        // 4.获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, name);
        pstmt.setString(2,pwd);
        // 5. 执行sql
        ResultSet rs = pstmt.executeQuery(); //返回受影响结果
        //创建集合
        // 受影响行数>0则执行成功,否则失败
        if(rs.next())
        {
            System.out.println("登录成功");
        }
        else {
            System.out.println("登录失败");
        }
        // 7.释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

说明:

使用prepareStatement本质工作原理,即对变量进行转义,比如name,pwd中的特殊字符进行转义。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Appium自动化测试环境搭建

Appium自动化环境搭建 首先整体了解一下Appium自动化环境搭建都需要哪些软件或者组件 Python、Appium、AndroidSDK&#xff08;主要是adb.exe、aapt.exe&#xff09;、Node Js、java 一、安装并配置java环境 1、这个可以搜到的教程实在是太多了&#xff0c;建议直接官方下载…

汽车数据分析,2022年汽车产量总体高于2021年,年产量增长了6%左右

哈喽&#xff0c;大家好&#xff0c;春节将近&#xff0c;想必大家也开始抢票准备回家过年了&#xff0c;有车的伙伴也可能打算自驾归家了。大家辛苦工作了一年&#xff0c;手里积攒了一些积蓄&#xff0c;有些伙伴可能想赶在春节购车购房&#xff0c;这里小编为大家准备了一些…

java面试之设计篇

一、基础 1.六大设计原则 单一职责原则 一个类只专注于做一件事&#xff1b;高内聚&#xff0c;低耦合&#xff1b; 开闭原则 对拓展开放&#xff0c;对修改关闭&#xff08;尽可能不动原有代码进行拓展&#xff09;&#xff1b; 高内聚&#xff0c;低耦合&#xff1b; 为达到…

电力系统|基于分布式高斯-牛顿方法结合置信传播 (BP) 的概率推理方法的非线性状态估计 (SE) 模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

新考纲下的PMP考试有多难?

一&#xff0c;2022新考纲PMP考试有多难&#xff1f; PMP考试被认为是最难的项目管理考试之一&#xff0c;主要是因为其庞大的教学大纲、所需的投入的精力、所问问题的类型和长度、考试时间和答案选择。它测试候选人对项目管理技能和耐心水平的深入了解。这并不意味着不可能通…

舆情监测是什么技术,网络舆情监测技术操作规范?

网络舆情监测是对互联网上公众的言论和观点进行监视和预测的行为&#xff0c;随着互联网的发展&#xff0c;舆情监测已经是企业日常重要工作&#xff0c;对于企业来说是非常重要的&#xff0c;接下来TOOM舆情监测带您了解舆情监测是什么技术&#xff0c;网络舆情监测技术操作规…

基于Python卷积神经网络的动物识别系统源码,动物检测系统源码,宠物识别系统源码

毕设系列-基于卷积神经网络的动物识别系统 完整代码下载地址&#xff1a;基于Python卷积神经网络的动物识别系统源码 上期评论区有好兄弟留言想看动物检测系统&#xff0c;那咱们这期检测系列就更新动物检测系统&#xff0c;并且在之前功能的基础之上添加了计数的功能&#x…

SD3403/SS928V100 移植Yolo模型

1.前言参考的文档名称为《驱动和开发环境安装指南》&#xff0c;首先安装Ubuntu18.04 系统&#xff0c;这次为了方便起见重新做了一个虚拟机&#xff0c;也建议这样做&#xff0c;因为装的很多软件都有版本的要求&#xff0c;避免版本更改导致的别的软件不能运行&#xff0c;单…

ThinkPHP5漏洞分析之SQL注入(七)

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 从?s是个啥开始0x01 模型/控制器/方法的处理0x02 漏洞原因0x03 参数的获取&#xff1f;参考链接&#xff1a;Mochazz/ThinkPHP-Vuln/ 影响版本&am…

ThinkPHP5之文件包含审计分析(六)

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明method方法调用链&#xff1a;程序启动时&#xff1a;后门技巧利用method的任意方法调用&#xff0c;调用构造函数__construct&#xff0c;且调用时会传…

同盾科技 x TiDB丨实时数据架构为风控智能决策保驾护航

同盾科技是中国领先的人工智能科技企业。为了确保服务的低延迟和高可用性&#xff0c;同盾的技术团队不断寻找最佳的技术架构。经过长时间调研&#xff0c;他们最终选择了新一代分布式数据库 TiDB 作为离线层的核心数据库&#xff0c;基于 TiDB 打造的实时数据架构为风控智能决…

Java中常用API总结(3)—— Runtime类(含实例解读)

Runtime类一、前言二、概述1.API帮助文档2.概述三、常用方法1.获取当前系统的运行环境对象1️⃣格式2️⃣实例2.获取CPU总线程数1️⃣格式2️⃣实例3.能够获取总内存大小(单位byte)1️⃣格式2️⃣实例4.已经从系统中获取总内存大小(单位byte)1️⃣格式2️⃣实例5.剩余内存大小1…

【开源项目】Sa-Token快速登录(使用+源码解析)

什么是Sa-Token 官网&#xff1a;https://sa-token.dev33.cn Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题。 快速使用 引入Maven依赖 <!-- w…

有奖征集丨大数据/人工智能模型开发征集

大数据人工智能模型开发征集 为助力构建创新型人才培养模式&#xff0c;培养具有创新精神和实践能力的高素质智能技术人才&#xff0c;激发学生积极参与数据科学研究、技术开发、数据学科竞赛等各类社会实践活动的创新热情。依托模型交易平台&#xff0c;为学生提供自主学习…

认识Linux系统结构

Linux 系统一般有 4 个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell 和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 Linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;…

linux系统中进一步理解设备树

第一&#xff1a;前言 大家好&#xff0c;我是ST。 目录 第一&#xff1a;前言 第二&#xff1a;框图 第三&#xff1a;体验设备树 第四&#xff1a;实验过程分析 第五&#xff1a;实验代码 1、应用程序ledtest.c&#xff1a; 2、驱动层leddrv.c 3、硬件层&#xff1a…

不忘初心,坚持创作和分享,做自己喜欢的事 - 2022 年回顾

不知不觉&#xff0c;来到 Elastic 已经三年多了。在 Elastic 的三年&#xff0c;是疫情发生的三年。对很多人来说&#xff0c;疫情对我们的工作和学习都有很大的变化。好在我还能静下心来&#xff0c;每天坚持学习&#xff0c;不断地创作。记录下来自己的学习及成长经历。我学…

苹果电脑数据回复Aiseesoft Data Recovery

苹果电脑照片误删了怎么找回&#xff0c;数据丢失怎么办&#xff1f;Aiseesoft Data Recovery是专业数据恢复软件&#xff0c;能够帮助你恢复几乎所有删除/丢失的文件&#xff0c;如照片&#xff0c;文件&#xff0c;电子邮件&#xff0c;音频&#xff0c;视频且支持从计算机&a…

C语言深度剖析指针

文章目录 一、指针简单介绍 二、进阶指针的详解 2、1 字符指针 2、2 指针数组 2、3 数组指针 2、3、1 数组指针的定义以用法 2、3、2 数组名和&数组名的区别 2、3、3 数组指针的用法 2、4 函数指针 2、4、1 函数指针的解释 2、4、2 函数指针的举例分析 2、5 函数指针数组 2…

Python 图片转换(Image Conversion) (JPG ⇄ PNG/JPG ⇄ WEBP)

这里我们将使用 PIL&#xff08;Python Imaging Library&#xff09;或 pillow 库&#xff0c;它在 Python 中广泛用于图像处理&#xff0c;Python Imaging Library 中最重要的类是在Image同名模块中定义的类。您可以通过多种方式创建此类的实例&#xff1b;通过从文件加载图像…