[JavaWeb玩耍日记]JDBC(不常用)

news2024/9/28 17:28:52

项目结构

 

目录

一.快速入门

二.开启事务

三.sql执行对象的executeUpdate方法

四.查询数据库

五.SQL注入案例

六.使用PreparedStatement防止Sql注入

七.数据库连接池


一.快速入门

创建新项目,导入mysql-connector-java-5.1.48的jar包

1.使用JDBC更新一条数据有哪一些步骤?
    1.加载是哪一个牌子的数据库驱动(mysql连接jar包5版本后可不写)
    2.获取数据库连接
    3.获取执行sql语句的对象,然后执行sql,获取执行sql结果的返回
    4.关闭连接与执行对象

2.使用.class获取类与class.forName获取类有什么区别?
xxx.class需要被用到的时候才会被加载,使用Class.forName(xxx)能够调用静态方法

3.如何注册数据库驱动?这种方法在底层如何运行?
4.如何进行数据库连接?url应该如何表示?不写域名端口号默认为?如何去除输出警告?
5.如何获取sql执行对象?
6.如果要更新数据,应该要是用什么方法执行sql呢?方法执行返回值是?
public class Demo1_FirstJDBC {
    public static void main(String[] args) throws Exception {

        System.out.println("3.使用Class.forName加载mysql.jdbc包中的Driver类");
        System.out.println("在该类的静态代码块里面有如下代码:DriverManager.registerDriver(new Driver());");
        System.out.println("也就是说创建了自己这个类的对象(驱动),把驱动传给驱动管理器的注册驱动方法了");
        Class.forName("com.mysql.jdbc.Driver");

        System.out.println("4.通过DriverManager的getConnection方法获取获取Connection对象");
        System.out.println("URL需要表名地址、端口、数据库名,可省略域名与端口号,去除输出的警告可以加上?useSSL=false");
        String url1="jdbc:mysql://localhost:3306/db1";
        String url2="jdbc:mysql:///db1?useSSL=false";
        Connection conn= DriverManager.getConnection(url2,"root","123456");

        System.out.println("5.通过数据库连接对象的createStatement方法获取Statement对象");
        Statement stmt = conn.createStatement();

        System.out.print("6.通过sql执行对象的executeUpdate方法执行修改数据的一条sql,返回值为受影响的行数:");
        System.out.print(stmt.executeUpdate("update account set money=1000"));

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


二.开启事务

JDBC中的事务
1.在JDBC中通过什么对象管理事务?
JDBC中通过Connection对象来管理事务,在Java中使用这种方法描述事务更为方便
2.如何开启事务,如何进行事务回滚与提交?
public class Demo2_Transactions {
    public static void main(String[] args) throws SQLException {
        Connection conn= DriverManager.getConnection("jdbc:mysql:///db1?useSSL=false","root","123456");
        Statement stmt = conn.createStatement();
        try {
            System.out.println("2.使用Connection对象的setAutoCommit方法设置false开启事务," +
                    "使用commit方法与rollback方法处理事务,一般写try-catch形式");
            conn.setAutoCommit(false);
            stmt.executeUpdate("update account set money=3000 where id=1");
            int i=1/0;
            conn.commit();
        } catch (RuntimeException e) {
            System.out.println("出现错误,事务回滚");
            conn.rollback();
        }
        stmt.close();
        conn.close();
    }
}

 注释错误语句前运行:

 注释错误语句后运行:


三.sql执行对象的executeUpdate方法

sql执行对象的executeUpdate方法
1.executeUpdate方法能够进行什么操作?
execute方法能够进行数据库与表的增删操作与表内数据的增删改操作得到的数据表示修改状态
2.该方法在创建数据库成功时与删除数据库失败时返回什么?
public class Demo3_ExecuteUpdate {
    public static void main(String[] args) throws SQLException {
        Connection conn= DriverManager.getConnection("jdbc:mysql:///db1?useSSL=false","root","123456");
        Statement stmt = conn.createStatement();
        System.out.println("创建数据库成功返回1,删除数据库成功返回0");
        System.out.println(stmt.executeUpdate("create database db2"));
        System.out.println(stmt.executeUpdate("drop database db2"));
        stmt.close();
        conn.close();
    }
}


四.查询数据库

查询数据库
1.想要得到查询数据库应该使用什么方法?使用什么对象接收结果?
2.如何取出ResultSet中的数据?

实体类:

public class Account {
    private int id;
    private String name;
    private double money;
    public Account() {}
    public Account(int id, String name, double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) { this.id = id; }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getMoney() { return money; }
    public void setMoney(double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}
public class Demo4_ExecuteQuery {
    public static void main(String[] args) throws SQLException {
        Connection conn= DriverManager.getConnection("jdbc:mysql:///db1?useSSL=false","root","123456");
        Statement stmt = conn.createStatement();
        System.out.println("使用executeQuery方法查询数据库,用ResultSet接收");
        ResultSet rs=stmt.executeQuery("select * from account");
        System.out.println("2.while循环中,使用结果集的next方法向下一行查找,同时判断是否有数据");
        System.out.println("使用结果集的get***方法获取对应类型的数据,参数可以写列名字符串,也能写数字123代表第几列");
        ArrayList<Account> arrayList = new ArrayList<>();
        while(rs.next()){
            arrayList.add(new Account(
                    rs.getInt("id"),
                    rs.getString("name"),
                    rs.getDouble("money")));
        }
        System.out.println(arrayList);
        //多释放ResultSet资源
        rs.close();
        stmt.close();
        conn.close();
    }
}


五.SQL注入案例

数据准备
drop table if exists user;
create table user(
   id int PRIMARY KEY auto_increment,
   username varchar(10),
   password varchar(10)
);
insert into user VALUES(null,'zhangsan','123'),(null,'lisi','1234');
public class Demo5_SQL_Injection {
    public static void main(String[] args) throws SQLException {
        Connection conn= DriverManager.getConnection("jdbc:mysql:///db1?useSSL=false","root","123456");
        Statement stmt = conn.createStatement();
        String name="zhangsan",pwd="123";
        System.out.println("此处sql注入即通过修改sql语句,查询表中所有数据");
        pwd= "1' or '0'='0";
        ResultSet rs=stmt.executeQuery("select * from user where username='"+name+"' and password ='"+pwd+"'");
        if (rs.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登陆失败");
        }
        rs.close();
        stmt.close();
        conn.close();
    }
}

 


 

六.使用PreparedStatement防止Sql注入

使用PreparedStatement防止Sql注入
原理:把单引号转义,使注入失效

在my.ini中添加如下可记录日志(自行定义地址):
    log-output=FILE
    general-log=1
    general_log_file="D:\mysqlog\mysql.log"
之后重启

1.如何预使用预编译功能?
2.如何获取preparedStatement对象?
3.在上述情况下如何写sql语句?
4.在执行pstmt的查询方法之前,需要做什么?
5.执行查询方法与stmt有什么不同?
public class Demo6_PreparedStatement {
    public static void main(String[] args) throws Exception{
        System.out.println("1.获取Connection对象时url中加入&useServerPrepStmts=true可预编译加快执行速度,&是连接的意思");
        Connection conn= DriverManager.getConnection("jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true","root","123456");
        System.out.println("2.用PreparedStatement代替Statement来获取执行sql语句的对象,注意要把sql传进去");
        System.out.println("3.sql语句中把参数改为?");
        PreparedStatement pstmt = conn.prepareStatement("select * from user where username= ? and password = ?");
        System.out.println("4.使用pstmt的setString的方法设置?的值,从1开始,代表sql语句中的第几个?");
        pstmt.setString(1,"zhangsan");
        pstmt.setString(2,"123");//注入语句:'or'1'='1
        System.out.println("5.执行查询方法由于已经传入sql,直接执行即可,无需传入sql");
        ResultSet rs=pstmt.executeQuery();
        if(rs.next()){ System.out.println("登陆成功"); }
        else{ System.out.println("登陆失败"); }
        rs.close();
        pstmt.close();
        conn.close();
    }
}

 

 


 

七.数据库连接池

和线程池相似,能把驱逐长时间占用资源的用户
Druid数据库连接池获取Connection对象步骤?
    1.导入jar包,定义properties配置文件
    2.加载配置文件
    3.获取数据源对象
    4.从数据源对象获取数据库连接
1.如何获取数据源对象?
2.如何从数据源对象获取数据库连接?

配置文件:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=123456
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
public class Demo7_DataSource {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("JDBC/src/druid.properties"));
        System.out.println("1.使用DruidDataSourceFactory的createDataSource方法,传入配置信息创建数据源对象");
        DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);
        System.out.println("2.使用数据源的getConnection获取一个连接");
        Connection connection=dataSource.getConnection();
        connection.close();
    }
}

 

 

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

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

相关文章

缘分的计算

题目描述&#xff1a; 缘分是一个外国人难以理解的中文名词。大致说来&#xff0c;缘分是一种冥冥中将两人&#xff08;通常是情人&#xff09;结合的力量。仅管这是种迷信&#xff0c;很多人——特别是女生——喜欢去计算它。 不幸的是&#xff0c;644 也是这样。有天&#x…

其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合)

本篇博客主要详细讲解一下其他排序&#xff08;基数排序&#xff0c;希尔排序和桶排序&#xff09;也是排序综合系列里最后一篇博客。第一篇博客讲解的是LowB三人组&#xff08;冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff09;&#xff08;数据结构课设篇1&…

11.3编写Linux串口驱动

编写串口驱动主要步骤 构建并初始化 struct console 对象&#xff0c;若串口无需支持 console 可省略此步骤 //UART驱动的console static struct uart_driver virt_uart_drv; static struct console virt_uart_console {//console 的名称&#xff0c;配合index字段使用&…

胡圆圆的暑期实习经验分享

背景 实验室一般是在研究生二年级的时候会放实习&#xff0c;在以后的日子就是自己完成毕业工作要求&#xff0c;基本上不再涉及实验室的活了&#xff0c;目前是一月份也是开始准备暑期实习的好时间。实验室每年这个时候都会有学长学姐组织暑期实习经验分享&#xff0c;本着不…

SpringBoot基于哨兵模式的Redis(7.2)集群实现读写分离

文章目录 一、前提条件二、SpringBoot访问Redis集群1. 引入依赖2. yaml配置3. 设置读写分离4. 简单的controller 三、运行四、测试1. 写2. 读3. 额外测试 环境 docker desktop for windows 4.23.0redis 7.2Idea 一、前提条件 先根据以下文章搭建一个Redis集群 Docker-Compo…

如何利用ssh将手机连接电脑

首先我们需要下载ssh&#xff0c;因为我们没有安装 sshd 命令意思是开启ssh 下载完以后要设置密码&#xff0c;我设置得是 123456 开启服务&#xff0c;查看ip 电脑连接 ssh 刚刚得ip -p 8022 后面就连接上了 我可以在这里启动我手机上的vnc

2024年汉字小达人区级选拔备考——选择题:选字填空

前面的几篇文章&#xff0c;六分成长介绍了汉字小达人区级选拔样题的前面三道题&#xff1a;看拼音写汉字、补充成语、诗词连线&#xff0c;这三道大题都是填空题&#xff0c;适合线下笔试&#xff0c;不太适合线上比赛。事实上&#xff0c;在区级自由比赛和市级比赛的时候&…

JVM是如何基于虚拟机栈运行的

众所周知&#xff1a;JVM执行Java代码是靠执行引擎实现的。执行引擎有两套解释器&#xff1a;字节码解释器、模板解释器。字节码解释器比较简单&#xff0c;不多说&#xff0c;看图。本篇文章咱们讨论模板解释器执行Java代码的底层原理。 早些年研究模板解释器看到R大用汇编写的…

学习笔记——C++运算符之比较运算符

作用&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或假值 比较运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){//int a10;int b20;cout<<(ab)<<endl;//0//!cout<<(a!b)<<endl;//1//>cout&…

Python教程(20)——python面向对象编程基本概念

面向对象 类和对象初始化方法属性和方法self关键字继承多态 面向对象&#xff08;Object-oriented&#xff09;是一种常用的程序设计思想&#xff0c;它以对象作为程序的基本单元&#xff0c;将数据和操作封装在一起&#xff0c;通过对象之间的交互来实现程序的功能。 在面向对…

Wpf 使用 Prism 实战开发Day09

设置模块设计 1.效果图 一.系统设置模块&#xff0c;主要有个性化(用于更改主题颜色)&#xff0c;系统设置&#xff0c;关于更多&#xff0c;3个功能点。 个性化的颜色内容样式&#xff0c;主要是从 Material Design Themes UI简称md、提供的demo里复制代码过来使用的。 1.设置…

CHS_02.1.1.2+操作系统的特征

CHS_02.1.1.2操作系统的特征 操作系统的四个特征并发这个特征为什么并发性对于操作系统来说是一个很重要的基本特性资源共享虚拟异步性 各位同学 大家好 在这个小节当中 我们会学习 操作系统的四个特征 操作系统有并发 共享 虚拟和异部这四个基本的特征 其中 并发和共享是两个…

1871_什么是PCB

Grey 全部学习内容汇总&#xff1a; https://github.com/GreyZhang/g_hardware_basic 1871_什么是PCB 简单的PCB的缩写自然很容易理解&#xff0c;不过PCB涉及到的一些概念性的知识会比一个简单的缩写多得多。这里根据AD官方上的一个页面来整理一下这方面的基础知识点。 主…

【⭐AI工具⭐】AI工具导航推荐

目录 零 工具导航&#x1f449;【[AI工具集导航](https://ai-bot.cn/)】&#x1f448;&#x1f449;【[iForAI](https://iforai.com/)】&#x1f448;&#x1f449;【[AInav](https://www.ainav.cn/)】&#x1f448;&#x1f449;【[Navi AI 导航](https://www.naviai.cn/)】&a…

YTM32的低功耗PowerDown模式及唤醒管理器WKU模块

文章目录 Introduction专门的唤醒源管理器WKU外部的唤醒引脚内部的触发信号 进入PowerDown模式的操作流进入低功耗模式配合使用的其他模块 性能指标低功耗电流唤醒时间 Conclusion Introduction YTM32的低功耗系统中有设计了多种工作模式&#xff0c;功耗从高到低&#xff0c;…

大数据时代必备技能!Shell脚本学习网站助你一臂之力!

介绍&#xff1a;Shell脚本是一种用于自动化任务的脚本语言&#xff0c;它使用Shell命令来执行一系列操作。Shell脚本通常以.sh为扩展名&#xff0c;并使用#!/bin/bash作为第一行来指定使用的Shell解释器。 在Shell脚本中&#xff0c;我们可以使用各种命令和控制结构来实现自动…

【大数据】Flink CDC 的概览和使用

Flink CDC 的概览和使用 1.什么是 CDC2.什么是 Flink CDC3.Flink CDC 前生今世3.1 Flink CDC 1.x3.2 Flink CDC 2.x3.3 Flink CDC 3.x 4.Flink CDC 使用5.Debezium 标准 CDC Event 格式详解 1.什么是 CDC CDC&#xff08;Change Data Capture&#xff0c;数据变更抓取&#xf…

汽车电子行业的 C 语言编程标准

前言 之前分享了一些编程规范相关的文章&#xff0c;有位读者提到了汽车电子行业的MISRA C标准&#xff0c;说这个很不错。 本次给大家找来了一篇汽车电子行业的MISRA C标准的文章一同学习下。 什么是MISRA&#xff1f; MISRA (The Motor Industry Software Reliability Ass…

Linux-文件系统管理实验2

1、将bin目录下的所有文件列表放到bin.txt文档中&#xff0c;并将一共有多少个命令的结果信息保存到该文件的最后一行。统计出文件中以b开头的所有命令有多少个&#xff0c;并将这些命令保存到b.txt文档中。将文档中以p结尾的所有命令保存到p.txt文件中&#xff0c;并统计有多少…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用&#xff0c;可能需要检查系统设置中的键盘快捷键部分&#xff0c;以了解系统中截图的…