JAVA Web 学习(一)JDBC 和 Mybatis

一、Java连接数据库——JDBC & Mybatis

JDBC
使用步骤

① 创建工程,导入驱动jar包(mysql-connector-java-5.1.48.jar)
② 注册驱动。Class.forName(“com.mysql.jdbc.Driver”);
③ 获取连接。Connection conn = DriverManager.getConnection(url, username, password);
④ 定义SQL语句。String sql = “update…”;
⑤ 获取执行SQL对象。Statement stmt = conn.createStatement();
⑥ 执行SQL。stmt.executeUpdate(sql);
⑦ 处理返回结果。
⑧ 释放资源。

数据库连接池

数据库连接池是个容器,负责分配、管理数据库连接(Connection)它允许应用程序 重复使用一个现有的数据库连接,而不是再重新建立一个

DataSource、DBCP、C3PO、Drulid
Connection getConnection()
JDBC的缺点
    (1)数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能。(2)SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。(3)用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。(4)JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
Mybatis

mybatis 是一个优秀的基于 java 的持久层框架,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

优点:

  • 1、SQL 写在XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签, 支持编写动态 SQL 语句, 并可重用。
  • 2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接。

缺点:

  • SQL 语句依赖于数据库, 导致数据库移植性差, 不能随意更换数据库。

实例

<mapper namespace="com.southwind.repository.AccountRepository"><insert id="save" parameterType="com.southwind.entity.Account">insert into t_account(username,password,age) values(#{username},#{password},#{age})</insert><update id="update" parameterType="com.southwind.entity.Account">update t_account set username = #{username},password=#{password},age=#{age}</update><delete id="deleteById" parameterType="long">delete from t_account where id = #{id}</delete><select id="findAll" resultType="com.southwind.entity.Account">select * from t_account</select><select id="findById" parameterType="long" resultType="com.southwind.entity.Account">select * from t_account where id = #{id}</select>
</mapper>
125.mybatis 中 #{}和 ${}的区别是什么?
  • 前者是预编译处理,MyBatis在处理#{}时,会将SQL语句中的#{}替换为?,即占位符,然后使用PreparedStatement的set方法来赋值。
  • 后者是直接替换,MyBatis在处理 时,会直接将 S Q L 语句中的 {}时,会直接将SQL语句中的 时,会直接将SQL语句中的{}替换为参数的值。
由于${}是直接替换参数,不会给参数添加单引号,因此会导致SQL语句错误,如果非要使用${},就需要手动对参数添加单引号,但这样又会带来SQL注入的问题(传入参数:"' or 1 = '1")
能使用#{}就使用#{}!如果非要使用${},那么一定要进行参数校验。
126.mybatis 有几种分页方式?

数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率

  1. Limit实现分页:mysql分页优化,灵活性高

  2. RowBounds分页(不建议使用):RowBounds中有2个字段offset和limit。这种方式获取所有的ResuitSet,从ResultSet中的offset位置开始获取limit个记录(不会查询所有结果),不指定参数的话默认查询所有行。(无论如何DB压力都大,因为结果暂存在db中了)

  3. 利用数组Sublist分页

@Overridepublic List<Student> queryStudentsByArray(int currPage, int pageSize) {List<Student> students = studentMapper.queryStudentsByArray();
//        从第几条数据开始int firstIndex = (currPage - 1) * pageSize;
//        到第几条数据结束int lastIndex = currPage * pageSize;return students.subList(firstIndex, lastIndex);}
  1. 使用MyBatis分页插件PageHelper
## 1.拦截器机制
Mvbatis中的拦截器机制是指,在执行数据库操作时,可以通过自定义拦截器对SQL语句进行拦截和处理。Mvbatis提供了-个Interceptor接口,只要实现该接口并配置到mybatis-config.xml文件中即可使用
## 2.分页插件实现原理
在Mybatis中使用分页插件的原理如下:
(1)首先,在mybatis-config.xml文件中配置分页插件,
(2)当执行查询操作时,拦截器会对SQL语句进行拦截,并根据传入的参数自动将SQL语句进行改写,添加limit和offset关键字。
(3)最后将改写后的SQL语句交给Mybatis执行。
## 物理分页和逻辑分页
物理分页就是数据库本身提供了分页方式,如MySQL的limit,好处是效率高,不好的地方就是不同数据库有不同的搞法。
逻辑分页利用游标分页,好处是所有数据库都统一,坏处就是效率低。使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。
结论:物理分页总是优于逻辑分页,没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,然而其它性能上的优点足以弥补这个缺点
129.mybatis 延迟加载的原理是什么?

在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定要加载他的订单信息。而是想用到订单信息时才会加载,延迟加载是基于嵌套查询来实现的。

原理:它的原理是,使⽤ CGLIB 或 Javassist( 默认 ) 创建⽬标对象的代理对象。当调⽤代理对象的延迟加载属性的 getting ⽅法时,进⼊拦截器⽅法。⽐如调⽤ a.getB().getName() ⽅法,进⼊拦截器的invoke(…) ⽅法,发现 a.getB() 需要延迟加载时,那么就会单独发送事先保存好的查询关联 B对象的 SQL ,把 B 查询上来,然后调⽤ a.setB(b) ⽅法,于是 a 对象 b 属性就有值了,接着完成 a.getB().getName() ⽅法的调⽤。这就是延迟加载的基本原理

优点:先从单表查询,需要时再从关联表去关联查询,⼤⼤提⾼数据库性能,因为查询单表要⽐关联查询多张表

缺点:因为只有当需要⽤到数据时,才会进⾏数据库查询,这样在⼤批量数据查询时会很慢。

所以:在多表中:⼀对多,多对多——通常情况下采⽤延迟加载,⼀对⼀(多对⼀)——通常情况下采⽤⽴即加载

130.说一下 mybatis 的一级缓存和二级缓存?

①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

②、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

131.mybatis 和 hibernate 的区别有哪些?

Hibernate的优缺点:

  • 优点:面向对象开发,不需要自己写sql语句。如果进行数据库迁移不需要修改sql语句,只需要修改一下方言。
  • 缺点:hibernate维护数据表关系比较复杂。完全是有hibernate来管理数据表的关系,对于我们来说完全是透明的,不易维护。Hibernate自动生成sql语句,生成sql语句比较复杂,比较难挑错。Hibernate由于是面向对象开发,不能开发比较复杂的业务。

Mybatis的优缺点:

  • Mybatis只需要程序员关注sql本身,不需要过多的关注业务,开发简单。MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差(Hibernate与数据库具体的关联在XML中)。
132.mybatis 有哪些执行器(Executor)?
  1. SimpleExecutor(简单执行器):这是默认的执行器类型。它每次执行都会创建一个Statement对象,并立即执行SQL语句。这种执行器不支持事务,每次都会关闭Statement对象,适用于简单的查询场景。

  2. ReuseExecutor(重用执行器):这种执行器重用预处理的Statement对象。它会缓存Statement对象,当需要执行相同的SQL语句时,会直接使用缓存的Statement对象,而不是每次都创建新的对象。这种执行器也不支持事务。

  3. BatchExecutor(批处理执行器):这种执行器用于批量操作,可以一次执行多个SQL语句。它会将相同类型的SQL语句分组,并使用JDBC的批处理功能执行。这种执行器可以提高性能,尤其适用于需要执行大量相同类型SQL语句的场景,如批量插入或更新操作。

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

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

相关文章

JS之放大镜案例

让我为大家带来一个关于放大镜的实现方法吧&#xff01; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {margin: 150px;overflow: hidden;}.big {display: …

华为配置小型网络WLAN 的基本业务示例

配置小型网络WLAN基本业务示例 组网图形 图1 配置小型网络WLAN基本业务组网图 小型WLAN网络简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 小型WLAN网络简介 本文介绍的WLAN网络是指利用频率为2.4GHz或5GHz的射频信号作为传输介质的无线局域网&#xff0c;相对于有…

图论第三天|127. 单词接龙 841.钥匙和房间 463. 岛屿的周长 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II

目录 Leetcode127. 单词接龙Leetcode841.钥匙和房间Leetcode463. 岛屿的周长Leetcode1971. 寻找图中是否存在路径Leetcode684.冗余连接Leetcode685.冗余连接II Leetcode127. 单词接龙 文章链接&#xff1a;代码随想录 题目链接&#xff1a;127. 单词接龙 思路&#xff1a;广搜搜…

Vue之初识Vue CLI 脚手架

Vue CLI 是Vue 官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子。【集成了webpack配置】 脚手架有什么好处&#xff1f; 1.开箱即用&#xff0c;零配置 2.内置 babel 等工具 3.标准化 使用步骤: 1.全局安装(一次):yarn globaladd vue/cli …

webassembly003 whisper.cpp的main项目-4 一些宏定义细节

标记函数为已弃用宏&#xff1a;WHISPER_DEPRECATED 对于 GNU 编译器&#xff08;__GNUC__&#xff09;&#xff0c;使用 __attribute__((deprecated(hint))) 属性将函数标记为已弃用&#xff0c;并附带指定的提示信息。对于微软 Visual C 编译器&#xff08;_MSC_VER&#xf…

Hack The Box-Pov

信息收集&端口利用 先使用nmap对主机进行端口扫描 nmap 10.10.11.251只开放了80端口 访问网站后发现没有什么功能点,尝试目录扫描 并没有什么能够利用的点 使用gobuster进行子域名扫描 gobuster dns -d pov.htb -w /usr/share/wordlists/seclists/Discovery/DNS/subdo…

MSE Nacos 配置变更审计平台使用指南

作者&#xff1a;孙立&#xff08;涌月&#xff09;、邢学超&#xff08;于怀&#xff09;、李艳林&#xff08;彦林&#xff09; 配置审计平台简介 Nacos [ 1] 作为一款业界主流的微服务注册中心和配置中心&#xff0c;管理着企业核心的配置资产&#xff0c;由于配置变更的安…

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项?

使用UV胶水在聚醚醚酮&#xff08;Polyether Ether Ketone&#xff0c;PEEK&#xff09;上进行粘接可能具有一些优势&#xff0c;但同时也需要注意一些事项。以下是使用UV胶水的优势和需要考虑的事项&#xff1a; 优势&#xff1a; 1.快速固化&#xff1a; UV胶水通常具有快速…

spark window源码探索

核心类&#xff1a; 1. WindowExec 物理执行逻辑入口&#xff0c;主要doExecute()和父类WindowExecBase 2. WindowFunctionFrame 窗框执行抽象&#xff0c;其子类对应sql语句的不同窗框 其中又抽象出BoundOrdering类, 用于判断一行是否在界限内(Bound), 分为RowBoundOrdering…

flask 实现token生成以及携带token请求接口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Flask-JWT-Extended是什么&#xff1f;二、使用步骤1.引入库2.请求验证 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 提示&…

总结10(break和continue)

break break如果用于循环是用来终止循环 break如果用于switch&#xff0c;则是用于终止switch break不能直接用于if&#xff0c;除非if属于循环内部的一个子句&#xff08;下图为举例&#xff09; 例1&#xff1a; &#xff08;该图中break与if没有关系&#xff0c;只终止for循…

3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM

一、css设置样式的方式总结&#xff1a; 对象.style.css属性 对象.className ‘’ 会覆盖原来的类 对象.setAttribut(‘style’,‘css样式’) 对象.setAttribute(‘class’,‘类名’) 对象.style.setProperty(css属性名,css属性值) 对象.style.cssText “css样式表” …

利用外卖系统源码构建高效的在线订餐平台

在当今数字化时代&#xff0c;外卖服务已成为人们日常生活中不可或缺的一部分。为了满足用户需求&#xff0c;许多创业者和企业都希望搭建自己的在线订餐平台。利用现有的外卖系统源码&#xff0c;可以快速构建一个高效、安全的在线订餐平台。本文将介绍如何利用外卖系统源码来…

Latex warning: Ignoring empty anchor,如何解决?

目录 一、解决办法&#xff1a; 二、另一种潜在的方法&#xff1a; 一、解决办法&#xff1a; 在\footnotetext{....}前添加&#xff1a;\makeatletter\def\HyWarning#1{}\makeatother \makeatletter\def\HyWarning#1{}\makeatother \footnotetext{*Address Correspondence…

SeaTunnel集群安装

环境准备 服务器节点 节点名称 IP bigdata1 192.168.1.250 bigdata4 192.168.1.251 bigdata5 192.168.1.252 Java环境&#xff08;三个节点都需要&#xff09; java1.8 注意&#xff1a;在安装SeaTunnel集群时&#xff0c;最好是现在一个节点上将所有配置都修改完&a…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提前方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

# Redis 分布式锁如何自动续期

Redis 分布式锁如何自动续期 何为分布式 分布式&#xff0c;从狭义上理解&#xff0c;也与集群差不多&#xff0c;但是它的组织比较松散&#xff0c;不像集群&#xff0c;有一定组织性&#xff0c;一台服务器宕了&#xff0c;其他的服务器可以顶上来。分布式的每一个节点&…

搭建 prometheus + grafana + springboot3 监控

下载安装包 下载prometheus&#xff1a;https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.windows-amd64.zip 下载grafana&#xff1a; https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.1.windows-amd64.zip Spr…

Python中容器类型的数据

目录 序列 序列的索引操作 加和乘操作 切片操作 成员测试 列表 创建列表 追加元素 插入元素 替换元素 删除元素 元组 创建元组 元组拆包 集合 创建集合 修改集合 字典 创建字典 修改字典 访问字典视图 遍历字典 若我们想将多个数据打包并且统一管理&…

Cloudreve个人网盘系统源码 支持云存储(七牛、阿里云OSS、腾讯云COS、又拍云、OneDrive) 基于Go框架

现在的网盘动不动就限速&#xff0c;涨价&#xff0c;弄得很是心烦。今天分享一款开源免费的网盘项目&#xff0c;基于 Go 语言开发的 Cloudreve。Cloudreve基于Go框架云存储个人网盘系统源码支持多家云存储驱动&#xff08;从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDr…