【Java】JDBC的使用

JDBC

package jdbc_demo;

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

public class jdbc {
    public static void main(String[] args)throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123";

        Connection conn=DriverManager.getConnection(url,username,password);

        //3.定义sql
        String sql ="update account set money = 3000 where id=1";

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

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

        //6.处理结果
        System.out.println("受影响"+count+"行");

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

    }
}

数据修改成功。

DriverManager

Driver Manager的作用:

  1. 注册驱动

  2. 获取数据库连接

静态代码块会进行注册驱动。

不使用SSL

jdbc:mysql:///db1?useSSL=false

Connection

Connection作用:

  1. 获取执行SQL的对象

  2. 管理事务

  1. 获取执行SQL的对象

    • 普通执行SQL对象
    Statement createStatement()
    
    • 预编译SQL的执行SQL对象:防止SQL注入
    PreparedStatement prepareStatement(sql)
    
    • 执行存储过程的对象
    CallableStatement prepareCall(sql)
    
  2. 事务管理

    • MySQL事务管理

    • JDBC事务管理

    开启事务:setAutoCommit(boolean autoCommit):true; true为自动提交事务,false为手动提交事务,也就是开启事务

    提交事务:commit()

    回滚事务:rollback()

    package jdbc_demo;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class jdbc {
        public static void main(String[] args)throws Exception {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
    
            //2.获取连接
            String url="jdbc:mysql://127.0.0.1:3306/test";
            String username="root";
            String password="123";
    
            Connection conn=DriverManager.getConnection(url,username,password);
            conn.setAutoCommit(false);
            //3.定义sql
            String sql1 ="update account set money = 3000 where id=1";
            String sql2 ="update account set money = 3000 where id=2";
            //4.获取执行sql的对象Statement
            Statement stmt = conn.createStatement();
            //5.执行sql
    
            int count1 = 0;//返回受影响的行数
            int count2 = 0;
            try {
                count1 = stmt.executeUpdate(sql1);
                count2 = stmt.executeUpdate(sql2);
                //都执行完毕了,就提交事务
                conn.commit();
            } catch (Exception e) {
                conn.rollback();
                throw new RuntimeException(e);
            }
    
            //6.处理结果
            System.out.println("受影响"+count1+"行");
            System.out.println("受影响"+count2+"行");
    
            //7.释放资源
            stmt.close();
            conn.close();
    
        }
    }
    

Statement

ResultSet

while(rs.next())//光标移动到下一行,并且判断当前行数据是否有效
{
	//获取数据
	rs.getXxx(参数);
}
package jdbc_demo;

import java.sql.*;

public class jdbc {
    public static void main(String[] args)throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123";

        Connection conn=DriverManager.getConnection(url,username,password);
        conn.setAutoCommit(false);
        //3.定义sql
        String sql="select * from account";
        //4.获取Statement对象
        Statement stmt = conn.createStatement();
        //执行sql语句
        ResultSet rs=stmt.executeQuery(sql);

        while(rs.next()){
            int id=rs.getInt(1);
            String name=rs.getString(2);
            double money =rs.getDouble(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("--------------------");
        }


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

    }
}

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

package jdbc_demo;

import pojo.Account;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class jdbc {
    public static void main(String[] args)throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123";

        Connection conn=DriverManager.getConnection(url,username,password);
        conn.setAutoCommit(false);
        //3.定义sql
        String sql="select * from account";
        //4.获取Statement对象
        Statement stmt = conn.createStatement();
        //执行sql语句
        ResultSet rs=stmt.executeQuery(sql);

        //创建集合
        List<Account> list=new ArrayList<>();
        while(rs.next()){
            Account account=new Account();

            int id=rs.getInt(1);
            String name=rs.getString(2);
            double money =rs.getDouble(3);

            account.setId(id);
            account.setName(name);
            account.setMoney(money);
            list.add(account);
        }
        System.out.println(list);
        //7.释放资源
        stmt.close();
        conn.close();
    }
}

PreparedStatement

PreparedStatement可以在预编译阶段预防SQL注入问题。

    public void testLogin_Inject() throws SQLException {
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123";
        Connection conn=DriverManager.getConnection(url,username,password);

        //接收用户输入 用户名和密码
        String name="张三";
        String pwd="123456";
        String sql ="select * from user where username='"+name+"'and password='"+pwd+"'";
        Statement stmt=conn.createStatement();
        ResultSet rs=stmt.executeQuery(sql);

        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }
public void testLogin_Inject() throws SQLException {
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123";
        Connection conn=DriverManager.getConnection(url,username,password);

        //接收用户输入 用户名和密码
        String name="张三";
        String pwd="'or'1'='1";
        String sql ="select * from user where username='"+name+"'and password='"+pwd+"'";
        Statement stmt=conn.createStatement();
        ResultSet rs=stmt.executeQuery(sql);

        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }

为什么可以登录成功?分析一下sql语句

select * from user where username='张三'and password=''or'1'='1'

前半段无论正确与否,后半段的1=1永远成立,又是or连接符,自然查询成功了。

如何解决?

package jdbc_demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class PreparedStatement {
    public static void main(String[] args)throws Exception {
        String url="jdbc:mysql://127.0.0.1:3306/test";
        String username="root";
        String password="123456";
        String name="张三";
        String pwd="'or'1'='1";
        Connection conn= DriverManager.getConnection(url,username,password);

        // 修复了 SQL 语句中的问题
        String sql ="select * from user where username=? and password=?";

        java.sql.PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        //执行sql
        ResultSet rst=pstmt.executeQuery();
        if(rst.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }
}

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

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

相关文章

信道复用技术码分复用 CDM(Code Division Multiplexing)

目录 一、码分复用 CDM&#xff08;Code Division Multiplexing&#xff09; 二、码分多址CDMA 三、码片序列的概念 四、码片序列的正交关系 五、CDMA的工作原理 一、码分复用 CDM&#xff08;Code Division Multiplexing&#xff09; 常用的名词是码分多址 CDMA (Code Di…

OceanBase集群部署

我认为学习一个中间件比较好的方式是&#xff0c;先了解它的架构和运行原理&#xff0c;然后动手部署一遍&#xff0c;加深对它的了解&#xff0c;再使用它&#xff0c;最后进行总结和分享 本篇介绍OceanBase部署前提条件和集群部署 1.使用开源免费的社区版&#xff0c;企业版…

JS-WebAPIS(四)

日期对象&#xff08;常用&#xff09; • 实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化创建一个时间对象并获取时间 获得当前时间 获得指定时间 • 时间对象方法 使用场景&#xff1a;因为日期对象返回的数据我们不能直接使用&#xff0c;所以…

Yearning存在任意文件读取漏洞

文章目录 前言声明一、Yearning简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Yearning MYSQL SQL语句审核平台。提供查询审计&#xff0c;SQL审核&#xff0c;SQL回滚&#xff0c;自定义工作流等多种功能。该平台存在任意文件读取漏洞。 声明 请勿利用文章内的…

ThinkPad T14/T15/P14s/P15s gen2电脑原厂Win10系统镜像 恢复笔记本出厂时预装自带OEM系统

lenovo联想原装出厂Windows10系统&#xff0c;适用型号&#xff1a; ThinkPad T14 Gen 2&#xff0c;ThinPad T15 Gen 2&#xff0c;ThinkPad P14s Gen 2&#xff0c;ThinkPad P15s Gen 2 &#xff08;20W1,20W5,20VY,20W7,20W0,20W4,20VX,20W6&#xff09; 链接&#xff1…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1&#xff09;Dcm和PduR的交互2&#xff09;Dcm和ComM模块的交互3&#xff09;Dcm和Dem的交互4&a…

职能部门的绩效考核改革,解决方案来了

一、客户背景及现状问题 A酒店是酒店行业的龙头企业&#xff0c;其品牌享有很高的知名度。为了适应市场竞争及发展的需要、充分发挥每个员工的积极性&#xff0c;提高企业的整体业绩&#xff0c;该企业于前几年开始实行严格的绩效考核制度。绩效考核实行之初&#xff0c;管理者…

基于Django的Python应用—学习笔记—功能完善

一、让用户可以输入信息 创建forms.py 创建基于表单的页面的方法几乎与前面创建网页一样&#xff1a;定义一个 URL &#xff0c;编写一个视图函数并编写一个模板。一个主要差别是&#xff0c;需要导入包含表单 的模块forms.py 。 from django import forms from .models impor…

安捷伦E8361A网络分析仪E8361C

安捷伦E8361A网络分析仪 E8361A 是 Agilent 的 67 GHz 网络分析仪。网络分析仪是一种功能强大的仪器&#xff0c;可以以无与伦比的精度测量射频设备的线性特性。许多行业使用网络分析仪来测试设备、测量材料和监控信号的完整性。附加功能&#xff1a; 94 dB 的动态范围和 <…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

Flink实时数仓同步:拉链表实战详解

一、背景 在大数据领域&#xff0c;业务数据通常最初存储在关系型数据库&#xff0c;例如MySQL。然而&#xff0c;为了满足日常分析和报表等需求&#xff0c;大数据平台会采用多种不同的存储方式来容纳这些业务数据。这些存储方式包括离线仓库、实时仓库等&#xff0c;根据不同…

github如果有别人给你的仓库提pull request,该如何验证他的代码并合并

我有一个github仓库&#xff0c;是做抖音直播数据对接的&#xff0c;有很多朋友给我点了star&#xff0c;也有朋友fork了这个仓库&#xff0c;最近接收到一个pull request的请求&#xff0c;他最直播结束的内容作了判断&#xff0c;我该如何在我本地校验它的代码并合并呢&#…

【Linux】03 GCC编译器的使用

一、编译过程 在使用gcc编译程序时&#xff0c;编译过程可以简要划分为4个阶段&#xff1a; 预处理、编译、汇编、链接 1.1 预处理&#xff08;preprocessing&#xff09; 这个阶段主要处理源文件中的#indef、#include和#define预处理命令&#xff1b; 这里主要是把一些include…

Linux 部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量 vim /etc/profile #java environment export JAVA_HOME/root/soft/…

【手撕C语言 第五集】分支和循环(下)

for循环 我们已经知道了while循环&#xff0c;但是我们为什么还要一个for循环呢&#xff1f; 首先来看看for循环的语法&#xff1a; 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判断循环时候终止。 表达式…

《仙剑4》、《仙剑6》双“空降”,这一次,网友的评论“真相了!”

“本以为《仙剑1》只是国产仙侠剧的起点&#xff0c;结果却没想到&#xff0c;它却真正意义上成为了巅峰。” 这一次&#xff0c;网友的评论“真相了&#xff01;” 先说《仙剑四》&#xff0c;这部据说耗资3.4亿的大制作&#xff0c;奈何笔者实在看不出它的“含金量”&#x…

2023 IoTDB Summit:湖南大唐先一科技有限公司主任架构师舒畅《IoTDB 在发电领域的应用实践》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Deepin_Ubuntu_查看树形目录结构(tree)

Linux系统&#xff08;Deepin、Ubuntu&#xff09;中&#xff0c;可以使用tree命令来查看树形目录结构&#xff0c;下面是一些示例&#xff1a; 查看当前目录的树形结构&#xff1a; tree查看指定目录的树形结构&#xff0c;例如/etc/X11/fonts目录&#xff1a; tree /etc/X…

PSoc62™开发板之i2c通信

实验目的 使用模拟i2c接口读取温湿度气压模块BME280数据 实验准备 PSoc62™开发板温湿度气压模块BME280公母头杜邦线 板载资源 本次实验是通过模拟i2c时序的方式来进行通信&#xff0c;理论上可以有非常多的方式配置i2c引脚&#xff0c;不像硬件i2c那样芯片出厂引脚已经固…

C# Cad2016二次开发选择csv导入信息(七)

//选择csv导入信息 [CommandMethod("setdata")] //本程序在AutoCAD的快捷命令是"DLLLOAD" public void setdata() {Microsoft.Win32.OpenFileDialog dlg new Microsoft.Win32.OpenFileDialog();dlg.DefaultExt ".csv";// Display OpenFileDial…