05 JDBC基础

news2024/11/25 13:49:49

什么是持久化

将内存中的数据永久保存在磁盘中,方便以后使用

JDBC是什么

java数据库连接

用于执行sql语句的java API

java官方提供接口,各大厂商提供实现类,程序员使用实现类的jar包

JDBC的开发流程

添加包:

mysql-connector-java-5.1.48.jar

lombok.jar

口诀:贾连欲执事

本机url:jdbc:mysql://localhost:3306/jdbc

1.加载注册驱动:Class.forname

2.获取连接对象:Connection conn=DriverManager.getConnection(url,username,password)

3.创建语句对象:Statement ps=conn.creatStatement()

4.执行sql语句ps.executeUpdate(“sql语句”)

释放资源:ps.close(),conn.close()

DAO(java access objiect)

是什么:数据访问对象,面向对象的数据库接口

作用:让我们更规范的编写数据连接的代码

规范如下:

DAO 接口 : 表示对某个模型的 CRUD 操作做规范,以 I 开头,interface

标准:IXxxDAO

例: IEmployeeDAO/IStudentDAO

DAO 实现类: 表示对某个 DAO 接口的实现

标准:XxxDAOImpl

例:EmployeeDAOImpl/StudentDAOImpl

DAO 测试类: 测试 DAO 组件中的所有方法

标准:XxxDAOTest: XxxDAO 组件的测试类,

例:EmployeeDAOTest,StudentDAOTest

创建DAO项目的步骤

  1. 创建项目

  2. 导入数据库驱动包

  3. 创建表和模型包以及模型对象 (domain/Student)

  4. 创建 DAO 包和 DAO 接口,设计 DAO 接口方法 (dao/IStudentDAO)

  5. 创建 DAO 实现包,实现 DAO 接口(dao.impl/StudentDAOImpl)

  6. 创建测试目录,生成测试类和方法(test/StudentDAOTest)

  7. 书写实现,实现一个方法测试一个方法并且测试通过

预编译语句对象(pretaredStatement(String sql))

好处:告别繁琐的字符创拼接,sql语句中使用**?**占作为占位符表示数据,占位符的开始位置是1

格式如下:

String sql=“insert into t_student values(null,?,?,?)”

PrapraredStatement ps=conn.PraparedStatement(sql)

ps.setString(1,s.getName);

JDBC的DQL(查询),返回的是一个对象或者集合

增删改使用的方法时executeUpdate(),查询使用的是executeQuery()

executeQuery():获得的数据被存放在ResultSet的对象中

ResultSet对象指向当前行的光标,从第一行开始,使用next()方法移动光标,下一行有值时返回true,否则返回false,求所有的对象使用while循环迭代结果集

使用rs.getxxx来获取想要的字段,再new对象将字段进行封装

单查询

public Student selectById(long id) throws ClassNotFoundException, SQLException, IOException {

        Connection conn = DruidUtil.getConnection();
        String sql="select * from t_student where id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setLong(1,id);
        ResultSet rs = ps.executeQuery();

//处理结果集,将数据从结果集中取出,封装到指定的对象中
        //next():判断是否有数据,如果有则取出这一行
        //getxxx():获取当前行指定列的数据,xxx表示的是列的类型
        if(rs.next()) {
            //根据列的位置获取数据,位置从1开始
            //long id1 = rs.getLong(1);
            //根据列名获取数据
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String email = rs.getString("email");
            Student student = new Student(id, name, age, email);
            System.out.println(student);
            return student;

        }

查询所有的信息和单查询相同,只是sql语句不同,使用list集合进行封装

抽取JDBC工具类

作用:抽取项目中的相同的代码,减少代码量,防止每次与数据库建立连接时url,username,password写错

**工具类的设计步骤:**看调用者是否需要使用对象,如果不需要,将该工具类的构造器进行私有化(private),同时将里面的方法也设置为静态(static)方法,调用时使用"类名.方法名".如果需要对象就使用单例模式

示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOb92AwX-1684830899920)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402202156316.png)]

抽取配置文件(properties),在工具类Util中抽取

出现情况:java中的数据库账号密码会被编译成字节码文件,用户去修改时不方便,出现硬编码问题

作用:解决硬编码问题,方便用户在配置文件中修改数据库的信息

示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLbqwyu6-1684830899921)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402203715791.png)]

JDBC事务(基于InnoDB)

事务(Transactin),简写为tx

含义:将一组操作作为一个整体,确保数据的一致性,一个操作失败则整个事务视为失败,只有所有操作成功整个事务才算成功

对多组数据的增删改使用事务

事务的ACID属性(作用)

原子性:一个事务中的操作要么都发生,要么都不发生,整个操作是一个整体

一致性:保证数据的完整性,数据的总和不变

隔离性:一个事务不能被其他事务所干扰

持久性:事务一旦被提交,数据的改变是永久型的,无法回滚到最初状态

事务操作的步骤

1.先定义一个需要增删改的事务,从事务的开始处事务设置为手动提交setAutoCommit(false)

2.执行过程中事务没有问题就手动提交**(commit)**事务,此时数据已永久保存

3.如果执行过程中有异常,事务就会回滚**(rollback)**到最初状态

示例

try{
//取消事务自动提交机制,设置为手动提交
connection的对象.setAutoCommit(false);
//操作1
//操作2
//异常
//操作3
..........
//所有操作成功,手动提交异常
connection的对象.Commit();
}catch(Exceptin e)
//处理异常

//回滚异常
connection的对象.rollback();

}

事务的注意事项:

1.默认情况下事务是执行DML后自动提交

**2.**在开发中,代码没有异常,但是数据库中的数据没与发生改变

主要原因:事务没有提交

**3.**在Mysql中,只有InnoDB支持事务,MySIAM不支持事务

4.事务一般不在dao层处理,在service控制

连接池

java官方只提供接口,服务器厂商提供实现类

**出现的原因:**每一次与数据库建立连接后会花费较长时间进行身份验证,并且使用后还得频繁断开连接,不能控制被创建的连接对象的数量,等待的时间太长

使用连接池的好处:不用频繁与数据库建立连接,提高使用效率,充分利用连接对象,直接从连接池里面拿,断开就将连接还给连接池

连接池使用

以前使用的是connection conn=DriverManage.getconnection获取的连接

1.在项目中导入jar:druid-1.1.015.jar

//创建连接池对象
DruidDataSource() ds=new DruidDataSource()
//设置连接对象的四要素
ds.getDricerClassName("com.mysql.jdbc.Driver")
ds.getUrl("jdbc:mysql://localhost:3306/jdbc")
ds.getUsername("root")
ds.getPassword("123456")
//获取连接
connection conn=ds.getConnection()

但是数据库的连接方式一般写在配置文件中,所以需要从配置文件(properties)中抽取字段对应的数据

示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oNnmMbE-1684830899922)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402213542484.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rxU7GzHy-1684830899923)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402213417794.png)]

连接池的使用(方式二,使用工厂)

比最开始的方法多了一个创建工厂的方法,极大地简化了代码

properties配置文件的的key必须和DataSourse中的属性一致,否则就会报错

部分例如:driverClassName,username,url,password

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUBDmPpW-1684830899923)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402213608862.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7PmWAKoF-1684830899924)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230402214003524.png)]

sql注解(startement和preparestatement的区别)

sql的执行流程:

安全性分析–>sql语法分析–>sql语句的编译–>选择并执行一个计划

statement:整个流程每次都要执行

preparestatement:第一条执行整个流程,第二条就只执行第4步

sq注入的原因:用户输入的数据可能会修改sql的语法结构

例如:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcCg1I5D-1684830899925)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230406202443779.png)]

preparestatement的优势:

1.更好的可读性,可维护性

2.更好的性能,但是mysql不支持

3.更安全可以防止sql注入的问题

安全性分析–>sql语法分析–>sql语句的编译–>选择并执行一个计划

statement:整个流程每次都要执行

preparestatement:第一条执行整个流程,第二条就只执行第4步

sq注入的原因:用户输入的数据可能会修改sql的语法结构

例如:[外链图片转存中...(img-IcCg1I5D-1684830899925)]

preparestatement的优势:

1.更好的可读性,可维护性

2.更好的性能,但是mysql不支持

3.更安全可以防止sql注入的问题

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

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

相关文章

Linux文件内管理命令

目录 Linux文件内管理命令 创建文件 目录 普通文件 链接文件 删除文件 删除文件 删除目录 查看文件 目录 普通文件 编辑普通文件 在命令行进行文本内容处理 查找内容 复制文件 移动文件 命令详解 mkdir 作用 语法格式 touch 作用 语法格式 选项 ​编辑…

STM32——SDIO的学习(驱动SD卡)(理论篇)

目录 一、SD卡简介 1.1历史 1.2 tf卡和SD卡的区别 1.3 mmc,emmc,nand,flash的关系 1.4 SD卡的规格等级 1.4.1按容量分 1.4.2 class等级 1.4.3 UHS总线模式 1.4.4 UHS速度等级 1.4.5 VSC视频速度等级 二、SD卡的内部结构 三、SDIO…

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用,它负责局部数据的聚合,我们可以看到,对于大数据量,如果没有Combiner,将会在磁盘上写入多个文件等待ReduceTask来拉取,但是如果有Combiner组件,我们…

什么是Reactive服务架构

介绍: 在java web开发领域,区别于传统的的同步服务架构(底层实现基于同步阻塞IO模型),异步服务这个“新词”(bushi)在不断被提及和重视,不少公司的研发部门也开始在尝试对自己的业务…

【JMM】并发编程Bug的源头——可见性/有序性/原子性问题

本文目录( ̄∇ ̄)/ 可见性问题 有序性问题 为什么会进行指令重排序/乱序执行? 乱序存在的条件 this对象的溢出 原子性问题 如何保证原子性? synchronized 原理简介 加锁的方式 那么问题来了,JVM是如何知道当前…

2022年中国标准创新贡献奖获奖名单公示,海尔再添两项标准创新奖

01 2022年中国标准创新贡献奖 获奖名单公示 海尔再添两项标准创新奖 近日,2022年中国标准创新贡献奖获奖名单公示。其中,海尔GB/T 28219—2018《智能家用电器通用技术要求》、T/CAS 311.1—2018《电器电子产品绿色供应链管理第1部分:通则》…

前端实现拖拽效果改变元素顺序

文章目录 前言一、实现效果二、拖拽API1.代码2.遇见问题 总结 前言 在一次工作中,前端要实现通过鼠标实现拖拽改变顺序的功能,之前没有接触过拖拽这一块所以刚开始一筹莫展,幸运的是在查阅学习中实现了前端拖拽功能。 一、实现效果 二、拖拽…

月薪从10k到30k,一个普通测试工程师的3年涨薪之路...

“要涨薪,先跳槽”各个行业都存在这一共识,但是任何行业也都没有像程序员这样更为适用且好用的了。 前不久,就有网友分享了自己作为一个普通的自动化测试工程师的三年真实涨薪经历。但看看这个三年涨薪之路,好像并不普通啊&#…

2022年深圳杯数学建模D题复杂水平井三维轨道设计解题全过程文档及程序

2022年深圳杯数学建模 D题 复杂水平井三维轨道设计 原题再现: 在油气田开采过程中,井眼轨迹直接影响着整个钻井整体效率。对于复杂水平井,较差的井眼轨迹很可能会造成卡钻或施加钻压困难等重大事故的发生。因而,在施工之前分析影…

python爬虫-获取某某在线翻译的查询结果,爬取json文件并解析

文章目录 从基础步骤下手正确获取response数据关于url获取方式关于post方法的参数关于payload参数填入运行效果解析json数据到文件中完整代码运行结果 从基础步骤下手 # 指定url # 发出请求,get或post # 获取响应 # 把目标文件转存为字符串形式 # 持久性保存正确获…

从零开始的机械臂yolov5抓取gazebo仿真(六)

项目构造简述 前段时间博主装20.04系统不小心把efi启动给删了,导致18.04系统崩了,所以只能简单讲一下这个项目的设计思路以及以grasp.py代码为例进行简单解析。 yolov5_ros功能包 首先,说一下yolov5_ros功能包,该功能包的作用就…

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序 CameraX 是一个 Jetpack 库,旨在帮助简化相机应用程序的开发。 [camerax官方文档] https://developer.android.com/training/camerax CameraX的几个用例: Image CaptureVideo CapturePrev…

【多线程】什么是线程死锁?形成条件是什么?如何避免?

文章目录 一、什么是线程死锁二、线程死锁三、形成死锁的四个必要条件是什么四、如何避免线程死锁 一、什么是线程死锁 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若…

Unity 天空盒

在 Unity 中,天空盒是使用天空盒着色器的一种材质。 创建天空盒材质 1.从菜单栏中,单击 Assets > Create > Material。 2.在 Shader 下拉选单中,单击 Skybox,然后单击要使用的天空盒着色器。 有Skybox/6 Sided、Skybox/…

人民大学与加拿大女王金融硕士项目——在现在憧憬美好的未来

未来是一个虚无缥缈的词汇,抓不住也看不到。未来里有着我们无限的希望,也有着美好的憧憬。未来究竟是怎样的呢,有人说现在的样子里藏着未来的模样。在职的你有没有为未来编织一副美丽的画卷呢?未来很远,远到只能靠想象…

MySQL小记——约束、多表查询

目录 约束 常见约束 主键约束 非空约束 唯一约束 自增长约束 非负约束 外键约束之一对多 外键约束之多对多 多表查询 内连接 外连接 左外连接 右外连接 子查询 自查询 case when语句 约束 在MySQL中,约束是对字段规则的一种限制。 常见约束 1.主…

Linux安装并使用seatunnel2.3.1

SeaTunnel是一个非常易用的超高性能分布式数据集成平台,支持海量数据的实时同步。 下载安装包 设置版本 export version"2.3.1" 通过命令下载 wget "https://archive.apache.org/dist/incubator/seatunnel/${version}/apache-seatunnel-incubat…

Linux/Ubuntu系统运行Python+Yolov5物体识别

程序示例精选 Linux/Ubuntu系统运行PythonYolov5物体识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Linux/Ubuntu系统运行PythonYolov5物体识别>>编写代码&#xff0c;代码…

汽车最强大脑ECU和单片机是什么关系

摘要&#xff1a; 有效解决线路信息传递所带来的复杂化问题 ECU的定义 ECU原来指的是engine control unit&#xff0c;即发动机控制单元&#xff0c;特指电喷发动机的电子控制系统。但是随着汽车电子的迅速发展&#xff0c;ECU的定义也发生了巨大的变化&#xff0c;变成了elec…

31岁才转行程序员,目前34了,我来说说我的经历和一些感受吧...

最近刷知乎&#xff0c;发现有很多朋友有年龄焦虑了&#xff0c;比如&#xff1a;“我今年28了转行来不来得及”&#xff0c;“我今年30了还能转软件测试吗&#xff1f;”......这种问题在知乎上有很多&#xff0c;仿佛大家都觉得年纪大了&#xff0c;很多事情都来不及了&#…