JDBC(数据库连接)

news2024/11/26 18:52:30

MYSQL 数据库总结:

http://t.csdn.cn/Ka9Vm

JDBC是使用Java语言操作关系型数据库的一套API。

将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。

DriverManager

一个工厂类,我们通过它来创建数据库连接。

当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面。

然后我们把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

package com.ittht.JDBCDemo1;

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

public class DriverManage {
    public static void main(String[] args) throws Exception {
        //1.注册驱动(可省)
        //Class.forName("lib.mysql.jdbc.Driver");
        //2.获得连接
        String url="jdbc:mysql:///test";
        String username="root";
        String word="****";
        Connection conn= DriverManager.getConnection(url,username,word);
        //3.定义sql
        String sql="update jdbc 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();
    }
}

Connection

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

通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接

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

要记得 Connection 的关闭,数据库的连接是有限的,Connection在使用完毕后需要进行关闭。

如果要执行一个事务,例如银行转账,一方的金额减少,另一方金额增多,如果中途出现错误,就需要回滚:

可以使用异常处理机制:try...catch...

开启事务->提交事务->回滚事务

conn.setAutoCommit(false);

conn.commit();

conn.rollback();

在try语句中开启事务和提交事务,如果catch捕获到异常,就回滚。

package com.ittht.JDBCDemo1;

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

public class Demo3Connection {

    public static void main(String[] args) throws Exception {
        //1.注册驱动(可省)
        //Class.forName("lib.mysql.jdbc.Driver");
        //2.获得连接
        String url="jdbc:mysql:///test";
        String username="root";
        String word="****";
        Connection conn= DriverManager.getConnection(url,username,word);
        //3.定义sql
        String sql1 = "update jdbc set money=3000 where id=1";
        String sql2 = "update jdbc set money=3000 where id=2";
        //4.获取执行SQL的对象
        Statement stmt = conn.createStatement();

        try{
            //开启事务
            conn.setAutoCommit(false);

            //5.执行SQL的对象
            int count1 = stmt.executeUpdate(sql1);
            //6.处理结果
            System.out.println(count1);
            int i=1/0;
            //5.执行SQL的对象
            int count2 = stmt.executeUpdate(sql2);
            //6.处理结果
            System.out.println(count2);

            //提交事务
            conn.commit();

        }
        catch (Exception throwables){
            //回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }
        //7.释放
        stmt.close();
        conn.close();
    }
}

ResultSet

更新方法:在可滚动的 ResultSet 对象中,可以向前和向后移动指针,将其置于绝对位置或相对于当前行的位置。

可以用来表示数据库查询结果的对象,封装检索出来的结果,并且只能通过其方法对数据进行访问和修改,不能直接对结果集进行修改。

首先是定义一个类,里面定义的用 private 修饰的变量,跟数据表表格的数据是一一对应的。

然后构造 setter和getter 方法,为了方便查询数据,可以重写一个 ToString 方法。

class jdbc{
    @Override
    public String toString() {
        return "jdbc{" +
                "id='" + id + '\'' +
                ", money=" + money +
                '}';
    }

    private String id;
    private int money;

     public String getId() {
         return id;
     }

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

     public int getMoney() {
         return money;
     }

     public void setMoney(int money) {
         this.money = money;
     }

 }

当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。

 @Test
    public void DemoResultSet() throws SQLException {
        String url="jdbc:mysql:///test";
        String username="root";
        String p="*****";
        Connection conn= DriverManager.getConnection(url,username,p);
        String sql="select * from jdbc";
        Statement stmt=conn.createStatement();
        ResultSet ir=stmt.executeQuery(sql);
        //创建集合
        List<jdbc> list=new ArrayList<>();
        while(ir.next()){

            String id=ir.getString("id");
            int money=ir.getInt("money");
            jdbc j=new jdbc();
            j.setId(id);
            j.setMoney(money);
            list.add(j);
            System.out.println(j);
        }

        ir.close();
        stmt.close();
        conn.close();

    }

PrepareStatement

预编译,性能更高,并且防止sql注入。

SQL注入

在请求的查询字符串中插入SQL命令,最终使服务器执行恶意命令。通过操作输入来修改SQL语句,用以达到执行代码。

        String name = "1233";
        String p= "' or '1'='1";
        String sql = "select * from account where name='" + name + "'and p='" + p+ "'";

这条 sql 输出得到:

select * from account where name='1233'and p='' or '1'='1'

是成立的,所以即使登录的账号和密码错误,也可以成功登录。

设置参数来修改:

        String sql="select * from account where name=? and p=?";
        //获取pstmt对象
        PreparedStatement pstmt=conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,p);

        //执行sql语句(不用传入sql)
        ResultSet rs=pstmt.executeQuery();
        System.out.println(sql);

将原来传入的语句用?替换,接着设置?的值。

注意:问号的位置是从1开始。

此时输出 sql 语句的得到的是:

select * from account where name=? and p=?

与前面不同的是,在获取 pstmt 对象时,就将 sql 语句传入,后面执行 sql 语句是,就不需要传入 sql了。

数据库连接

数据库连接池是一个容器,负责分配、管理数据库连接。

允许出现重复使用一个现有的数据库连接。

提升系统响应速度,避免数据库连接遗漏。

其中 Druid 是最好的数据库连接池之一。

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

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

相关文章

2023易派客工业品展览会在苏州开幕

展厅面积达5.3万平方米&#xff0c;500多家重要工业领军企业参展&#xff0c;20组企业签署购销意向协议&#xff0c;签约金额超82亿元 ​ 4月13日&#xff0c;“2023易派客工业品展览会”在苏州国际博览中心开幕。展会以“绿色智造融通赋能”为主题&#xff0c;500多家重要工业…

CART分类树算法

1. CART分类树算法的最优特征选择方法 我们知道&#xff0c;在ID3算法中我们使用了信息增益来选择特征&#xff0c;信息增益大的优先选择。在C4.5算法中&#xff0c;采用了信息增益比来选择特征&#xff0c;以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.…

FreeRTOS中临界段的保护(笔记)

目录临界段的定义Cortex-M内核快速关开关中断的指令关中断开中断进入临界段的宏退出临界段的宏进入临界段&#xff0c;不带中断保护&#xff0c; 不能嵌套进入临界段&#xff0c;带中断保护版本&#xff0c;可以嵌套退出临界段&#xff0c;不带中断保护版本&#xff0c;不能嵌套…

【数据结构与算法】堆的实现(附源码)

目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…

Windows通过RDP异地远程桌面Ubuntu【内网穿透】

文章目录前言1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外&#xff0c;xrdp工具还接受来自其他RDP客户端(…

文心一格,百度AI作画产品

文章目录AIGC什么是AI作画&#xff1f;Prompt文心一格使用方法注册账号使用AI绘图AIGC的未来发展结语AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与之相对应的概念中…

ElasticSearch索引文档写入和近实时搜索

一、基本概念 1.Segments In Lucene 众所周知&#xff0c;ElasticSearch存储的基本单元Shard&#xff0c;ES中一个Index可能分为多个Shard&#xff0c;事实上每个Shard都是一个Lucence的Index&#xff0c;并且每个Lucene Index由多个Segment组成&#xff0c;每个Segment事实上…

【JS运算】分组求和/平均值(reduce函数)

对于数组求和的问题&#xff0c;使用reduce函数能够最快的解决 如果你还不会reduce函数&#xff0c;可以看这一篇&#xff1a; reduce函数的使用 思路 reduce函数对相同group的值进行迭代求和 将分组的总和除以组里的个数得到平均值&#xff0c;然后存储起来 Sum函数&#x…

Linux ubuntu更新meson版本

问题描述 在对项目源码用meson进行编译时&#xff0c;可能出现以下错误 meson.build:1:0: ERROR: Meson version is 0.45.1 but project requires > 0.58.0. 或者 meson_options.txt:1:0: ERROR: Unknown type feature. 等等&#xff0c;原因是meson版本跟设置的不适配。 …

Linux 学习总结(92)—— Linux 高效率使用技巧

1、跳转目录优雅顺滑 1.1 bd 命令 快速回到 Bash 中的特定父目录&#xff0c;而不是多余地键入 cd ../../..。如果在此路径中/home/radia/work/python/tkinter/one/two并且想快速转到目录 python&#xff0c;只需键入: bd python或者仅输入目录的前几个字母&#xff0c;如匹…

锁子甲 bulid+sim

链接: youtube 分析&#xff1a;洒一堆点——copy 模型——点和模型符合一定规律 点和点的距离符合上述图中的关系 &#xff08;横纵&#xff09; 横向 但是我们要横向10个点够了&#xff1a; 用modulo 除余 纵向 这里用除法向上取整 /10 eg &#xff1a; 0-9 得0 10-19 得1…

【逗号你真的懂吗?】C++与JAVA中逗号的区别

文章目录一、先上结论二、C中的逗号逗号运算符和逗号表达式三、JAVA中的逗号四、实战验证情况一&#xff1a;在定义&#xff08;或声明&#xff09;变量时利用逗号CJAVA情况二&#xff1a;在for循环条件中使用逗号CJAVA情况三&#xff1a;在函数形参参数列表中使用逗号CJAVA情况…

WPF_Application

文章目录Application1 Application类1.1 定义1.2 示例1.3 附注2 Application常用属性2.1 Current2.2 Dispatcher3 总结Application 1 Application类 1.1 定义 该类封装了一个WPF应用程序。 该类派生自DispatcherObject&#xff0c;实现了IQueryAmbient接口。 1.2 示例 以…

ICLR Spotlight | 卷积网络上的首个BERT/MAE预训练,ResNet也能用

“删除-再恢复” 形式的自监督预训练可追溯到 2016 年&#xff0c;早于 18 年的 BERT 与 21 年的 MAE。然而在长久的探索中&#xff0c;这种 BERT/MAE 式的预训练算法仍未在卷积模型上成功&#xff08;即大幅超过有监督学习&#xff09;。本篇 ICLR Spotlight 工作 “Designing…

PPP协议相关的知识

这只是我自己在学习时的总结&#xff0c;对于我有用的知识点&#xff0c;希望可以和大家分享&#xff0c;主要学习的文章如下&#xff0c;如有兴趣也可以去了解一下其他作者写的ppp协议的知识点。 PPP协议详解https://blog.csdn.net/m0_49864110/article/details/124987932?o…

Spring Boot 之四:使用Feign实现微服务间的交互

系列目录&#xff08;持续更新。。。&#xff09; Spring Cloud&#xff1a;什么是微服务 Spring Cloud之一&#xff1a;注册与发现-Eureka工程的创建 Spring Cloud之二&#xff1a;服务提供者注册到Eureka Server Spring Cloud之三&#xff1a;Eureka Server添加认证 Spr…

Talk预告 | 清华大学交叉信息研究院助理教授赵行:基于视觉感知的自动驾驶运动预测

本期为TechBeat人工智能社区第481期线上Talk&#xff01; 北京时间3月15日(周三)20:00&#xff0c;清华大学交叉信息研究院助理教授——赵行的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于视觉感知的自动驾驶运动预测”&#xff0c;届时将…

Dish - TS:减轻时间序列预测中分布偏移的一般范式

摘要 时间序列预测中的分布偏移&#xff08;TSF&#xff09;指的是序列分布随时间发生变化&#xff0c;这很大程度上阻碍了TSF模型的性能。现有针对时间序列中分布偏移的研究主要限于分布的量化&#xff0c;更重要的是忽略了回视窗口和预测窗口&#xff08;horizon windows&am…

Cross Attentional Audio-Visual Fusion for Dimensional Emotion Recognition阅读笔记

Abstract 摘要——多模态分析最近引起了人们对情感计算的极大兴趣&#xff0c;因为它可以提高情感识别相对于孤立的单模态方法的整体准确性。 最有效的多模态情绪识别技术有效地利用各种免费的信息源&#xff0c;例如面部、声音和生理模式&#xff0c;以提供全面的特征表示。 …

谷歌云服务器centos9的docker部署chat-web,实现自己的ChatGPT

谷歌云服务器centos9的docker部署chat-web&#xff0c;实现自己的ChatGPT 前提条件&#xff1a;准备一个境外服务器和chatgpt的key。&#xff08;网上教程很多&#xff09; 1.更新yum yum update2.下载docker-ce的repo curl https://download.docker.com/linux/centos/dock…