数据库访问中间件

article/2025/10/6 5:41:37

数据库访问中间件

什么是ORM框架

对象关系映射(Obiect Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射;

  • 异构性:ORM可以解决数据库与程序间的异构性,比如在Java中我们使用String表示字符串,而Oracle中可使用varchar2,MySQL中可使用varchar,SQLServer可使用nvarchar。
  • 映射:ORM提供了实现持久化层的另一种模式,采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库之间充当桥梁。

有哪些经典的ORM框架

  • Hibernate:全自动的框架,强大、复杂、笨重、学习成本较高
  • MyBatis:半自动的框架,必须要自己写sql
  • JPA:全称Java Persistence API,是Java自带的框架

Mybatis

Mybatis的介绍

  • MyBatis是一款优秀的持久层框架(它前身是apache的一个开源项目iBatis),支持定制化SQL、存储过程以及高级映射。
  • MyBatis可以使用简单的XML注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

Mybatis的架构

接口层:接口层主要定义的是与数据库进行交互的方式。

  • 接口层中,调用CRUD的方式有两种:一、基于Mybatis自带的Statement ID;二、基于Mapper接口。

数据处理层:这是Mybatis的核心,负责参数映射和动态SQL生成,生成之后Mybatis执行SQL语句,并将返回的结果映射成自定义的类型。数据处理层主要负责: 参数映射(ParameterHandler)——>SQL解析(SqlSource)——>SQL执行(Executor)——>结果处理和映射(ResultSetHandler)

框架支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

引导层:基于XML配置方式和基于Java API方式。

Mybatis的主要工作流程

Mybatis的工作流程

Mybatis中的主要成员以及结构

配置方面——Configuration:Mybatis的所有的配置信息都保存在这里面,分成全局配置文件以及映射的配置文件,而映射的配置文件当中又存储了相关的SQL操作。所以在MappedStatement里面,封装了mapper配置文件里面的相关的SQL操作,通过SqlSource来生成动态SQL语句,并且把他封装到BoundSql里面。而ResultMap就是Map里面定义的自定义结果集。

结构层次:

  • SqlSession:作为MyBatis工作的最顶层的API接口,作为会话访问,完成增删改查功能。
  • Executor:MyBatis执行器,是MyBatis调度的核心,负责动态语句的生成和查询缓存的维护。
  • StatementHandler:封装了JDBC的所有Statement操作,负责处理JDBC的Statement的交互,包括对Statement设置参数,以及将JDBC返回的resultSet结果集转换成List。
  • ParameterHandler:负责根据传递的参数值,对Statement对象设置参数。
  • ResultSetHandler:负责将resultSet集合转换为List。
  • TypeHandler<T>:负责JDBCType与JavaType之间的数据转换;
    1. 负责对Statement对象设置特定的参数;
    2. 对Statement返回的结果集resultSet,取出特定的列。

Springboot整合Mybatis的流程

Springboot整合Mybatis流程

Springboot整合Mybatis的相关配置

mysql的配置

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&
useUnicode=true&characterEncoding=utf-8&useSSL=true
#用户名、密码由自己设置
spring.datasource.username=root
spring.datasource.password=root
#在 Spring Boot 2.1.0 中,com.mysql.jdbc.Driver已经过期,推荐使用 com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Mybatis的配置

#设置mybatis的配置文件路径,默认是在resources的目录
mybatis.config-location=classpath:mybatis/mybatis-config.xml
#设置mybatis下面的mapper映射文件路径,默认是在resources的目录
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#设置项目中实体类包路径;com.study.springboot_mybatis01.entity根据项目而定
mybatis.type-aliases-package=com.study.springboot_mybatis01.entity
#展示sql语句,com.study.springboot_mybatis01.repository.UsersDao根据项目而定
logging.level.com.study.springboot_mybatis01.repository.UsersDao=debug

Spring Data JPA的介绍以及入门

SpringData是什么

Spring Data是为了简化构建基于Sprng框架应用的数据访问技术,包括对关系数据库、非关系数据库、Map-Reduce框架、云数据服务等访问支持。它为我们提供使用统一的API标准来对数据访问层进行操作,这套标准包含了CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。

Spring Data的特点

  1. 支持对象关系映射

    • 具备ORM框架的对象关系映射功能。
  2. 统一的Repository接口

    • Repository<T,ID extends Serializable>:统一接口

    • CrudRepository<T,ID extends Serializable>:基本的CRUD操作

    • PagingAndSortingRepository<T,ID extends Serializable>:基本CRUD及分页

  3. 统一的数据访问模板类 xxxTemplate

    • 为非关系型数据库提供,如:MongoTemplate、RedisTemplate等

JPA的介绍

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。主要为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是一套规范,不是一套产品,比如Hibernate、TopLink、JDO是一套产品,如果这些产品实现了JPA规范,那么就可以称之为JPA的实现产品。

JPA的配置信息

# 支持SQL输出
spring.jpa.show-sql=true
# format 一下 SQL 进行输出
spring.jpa.properties.hibernate.format_sql=true
# 自动生成开启,让表数据会自动跟随entity类的变化而变化
spring.jpa.properties.hibernate.hbm2ddl.auto = update
# 开启自动更新,若数据库没有对应的表,则生成;若有,则检查是否需要更改
spring.jpa.hibernate.ddl-auto = update

Spring Data与JPA的关系

Spring Data与JPA的关系

Spring Data JPA的工作原理

Spring Data JPA的工作原理

JPA单表SQL操作-使用关键字拼凑方法

KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1(parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1(parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1(parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection<Age> ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection<Age> age)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

注意事项

  • 实体类属性名不要出现isXxxgetXxx的名称,会导致关键字拼凑出错。
  • 实体类属性名中间只要出现了大写字母,就会导致数据库的字段名有下划线隔开,比如你是用isMarried属性名,那么实体类的字段名就会变成**is_married**,这样容易导致找不到值。
  • 属性名类型是boolean类型的在某些数据库中会变成**bit(1)**类型,其中0为false,1为true。

无法解决的问题

  1. 实体类的属性名与表的字段名无法映射,导致关键字找不到。
  2. CRUD操作方式比较另类。
  3. 涉及到多表操作。

单表SQL操作-使用注解手写sql语句

  1. 使用SQL语句来书写SQL。
  2. 使用HQL语句来书写SQL。

注意事项

  • 如果是删改操作,需要加@Modifying(你对表进行了删改操作)和@Transactional(他会支持事务的操作)
  • 如果是SQL语句,请在@Query注解上加上NativeQuery = true的属性,如果不加,就会默认为HQL语句
  • 传参的方式有两种:
    1. 使用 ? + 数字的方式,数字从1开始,代表第几个参数;
    2. 使用 : + 参数名的方式,这种方式最好配合@Param注解一起使用。

Spring Data JPA的逆向工程操作和多表操作

  • 使用数据接口:构建一个数据接口,里面的抽象方法就是SQL语句的查询结果的字段对应的getXXX的抽象方法。
  • 使用集合:直接使用List/Map等集合嵌套的方式来获取到接收数据。
  • 使用VO(View Object):单独构建一个跟页面展示数据对应的VO的实体类来接收数据。

注意事项

  • 使用数据接口的方式来接受查询的字段时要注意,必须要为要查询的字段名气别名,否则会无法取到。

多表复杂查询的一种方式——QueryDSL

什么是QueryDSL

QueryDSL仅仅是一个通用的查询框架,专注于通过JavaAPI构建类型安全的Sql查询,也可以说QueryDSL是基于各种ORM框架以及Sql之上的一个通用查询框架,QueryDSL的查询,类似于SQL查询,只不过一个使用SQL一个使用代码来代替SQL。

注意:单表乃至简单的多表操作,都不推荐使用QueryDSL,使用JPA自带API简洁又效率,但是设计太复杂的查询,还是推荐使用QueryDSL。

官方学习文档:http://www.querydsl.com/static/querydsl/latest/reference/html/

总结

JPA的SQL操作

Springboot中的分页

Pageable分页

Pageable分页是Spring Data JPA默认提供的分页功能,直接继承JpaRepository就获得了该分页功能;

  1. JPA自带的分页方式,不需要添加额外的支持及配置;
  2. 页数是从0开始,到size-1为止;
  3. 单表、简单的多表操作分页排序使用它方便快捷。

PageHelper分页(Mybatis分页插件)

  1. 第三方插件,需要添加对应的依赖以及进行相关配置;
  2. 页数是从1开始,到size为止;
  3. 最佳搭档是Mybatis(由于PageHelpers是根据离他最近的一个sql执行,而jpa刚好是自动生成sql,所以PageHelper最好用mybatis。如果必须用jpa的话需要引入entitymanager+Query查询)
  4. 复杂的查询使用PageHelper可以让你更方便。

参考网址:

  1. GitHub地址:http://github.com/pagehelper/Mybatis-PageHelper
  2. 配置说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
  3. API文档:http://apdioc.gitee.com/free/Mybatis_PageHelper

配置

#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

http://chatgpt.dhexx.cn/article/hu0g3tWt.shtml

相关文章

MySQL中间件Atlas

MySQL中间件Atlas atlas简介 Mysql 的 proxy 中间件有比较多的工具&#xff0c;例如&#xff0c;mysql-proxy(官方提供), atlas , cobar, mycat, tddl, tinnydbrouter等等。 而Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在…

【MySQL】数据库(分库分表)中间件对比

分区&#xff1a;对业务透明&#xff0c;分区只不过把存放数据的文件分成了许多小块&#xff0c;例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索引文件&#xff08;MYI&#xff09;进行了分割&#xff0c;分区后的表呢&#xff0c;还是一张…

数据库中间件详解

数据库中间件详解 原创&#xff1a; 田守枝 田守枝的技术博客 3月24日 1 数据库拆分过程及挑战 互联网当下的数据库拆分过程基本遵循的顺序是&#xff1a;垂直拆分、读写分离、分库分表(水平拆分)。每个拆分过程都能解决业务上的一些问题&#xff0c;但同时也面临了一些挑战。…

mysql优化---如何搭建mysql的主从关系和mycat中间件

1. 如何搭建mysql的主从关系 解决mysql高并发的瓶颈。 1.1 复制概述 复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQ…

什么是中间件

一、什么是中间件 中间件&#xff08;Middleware&#xff09;是处于操作系统和应用程序之间的软件&#xff0c;也有人认为它应该属于操作系统中的一部分。人们在使用中间件时&#xff0c;往往是一组中间件集成在一起&#xff0c;构成一个平台&#xff08;包括开发平台和运行平…

mysql的中间件比较

mysql分布式数据库中间件对比 目前数据库中间件有很多&#xff0c;基本这些中间件在下都有了解和使用&#xff0c;各种中间件优缺点及使用场景也都有些心的。所以总结一个关于中间件比较的系列&#xff0c;希望可以对大家有帮助。 1. 什么是中间件 传统的架构模式就是 应用连…

MySQL 中间件汇总比较

360 Atlas 较为活跃&#xff0c;Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上&#xff0c;对其进行了优化&#xff0c;增加了一些新的功能特性。360内部使用 Atlas 运行的 MySQL 务&#xff0c;每…

MySQL-中间件mycat(一)

目录 &#x1f341;mycat基础概念 &#x1f341;Mycat安装部署 &#x1f343;初始环境 &#x1f343;测试环境 &#x1f343;下载安装 &#x1f343;修改配置文件 &#x1f343;启动mycat &#x1f343;测试连接 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f9…

MySQL 分表方案及中间件介绍

背景 什么情况下需要分表&#xff1f;这里归纳了3点&#xff1a; (1)某个表被操作的频率过于频繁的时候&#xff08;可以查看某个表的访问频繁&#xff09;&#xff0c;在流量越来越大的时&#xff0c;可以考虑分表。 (2)某个表的数据量过于庞大的时候&#xff08;我给自己设…

中间件之MYSQL

体系结构 server层 负责建立连接、分析和执行 SQL 连接器&#xff1a;与客户端进行TCP三次握手&#xff1b;校验用户名和密码&#xff1b;读取权限。查询缓存&#xff1a;key-value缓存在mysql8.0后默认将其关闭&#xff1b;高级版本默认采用页缓存。解析器&#xff1a;词法…

mysql优化——mycat数据库中间件

文章目录 目录 文章目录 前言 一、mycat原理 二、mycat完成读写分离 2.1搭建MySQL的主从模式 2.2实现读写分离 三、mycat垂直分库 四、水平分表 五、水平拆分表的连表操作 六、全局表 总结 前言 Mycat是数据库中间件,所谓中间件,是一类连接软件组件和应用的计算机软件,以…

mysql中间件汇总

一、写在前面 mysql作为互联网公司都会用到的数据库&#xff0c;在使用过程中。会用主从复制来提高性能。会用分库分表解决写入问题。以下介绍mysql中间件的一些实现方案 二、Atlas Atlas时 360 公司开发维护的一个基于MySQL协议的数据中间层项目。 2.1 atlas架构 Atlas是一…

makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS

1、LDFLAGS & LIBS 关于makefile的依赖规则以及目标生成的步骤&#xff0c;这篇先不介绍&#xff0c;这里主要关注我在看makefile时遇到的一堆CFLAGS与LDFLAGS定义进行说明。 费了牛劲&#xff0c;才查到GNUmake中文手册中关于CFLAGS与LDFLAGS的说明&#xff0c;他们都是…

Makefile 编译与链接选项及CFLAGS与LDFLAGS说明

CFLAGS与LDFLAGS的说明&#xff0c;他们都是是隐含规则的变量&#xff0c;且是一种命令参数变量&#xff0e; makefile内嵌隐含规则的命令中&#xff0c;所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改&#xff1a;在Makefile中、通…

Go新项目-项目添加版本说明,以及参数传递:ldflags、gcflags,外加stripped说明(5)

在Go项目中&#xff0c;会存在展示该项目的版本信息&#xff0c;以及打包日期&#xff0c;项目版本&#xff0c;Go版本等&#xff1b;继Go新项目-编译项目的细节&#xff08;4&#xff09;以后再记录下编译优化方向&#xff0c;刚好也有项目版本输出的需求。 关键词&#xff1…

linux编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解

参考到下面博客&#xff0c;把编译步骤分解的很细 linuxC编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解 - yongfengnice - 博客园 CPPFLAGS : 预处理器需要的选项 如&#xff1a;-I (大写i指定头文件路径) CFLAGS&#xff1a;编译的时候使用的参数 –Wall –g -c LDFLAGS &…

【Java位运算】异或运算的使用

异或运算有个特性&#xff1a;两个相同的数做异或运算&#xff0c;结果为0。 n ^ n 0;常用的方式是查找数组中只出现一次的数字。 例如&#xff1a;在一个数组中&#xff0c;只有一个数字出现了一次&#xff0c;其余数字都出现了两次。 求这个数字。利用异或运算的特性进行计…

java中与运算,或运算,异或运算

Java的位运算符详解实例——与&#xff08;&&#xff09;、非&#xff08;~&#xff09;、或&#xff08;|&#xff09;、异或&#xff08;^&#xff09; 位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻…

Java中的与、或、非以及异或( | ~ ^)运算符的运算原理

首先&#xff0c;我们要知道Java存储数据是保存的补码&#xff0c;如果对原码、反码以及补码不太懂&#xff0c;可以参考我的另一篇博客。 1. Java的 与( & ) 运算 所有的逻辑运算都是按位计算的&#xff0c;所以第一步就是先把数据转成二进制&#xff0c;然后相应位进行…

java运算符 与()、非(~)、或(|)、异或(^)

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符&…