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

项目结构

 

目录

一.快速入门

二.开启事务

三.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();
    }
}

 

 

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

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

相关文章

【HarmonyOS】装饰器下的状态管理与页面路由跳转实现

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

使用VS Code远程开发小游戏,并实现公网访问本地游戏

使用VS Code远程开发小游戏&#xff0c;并实现公网访问本地游戏 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 在本篇博客中&#xff0c;我们将分享如何通过VS Code实现远程开发MEN…

Java多态,包,权限修饰符,final关键字

文章目录 今日内容教学目标 第一章 多态1.1 多态的形式1.2 多态的使用场景1.3 多态的定义和前提1.4 多态的运行特点1.5 多态的弊端1.6 引用类型转换1.6.1 为什么要转型1.6.2 向上转型&#xff08;自动转换&#xff09;1.6.3 向下转型&#xff08;强制转换&#xff09;1.6.4 案例…

JWT 详解

前言&#xff1a; 本博客为转载整合博客&#xff08;主打一个&#xff1a;我们只做博客的搬运工&#xff09;&#xff0c;参考博客主要有&#xff1a; https://blog.csdn.net/weixin_45070175/article/details/118559272?ops_request_misc%257B%2522request%255Fid%2522%253A…

【LeetCode每日一题】383. 赎金信(计数模拟)

2024-1-7 文章目录 [383. 赎金信](https://leetcode.cn/problems/ransom-note/)思路&#xff1a;计数模拟 383. 赎金信 思路&#xff1a;计数模拟 1.通过数组对字母进行计数 2.magazine 中的每个字符只能在 ransomNote 中使用一次。 3.判断减一后&#xff0c;是否小于等于0。…

前端ui库搜集

涟漪动画效果 - MDUI 开发文档, Material Design 前端框架添加涟漪动画效果后&#xff0c;会在点击元素时&#xff0c;产生向外扩散的水波纹效果。https://www.mdui.org/docs/ripple#ripple https://semantic-ui.com/ https://getuikit.com/ https://www.purecss.cn/grids.htm…

Linux进程间通讯 -- 管道

Linux进程间通讯 – 管道 文章目录 Linux进程间通讯 -- 管道1. 原理2. 进程间通讯2.1 管道2.1.1 匿名管道 pipe2.2.2 有名管道 FIFO 2.2 信号2.3 共享内存2.4 本地套接字 1. 原理 Linux 进程间通讯&#xff0c;也称为IPC(InterProcess Communication) 在 Linux 中每个进程都具…

Doris初识(01)

Doris初识 初识 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

H266/VVC网络适配层概述

视频编码标准的分层结构 视频数据分层的必要性&#xff1a;网络类型的多样性、不同的应用场景对视频有不同的需求。 编码标准的分层结构&#xff1a;为了适应不同网络和应用需求&#xff0c;视频编码数据根据其内容特性被分成若干NAL单元&#xff08;NAL Unit&#xff0c;NALU…

WEB 3D技术 three.js 顶点旋转

我们来说说几何体顶点的旋转 官网搜索 BufferGeometry 这里 我们有 x y z 三个轴的旋转 例如 我们这样的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; i…

第二十七周:文献阅读笔记

第二十七周&#xff1a;文献阅读笔记 摘要AbstractDenseNet 网络1. 文献摘要2. 引言3. ResNets4. Dense Block5. Pooling layers6. Implementation Details7. Experiments8. Feature Reuse9. 代码实现 总结 摘要 DenseNet&#xff08;密集连接网络&#xff09;是一种深度学习神…

AI 工具探索(二)

我参加了 奇想星球 与 Datawhale 举办的 【AI办公 X 财务】第一期&#xff0c;现在这是第二次打卡&#xff0c;也即自由探索&#xff0c;我选择 Modelscope 的 Agent 探索&#xff0c;并用gpts创作助理对比&#xff01; 最近想学学小红书的运营方法&#xff0c;选择了 小红书I…

图像分割-Grabcut法

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术&#xff0c;它可以用于将图像…

CnosDB容灾方案概述

本文主要介绍了跟容灾相关的关键技术以及技术整合后形成的几种具体方案&#xff0c;每种方案都在RTO、RPO、部署成本和维护成本等方面有自己的特点和区别&#xff0c;可以根据具体场景选择最合适的方案。 基本概念 RTO&#xff08;Recovery Time Objective&#xff09;&#x…

Qt基本认识

1. 基本认识 1.1 学习方法&#xff1a; &#xff08;1&#xff09;英语阅读能力要好一点 QT将一些类和方法进行了封装&#xff0c;一般是采用英语&#xff08;方法名、属性、子类、父类等等&#xff09;进行介绍 &#xff08;2&#xff09;学习QT reator 1&#xff09;多查帮助…

数据交互系列:认识 cookie

cookie的原理 http本身是一个无状态的请求&#xff0c;cookie最初的原始目的是为了维持状态而产生的。在首次访问网站时&#xff0c;浏览发送请求中并未携带cookie&#xff0c;即发送无状态请求服务器接受请求之后会在请求上的respond header上加入cookie相关信息并返回给浏览…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实&#xff08;VR&#xff09;中的应用为用户提供了更深入、沉浸式的体验&#xff0c;同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

13年测试老鸟,性能测试-全链路压测总结,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是全链路压…

二维和三维联合进行圆孔空间定位

0.任务描述 对空间圆孔进行三维空间的定位&#xff0c;方便后续的抓取或装配流程&#xff1a;使用二维图与opencv霍夫圆检测进行二维上的定位&#xff0c;再从深度图上查询深度信息&#xff0c;结合相机内参计算出相机坐标系下圆孔的三维坐标信息&#xff0c;并在点云上进行标…