SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第一天)Mybatis的学习

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第一天)Mybatis的学习

一、当前的主流框架介绍(这就是后期我会发出来的框架学习)

Spring框架

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的,其主要优势之一就是分层架构。Spring提供了更完善的开发环境,可以为POJO(Plain Ordinary Java Object,普通Java对象)对象提供企业级的服务。


Spring MVC框架

​ Spring MVC是一个Web开发框架,可以将它理解为Servlet。在MVC模式中,Spring MVC作为控制器(Controller)用于实现模型与视图的数据交互,是结构最清晰的。

Spring MVC框架采用松耦合、可插拔的组件结构,具有高度可配置性,与其他的MVC框架相比,具有更强的扩展性和灵活性。


MyBatis框架

​ MyBatis 是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis ,2013年11月MyBatis又被迁移到Github。

MyBatis是一个优秀的持久层框架,它可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(Object/Relation Mapping,即对象关系映射)实现。MyBatis封装性要低于Hibernate,但它性能优越、简单易学,在互联网应用的开发中被广泛使用。


Spring Boot 框架

​ Spring Boot 框架是 Pivotal 团队基于 Spring 开发的全新框架,其设计初衷是为了简化 Spring 的配置,使用户能够构建独立运行的程序,提高开发效率。

Spring Boot 框架本身并不提供 Spring 框架的核心特性及扩展功能,它只是用于快速、敏捷地开发新一代基于 Spring 框架的应用,同时它还集成了大量的第三方类库(如Jackson、JDBC、Redis 等),使用户只需少量配置就能完成相应功能。


Spring Cloud 框架

Spring Cloud 是一系列框架的有序集合为开发人员构建微服务架构提供了完整的解决方案,它利用Spring Boot 的开发便利性巧妙地简化了分布式系统的开发。例如,配置管理、服务发现、控制总线等操作,都可以使用 Spring Boot 做到一键启动和部署。可以说,Spring Cloud 将 Spring Boot 框架进行了再封装,屏蔽掉了复杂的配置和实现原理,具有简单易懂、易部署和易维护等特点。


那么开始今天的主题MyBatis的学习

二、什么是MyBatis?

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的半自动化持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的“XML”或“注解”进行配置和原始“映射”,将接口和Java的POJO映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

PS:(名词解释)

  1. XML(可扩展标记语言): XML 是一种标记语言,用于描述数据的结构和内容。它被广泛用于数据的存储、交换和表示。XML 使用标签来标识数据的不同部分,并使用元素、属性和文本来组织数据。XML 具有可扩展性,允许用户定义自己的标签和数据结构。由于其通用性和可扩展性,XML 在 Web 开发、数据传输、配置文件等领域都有广泛应用
  2. 注解(Annotation): 注解是一种元数据(metadata),可以应用于代码中的类、方法、字段等元素。**它们不会直接影响程序的执行,但可以提供额外的信息给编译器、解释器、工具和其他程序。在 Java 中,注解是以 @ 符号为前缀的特殊标记。**注解可以用于提供编译时的指示、运行时的处理、文档生成等。常见的 Java 注解包括 @Override表明是方法重写、@FunctionalInterface函数式接口、@Nullable表明元素可以为null、@Autowired 用于标记字段、构造器或方法,表示自动装配(自动注入)该组件 等(后面我会发一个常见注解的说明)
  3. 映射(Mapping):在编程中,映射通常指的是将一个数据或对象关联到另一个数据或对象的过程。这可以是不同数据结构之间的对应关系,比如数据库表的列与对象属性的对应关系,或者是 URL 路径与控制器方法的对应关系。在数据库中,对象-关系映射(ORM)指的是将数据库表映射到面向对象的类的过程。在 Web 开发中,URL 路由映射指的是将请求的 URL 映射到相应的处理程序或方法上。

​ MyBatis框架是一个ORM(Object/Relation Mapping,即对象关系映射)框架所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。ORM框架的工作原理可以通过一张图来展示。在这里插入图片描述

(这段加粗文字如果简单理解的话,那就是可以把Java中的数据类型自动转换识别成数据库的数据类型

当使用ORM框架将Java中的基本数据类型映射到数据库时,通常的映射规则如下:
  1. byte --> TINYINT
  2. short --> SMALLINT
  3. int --> INT
  4. long --> BIGINT
  5. float --> FLOAT
  6. double --> DOUBLE
  7. boolean --> BIT(对于MySQL和SQL Server等数据库),BOOLEAN(对于PostgreSQL等数据库)
  8. char --> CHAR(通常用于存储单个字符) String --> VARCHAR(通常用于存储字符串)

不同的数据库系统可能有不同的数据类型名称,因此在特定的数据库中可能会略有差异。此外,ORM框架也允许进行自定义配置,以适应不同的数据库需求。

此外,还有一些其他特殊类型,例如日期和时间类型,也可以在ORM中进行映射,比如:

  • java.util.Date 或 java.time.LocalDate --> DATE
  • java.util.Time 或 java.time.LocalTime --> TIME
  • java.util.Date 或 java.time.LocalDateTime --> DATETIME 或 TIMESTAMP

​ 上面这些就是我们学习Java常见的8种基本数据类型在数据库中的通用映射规则。但具体的映射规则可能会因不同的ORM框架或数据库而有所区别,因此在实际开发中,还是得根据实际情况和需求进行相应的配置和调整。

​ 了解完MyBatis的基本概念之后,我们就该到了如何使用MyBatis?想要使用首先就得引入,简单来说就是搭建MyBatis的开发环境。


三、如何搭建MyBatis的开发环境?

搭建环境的步骤如下:

  1. 创建工程后引入相关依赖。(本地lib导入jar包或者Pom.xml写入依赖信息,Maven方式导入)

  2. 数据库准备(就是指创建好准备链接的数据库) 。 比如:MySQL Oracle PostgreSQL

  3. 编写数据库连接信息配置文件(db.properties 、database.properties、dbconfig.properties

    、jdbc.properties都是指同一个文件,也就是数据库连接信息配置文件)

  4. 编写核心配置文件和映射文件。

​ 一般来说都不会自己去写,只有少部分会需要我们去写。大部分的都是可以去网上下载模板然后自己修改一下基本信息就可以用了。

引入依赖(Maven方式引入需要联网)➡编写配置文件(数据库连接信息配置文件、MyBatis核心配置文件)➡

这里简单讲解一下吧,方便理解。

①引入相关依赖的代码

<!--Pom文件编写依赖引入 只展示了其中一个依赖-- >
<dependencies><!-- MySQL Connector Java 引入java链接MySQL的依赖 --><dependency><groupId>mysql</groupId> <!-- 依赖名 --><artifactId>mysql-connector-java</artifactId> <!-- 组件名 ID --><version>8.0.11</version> <!-- 版本号 --></dependency><!-- 其他依赖项 -->...<!--尝试模仿并写出其他项依赖引入,写不出也可以去我资源找对应的文件下载,都是敲好的-->
</dependencies>

③db.properties文件

//db.properties文件# MySQL数据库驱动程序类名
mysql.driver=com.mysql.cj.jdbc.Driver# MySQL数据库连接URL,指定主机、端口、数据库名称和其他参数
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false# MySQL数据库用户名
mysql.username=root# MySQL数据库密码
mysql.password=root

④mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 加载 db.properties 文件 --><properties resource="db.properties"/><environments default="development"><!-- 设置开发环境 --><environment id="development"><!-- 使用 JDBC 事务管理器 --><transactionManager type="JDBC"/><!-- 使用 POOLED 数据源 --><dataSource type="POOLED"><!-- 指定数据库驱动程序 --><property name="driver" value="${mysql.driver}" /><!-- 指定数据库连接 URL --><property name="url" value="${mysql.url}" /><!-- 指定数据库用户名 --><property name="username" value="${mysql.username}" /><!-- 指定数据库密码 --><property name="password" value="${mysql.password}" /></dataSource></environment></environments>
</configuration>

​ 使用POOLED数据源的意思是:它表示使用连接池数据源,“POOLED” 是Maven配置文件中 <dataSource> 配置项的一个属性值

​ 连接池是一组预先创建并管理的数据库连接。当应用程序需要与数据库进行交互时,它可以从连接池中获取一个可用的数据库连接,执行操作完成后再将连接放回连接池,而不是每次都创建和关闭连接。这种方式可以提高性能和效率,避免了频繁创建和销毁数据库连接的开销。

​ 具体到这个配置文件中,<dataSource type="POOLED"> 指定了使用 POOLED 数据源类型。通过这个配置,Maven将会根据数据库连接信息和连接池配置参数,创建一个连接池数据源供应用程序使用。这样,在应用程序需要进行数据库操作时,它可以从这个连接池中获取连接,而不是每次都重新创建新的连接,从而提高性能和效率。

​ 到这里环境就已经搭建好了。


四、编写MyBatis入门程序

​ ①:数据库准备➡②:pojo类编写➡③:mapper文件(sql语句)编写➡④:mybatis-config文件中添加mapper文件resources的地址➡⑤:编写测试类。


​ 首先要准备好一个要链接的数据库,编写好数据设计语句,设计表的同时呢,插入俩条语句进去,这样方便我们后续测试。记得若是链接的数据库有改变,那么我们前面的数据库链接信息配置文件也需要修改,就是db.properties。

​ 首先我们要新建实体类上面也有提到的pojo包(普通JAVA对象),这里的话就要与数据库的表字段一一对应,这样才能映射过去。一般来说一个表对应一个类,也就是一个对象。

​ 如下图:我们采用的PasswordMS表中的结构如下:

在这里插入图片描述

那么我们的pojo包下的成员变量应该是这样子定义的:

在这里插入图片描述

​ 字段名和变量名一一对应。不要忘了生成Getter和Setter方法,因为我们的访问修饰符是private私有的,那么如果不开放公共的方法来设置或获取变量的值,这样的话会导致只有在类的内部能够访问到,所以不能忘记嗷,这也是面向对象的设计原则之一,也是封装的基本特征,合理开放,合理暴露。

​ 编写一下Mapper.xml,里面编写sql语句,动态sql语句,这里我们要针对一下数据库表的关系,然后去对java对象进行一个映射,关系有一对一、一对多等。越复杂的sql编写,需要注意的点就越多。

​ 编写mapper,需要在标签对里面

在这里插入图片描述

编写mapping文件路径配置,在mybatis-config.xml中下。这样mybatis才能够识别我们的mapper文件,才能够使用映射语句,不会导致出错。

在这里插入图片描述

因为我们前面引入了Junit测试依赖,那么就简单编写一下测试类吧,看看我们编写的Mapper接口能不能正常映射到数据库。

//PasswordMSTest.java
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import pojo.PasswordMS;import java.io.IOException;
import java.io.Reader;
import java.util.List;class PasswordMSTest {private Logger logger= Logger.getLogger(PasswordMSTest.class);@org.junit.jupiter.api.Testvoid getUid() {//读取文件名:String resources="mybatis-config.xml";//创建流Reader reader = null;try{reader = Resources.getResourceAsReader(resources);}catch (IOException e){e.printStackTrace();}//初始化mybatis数据库,创建SqlSessionFactory类的实例SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//创建SqlSession实例SqlSession session = sqlSessionFactory.openSession();//传入参数查询,返回结果PasswordMS passwordMS = session.selectOne("findById",1);logger.info("姓名:"+passwordMS.getAccount()+",密码:"+passwordMS.getPassword()+",网站:"+passwordMS.getWebsiteName());//关闭sessionsession.close();}@org.junit.jupiter.api.Testvoid getAllItem() {//读取文件名:String resources="mybatis-config.xml";//创建流Reader reader = null;try{reader = Resources.getResourceAsReader(resources);}catch (IOException e){e.printStackTrace();}//初始化mybatis数据库,创建SqlSessionFactory类的实例SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//创建SqlSession实例SqlSession session = sqlSessionFactory.openSession();//传入参数查询,返回结果List<PasswordMS> passwordMS = session.selectList("findAll");for(PasswordMS s:passwordMS){logger.info("id:"+s.getId()+",账号:"+s.getAccount()+",密码:"+s.getPassword()+",网站名:"+s.getWebsiteName()+",网站网址:"+s.getWebsiteURL()+",网站缩略图:"+s.getWebsiteImage()+",账号描述:"+s.getAccountDescription());//关闭session// }session.close();}
}
}

这里的代码逻辑用讲么?如果是有学过java基础和java高级编程的,应该代码逻辑都是能看懂得。

这里可以推荐看看我发的学习记录,基本上有看完,都是可以理解的。

输出结果如下图:

在这里插入图片描述

与数据库中写入的完全一致,若是出现NUll值,可能就是pojo类编写不正确,没有字段名和变量名一直,其次可能是映射类型不对等,认真往上翻看看嗷。

PS:关于findAll的sql映射语句需要自己在PasswordMSMapper.xml中编写完成嗷


Mybatis的工作原理:

*在这里插入图片描述

MyBatis框架在操作数据库时,大体经过了8个步骤。下面结合MyBatis工作原理图对每一步流程进行详细讲解,具体如下。

(1)MyBatis读取核心配置文件mybatis-config.xml:mybatis-config.xml核心配置文件主要配置了MyBatis的运行环境等信息。

(2)加载映射文件Mapper.xml:Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。

(3)构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建SqlSession。

(4)创建会话对象:由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。

(5)创建执行器:会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存地维护。

(6)封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装到MappedStatement对象中。

(7)操作数据库:根据动态生成的SQL操作数据库。

(8)输出结果映射:执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。


总结

​ 这是第一天对SSM框架的学习,先初识Mybatis,了解什么是半自动化持久层框架、映射、pojo、连接池连接数据源等。想要跟着学习的可以去我的资源里面找对应的文件下载,我的md文件也会发上去,项目文件会上传可以自己跟着学习一下。上面的只是简单的俩个查询的例子,可以自己完善一下增删改查的实例。

作者:Stevedash

发表于:2023年8月20日 21点45分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

VMware虚拟安装Ubuntu,然后切换Ubuntu内核版本

无论你选择哪种方法&#xff0c;一旦进入 GRUB 引导菜单&#xff0c;你应该能够选择需要的内核版本并启动系统。 打开终端&#xff1a;你可以通过按下 Ctrl Alt T 快捷键来打开终端。 使用 sudo&#xff1a;切换内核需要管理员权限&#xff0c;因此你需要使用 sudo 命令。首…

【Spring Boot】构建RESTful服务 — 实战:实现Web API版本控制

实战&#xff1a;实现Web API版本控制 前面介绍了Spring Boot如何构建RESTful风格的Web应用接口以及使用Swagger生成API的接口文档。如果业务需求变更&#xff0c;Web API功能发生变化时应该如何处理呢&#xff1f;可以通过Web API的版本控制来处理。 1.为什么进行版本控制 …

C++--深入类和对象(下)

续接上篇&#xff0c;接着来谈我们的类和对象的深入的知识&#xff0c;话不多说&#xff0c;我们即刻出发...... 目录 1.友元 1.1友元函数 输出流运算符的重载 1.2友元类 2.再谈构造函数 2.1构造函数体赋值和初始化列表 构造函数体赋值为何不能叫做初始化&#xff1f; …

ChatGPT-4: 半年的深度使用思考

几个月的时间一直在使用 ChatGpt-4&#xff0c;以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提&#xff1a;我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本&#xff0c;实际上使用体验是非常差的&#xff0c;主要体现在答非所问上。…

[C语言]分支语句和循环语句

[C语言]分支语句和循环语句 文章目录 [C语言]分支语句和循环语句C语言语句分类分支语句if语法结构else的匹配规则switch语句switch语句中的breakswitch语句中default 循环语句while循环while循环中的break和continuefor循环for循环中的break和continuefor循环的变种do while循环…

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…

基于Pytorch实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

Java版本+企业电子招投标系统源代码+支持二开+Spring cloud tbms

​ 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以…

【广州华锐互动】3D空间编辑器:一款简洁易用的VR/3D在线编辑工具

随着虚拟现实技术的不断发展&#xff0c;数字孪生技术的应用已经被广泛应用于产品设计和制作中&#xff0c;能充分发挥企业应用3D建模的优势&#xff0c;凸显了三维设计的价值&#xff0c;在生产阶段也能够充分发挥3D模型的作用。 如今&#xff0c;广州华锐互动开发的3D空间编辑…

C#程序配置读写例子 - 开源研究系列文章

今天讲讲关于C#的配置文件读写的例子。 对于应用程序的配置文件&#xff0c;以前都是用的ini文件进行读写的&#xff0c;这个与现在的json类似&#xff0c;都是键值对应的&#xff0c;这次介绍的是基于XML的序列化和反序列化的读写例子。对于ini文件&#xff0c;操作系统已经提…

动态内存开辟

动态内存开辟 1.动态内存开辟相关试题 题目1&#xff1a; void GetMemory(char *p) {p (char *)malloc(100); } void Test(void) {char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }解释&#xff1a;这里在Test函数中&#xff0c;只是将…

【Matter】基于Ubuntu 22.04搭建matter开发环境:chip-tool 配网之 matter-over-wifi

前言 主要是记录一下学习过程&#xff0c;梳理下思路&#xff0c;抛转~ 官方的开发环境&#xff0c;基于Linux版本&#xff0c;官方的环境是基于树莓派环境的&#xff0c;原理其实也比较明了&#xff0c;目的也比较明确&#xff0c;就是达到Linux 主机和wifi 路由在同一局域网…

flink jira 提交开源bug

注册apache issue账号,并申请flink空间的权限后. 提问题/bug 查看已经提交的问题:

获取excel中的图片(包含wps中嵌入单元格图片)

项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图: 问题来了,如何获取图片 并且将图片与单元格进行对应 …

Spring Boot+Redis 实现消息队列实践示例

Spring BootRedis 实现一个轻量级的消息队列 文章目录 Spring BootRedis 实现一个轻量级的消息队列0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码 4.总结答疑 5.参考文档6. Redis从入门到精通系列文章 0.前言 本文将介绍如何利用Spring Boot与Redis结合实现…

uni-app自定义多环境配置,动态修改appid

背景 在企业级项目开发中&#xff0c;一般都会分为开发、测试、预发布、生产等多个环境&#xff0c;在工程化中使用不同的打包命令改变环境变量解决不同环境各种变量需要手动修改的问题&#xff0c;比如接口请求地址&#xff0c;不同环境的请求路径前缀都是不同的。在使用uni-…

【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

访问html页面 如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可&#xff0c;下面我们对HttpResponseServlet这个类做一些改造 package com.tomcatServer.domain;import com.tomcatServer.utils.ScanUtil;import java.io.IOException; import java.io…

Android企业项目开发实训室建设方案

一 、系统概述 Android企业项目开发作为新一代信息技术的重点和促进信息消费的核心产业&#xff0c;已成为我国转变信息服务业的发展新热点&#xff1a;成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网&#xff0c;以其巨大的信息交换能力和快速渗透…

Postman返回了一个html页面

问题记录 调用公司的测试环境接口&#xff0c;从浏览器控制台接口处cCopy as cURL(cmd)&#xff0c;获取完整的请求内容&#xff0c;然后导入postman发起请求 提测时发现返回一个html页面&#xff0c;明显是被请求在网管处被拦截了&#xff0c;网关返回的这个报错html页面 …

商城-学习整理-高级-商城业务-Sentinel限流熔断降级Sleuth+Zipkin链路追踪(二十二)

目录 一、秒杀系统的架构二、SpringCloud Alibaba-Sentinel简介1、熔断降级限流什么是熔断什么是降级异同&#xff1a;什么是限流 2、Sentinel 简介官方文档&#xff1a;Sentinel 具有以下特征:Sentinel 分为两个部分: 3、Hystrix 与 Sentinel 比较4、整合 FeignSentinel 测试熔…