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核心配置文件)➡

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

①引入相关依赖的代码

java 复制代码
<!--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文件

java 复制代码
//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 configuration
        PUBLIC "-//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接口能不能正常映射到数据库。

java 复制代码
//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.Test
    void 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());
        //关闭session
        session.close();
    }

    @org.junit.jupiter.api.Test
    void 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分

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

相关推荐
智慧老师19 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
虾球xz40 分钟前
游戏引擎学习第55天
学习·游戏引擎
oneouto1 小时前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh321 小时前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
炭烤玛卡巴卡1 小时前
学习postman工具使用
学习·测试工具·postman
thesky1234562 小时前
活着就好20241224
学习·算法
蜗牛hb2 小时前
VMware Workstation虚拟机网络模式
开发语言·学习·php
汤姆和杰瑞在瑞士吃糯米粑粑2 小时前
【C++学习篇】AVL树
开发语言·c++·学习
虾球xz2 小时前
游戏引擎学习第58天
学习·游戏引擎
奶香臭豆腐3 小时前
C++ —— 模板类具体化
开发语言·c++·学习