【MyBatis篇】MyBatis框架基础知识笔记

news2024/11/25 15:35:36

目录

ORM思想(对象关系映射思想)

ORM思想图解

初识MyBatis

什么是MyBatis呢?

JDBC弊端

自己总结:

chatGPT总结:

MyBatis介绍以及本质分析

JDBC编程的劣势,MyBatis提供了以下解决方案,具体如下。

MyBatis环境搭建

         配置依赖案例演示:

MyBatis环境搭建步骤

我的第一个MyBatis

项目树

         mybatis-config.xml文件

UserMapper.xml文件

db.properties文件

pom.xml文件


ORM思想(对象关系映射思想)

ORM(对象关系映射)是一种编程思想和技术,用于将关系型数据库中的表结构映射到面向对象编程语言中的对象模型。我们介绍的MyBatis框架也是实现了ORM思想的;

ORM 的基本思想是通过定义对象和数据库表之间的映射关系,使得开发人员可以像操作对象一样操作数据库,而不需要直接编写SQL语句。

ORM 的优点包括:

  1. 简化开发:ORM 提供了一种易于理解和使用的编程模型,开发人员可以直接使用对象的方法和属性来操作数据库,从而免去了复杂的SQL语句和数据库细节。

  2. 提高可维护性:通过将数据库和应用程序的逻辑分离,使得代码更加模块化和可维护。当数据库结构改变时,只需更新映射定义,而不需要修改大量的业务逻辑代码。

  3. 提高可移植性:ORM 可以隐藏不同数据库之间的差异,使得应用程序可以比较容易地切换或同时支持多种数据库。

  4. 提供对象级的查询和持久化:ORM 不仅提供了方便的增删改查操作,还支持复杂的查询和关联操作,可以方便地处理对象之间的关系。

除MyBatis外常见的其他ORM框架包括Hibernate(Java)、Django ORM(Python)、Entity Framework(.NET)等。这些框架都提供了一套映射规则和API,使得开发人员可以更轻松地进行数据库操作,提高开发效率和代码质量。

ORM思想图解(图来自动力节点课堂笔记)

初识MyBatis

什么是MyBatis呢?

我在之前学完java基础之后,学习了Javaweb,随后学习了使用java连接数据库的技术JDBC,JDBC就是连接数据库的一种工具,然而MyBatis实际上就是对JDBC的再一次封装,他大大的节约了代码的书写量,以及改进了JDBC在实际使用中的一些弊端;

JDBC弊端

自己总结:

 1、 连接数据库时需要频繁的创建连接,并释放连接;
 2、 项目中的sql语句都是硬编码,违背了开闭原则,所谓开闭原则就是强调软件实体(类、模块、函数等)应该对扩展开放,对修改关闭;
 3、 使用preparedstatement对象处理sql语句时(使用占位符来为参数占位,然而参数的个数是动态的),根据参数的个数不同,需要不时地的修改代码,或者书写很多冗余的代码;
 4、 项目中一旦SQL语句变化,也要在底层改动很多地方(不同的SQL语句得到的结果集都会不同,因此处理结果集的代码就会有所不同);
 5、 查询后得到的结果集,转换成对应的java类需要很负责的步骤;(处理结果集过程)

chatGPT总结:

 相对于 MyBatis,JDBC 的一些缺点包括:  ​  

1、 冗余的代码:JDBC 需要手动编写大量的重复性代码,如数据库连接和关闭、SQL语句的拼接、结果集的处理等,使开发过程显得冗长而繁琐。  

2、 容易出现安全问题:由于需要手动拼接 SQL 语句,存在 SQL 注入的风险。开发人员必须小心防范并处理 SQL 注入攻击,增加了安全风险。  

3、 处理事务困难:JDBC 需要手动管理事务,包括事务的开启、提交和回滚。在复杂的业务操作中,需要编写大量的事务管理代码,容易出错且难以维护。  

4、 面向细节:JDBC 是低层次的API,需要开发人员手动处理数据库的细节,如连接池管理、异常处理、批量操作等。这增加了开发的复杂性和难度,容易出现错误和性能问题。  ​  

相对于 JDBC,MyBatis 是一个优秀的 ORM 框架,它克服了上述问题,提供了更高级别的抽象和便利,具有以下优点:  ​  

1、 声明式的 SQL:MyBatis 使用 XML 或注解来定义 SQL 语句,并提供了强大的动态 SQL 功能,简化了 SQL 的编写和维护。  

2、 简化的数据库操作:MyBatis 提供了简洁的 API,将数据库连接、SQL 执行、结果集映射等细节封装起来,减少了冗余的代码量。  

3、 对象关系映射:MyBatis 支持对象关系映射,可以将查询结果直接映射为对象,方便了开发人员对数据库结果的操作和处理。  

4、 缓存机制:MyBatis 内置了缓存机制,可以缓存查询结果,提高系统的性能和响应速度。  

5、 声明式事务:MyBatis 提供了声明式事务管理的支持,通过配置和注解实现事务的开启、提交和回滚,简化了事务管理的操作。  ​  

综上所述,相对于 JDBC,MyBatis 提供了更高级别的抽象和便利,简化了数据库操作,提高了开发效率和代码的可维护性。

MyBatis介绍以及本质分析

MyBatis作为一个优秀的持久层框架,它对JDBC操作数据率的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理注册驱动 创建Connertion对象、创建Statement对象、手动设置参数结果集检索等JDBC繁杂的过程代码。

JDBC编程的劣势,MyBatis提供了以下解决方案,具体如下。

问题一:频繁地创建、释放数据库连接会造成系统资源浪费,从而影响系统性能。

解决方案:在SqlMapConfig.xml 中配置数据连接池,使用数据库连接池管理数据库连接

问题二:代码中的SQL语句硬编码,会造成代码不易于维护。在实际应用的开发中,SOL变化的可能性较大。在传统JDBC编程中,01变动金发更改nva代码,违反了开闭原则。软件实体对打

解决方案:MyBatis将SQL语句配置在MyBatis的映射文件(***mapper.xml文件)中,实现了与Java代码的分离。

问题三:使用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不确定,如果有修改SQL的需求,必须要修改代码,这样会导致系统难以维护。

解决方案:MyBatis自动将Java对象映射至SQL语句,通过Statement中的 parameterType定义输入参数的类型。

问题四:JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,使得系统不易于维护

解决方案:MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。

MyBatis环境搭建

创建工程,引入依赖(因为学过Maven技术,所以无须自己下载MyBatis驱动jar包,只需要在配置文件(pom.xml)中配置即可)使用Maven仓库技术;

这里插入一个小知识点:工程(project)和模块(module)的关系是,一个工程(project)可以包含多个模块(module);

配置依赖案例演示:

MyBatis环境搭建步骤

1、 创建工程  

2、 引入驱动jar包(Maven仓库技术)

3、 创建对应的数据库中的数据表格  

4、 创建数据库连接信息配置文件,db.properties文件  

5、 创建MyBatis的核心配置文件(mybatis——config.xml文件)这个文件一个模块中仅有一个

我的第一个MyBatis

具体实现步骤:

 1、 创建数据库中的数据

 2、 创建pojo实体、或者也可以称为Javabean或者dao

 3、 创建映射文件***Mapper.xml文件(一个模块中可能会处理多张表格,其中一个表格对应一个Mapper.xml文件)

 4、 将***Mapper.xml文件的路径配置到MyBatis-config.xml文件中

 5、 在项目的test路径下编写测试代码

项目树

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>

<!--  加载类路径下的属性配置文件   -->
    <properties  resource="db.properties"/>

    <!-- 默认使用的环境 ID(比如:default="development")
    也就是说我们可以配置多套<environment>环境-->
    <environments default="development">
        <!--
           每个 environment 元素定义的环境 ID
           -->
        <environment id="development">
            <!--
                transactionManager 事务管理器
                type的值有JDBC和MANAGED
                    JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
            -->
            <transactionManager type="JDBC"/>
            <!--
              dataSourcedataSource 数据源 dbcp c3p0 druid
              type="[UNPOOLED|POOLED|JNDI]"
              POOLED意思有连接池的连接
              UNPOOLED意思没有连接池的连接
              -->
            <dataSource type="POOLED">
                <!--                JDBC 驱动-->
                <property name="driver" value="${mysql.driver}"/>
                <!--                url数据库的 JDBC URL地址。-->
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>

                <!--            defaultTransactionIsolationLevel – 默认的连接事务隔离级别。&ndash;&gt;-->
                <!--            <property name="defaultTransactionIsolationLevel" value=""/>-->

                <!--            defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)&ndash;&gt;-->
                <!--            <property name="efaultNetworkTimeout" value=""/>-->

            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 使用相对于类路径的资源引用 -->
                <mapper resource="mapper/UserMapper.xml"/>
        <!-- 使用完全限定资源定位符(URL)
        不推荐使用
        <mapper url="E:\JetBrains\mybatis学习\Mybatis-study\Mybatis-03\src\main\java\asia\xiaojiang\mybatis03\dao\UserMapper.xml"/>
        -->

        <!-- 使用映射器接口实现类的完全限定类名
         使用注意点:
            接口和其配置文件必须同名, 必须在同一个包下
         -->
<!--        <mapper class="asia.xiaojiang.mybatis03.dao.UserMapper"/>-->
        <!-- 将包内的映射器接口实现全部注册为映射器
        使用包扫描注意点:
            接口和其配置文件必须同名, 必须在同一个包下
        -->
        <!--        <package name="asia.xiaojiang.mybatis03.dao"/>-->
    </mappers>

</configuration>

UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
         mapper为映射的根节点,namespace指定Dao接口的完整类名,
         mybatis会根据这个接口动态的创建一个实现类
         去实现这个接口,而这个实现类是一个Mapper对象
    -->
<mapper namespace="com.lyp.pojo.User">

    <!--定义接口方法对应的 SQL 语句-->
    <select id="findById"
            parameterType="int" resultType="com.lyp.pojo.User">
        select * from users where uid=#{id}
    </select>


</mapper>

db.properties文件

mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&\
  characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=123456

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

   

</project>

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

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

相关文章

星辰天合 CEO 胥昕受邀参加人民网 2023 “小巨人”发展论坛

为进一步推动专精特新“小巨人”企业高质量发展&#xff0c;近日&#xff0c;由人民网主办&#xff0c;人民网财经研究院、828 企业服务平台共同承办的 2023“小巨人”发展论坛在人民日报社新媒体大厦举行&#xff0c;星辰天合 CEO 胥昕受邀参加。 2023 “小巨人”发展论坛现场…

基于Pytorch构建Faster-RCNN网络进行目标检测的一段插曲-安装GPU环境

因工作原因&#xff0c;原来的台式机工作站发生了变更&#xff0c;除了GPU显卡&#xff08;NVIDIA GeForce GTX 1660显卡变成了NVIDIA Quadro P2200显卡&#xff09;以外&#xff0c;其他配置都差不多&#xff0c;从网上查阅NVIDIA Quadro P2200相当于NVIDIA GeForce GTX 1660显…

commet与websocket

commet与websocket Comet 前言 Comet是一种用于web的技术&#xff0c;能使服务器能实时地将更新的信息传送到客户端&#xff0c;而无须客户端发出请求&#xff0c;目前有两种实现方式&#xff0c;长轮询和iframe流。 实现方式 长轮询 长轮询是在打开一条连接以后保持&…

visual studio 2008 编译项目出现层次不穷问题枚举

文章目录 1、严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1047 对象或库文件“.lib”是使用与其他对象(如“x64\Release\main.obj”)不同的1、错误原因 2、意外的预编译头错误,只需重新运行编译器就可能修复此问题3、 warning LNK4099: 未找到 PDB“vc90.pdb”(使用“..…

【数据结构与算法系列3】有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 …

JavaScript学习笔记01

JavaScript笔记01 什么是 JavaScript JavaScript 是一门世界上最流行的脚本语言&#xff0c;它是一种弱类型的脚本语言&#xff0c;其代码不需要经过编译&#xff0c;而是由浏览器解释运行&#xff0c;用于控制网页的行为。 发展历史 参考&#xff1a;JavaScript的起源故事…

AbstractQueuedSynchronizer--AQS

概述&#xff1a;全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架特点&#xff1a; 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#xff0c;子类需要定义如何维护这个状态&#xff0c;控制如何获取锁和释放…

第9篇:ESP32超声波HC-SR04Arduino类库编写

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloworld第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播放音乐《涛声…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

我的创作纪念日:一个特别的纪念日

一个特别的纪念日 机缘收获日常成就憧憬 &#x1f4a1;一个热爱分享高性能服务器后台开发知识的博主&#xff0c;目标是通过理论与代码实践的结合&#xff0c;让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域&#xff0c;包括C/C、Linux、中间件、数据库、云…

【C++学习笔记】7、常量

文章目录 【 1、常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2、常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。常量可以是任何的基本数…

网络安全合规-DSMM

DSMM&#xff08;Data Security Management Model&#xff09;是一种数据安全管理模型。该模型以数据为中心&#xff0c;从数据的生命周期入手&#xff0c;从数据发布、使用、共享、存储、删除等几个方面来管理数据安全。 DSMM提供了一些有效的数据安全管理原则和策略&#xf…

ArcGIS Engine10.2 Setup 报错

00 问题重述 当我尝试安装ArcGIS Engine时弹出错误&#xff1a;ArcGIs 10,2 Engine cannot be installed on your machine.ArcGIs 10,2 Engine requires Microsoft ,NET Framework 3.5sp1, Which has not been found on your system, If you want to download and install Mic…

Ubuntu18.04系统下通过moveit控制kinova真实机械臂,并用python脚本到达固定点

测试工作空间&#xff1a;test_ws Kinova机械臂型号&#xff1a;m1n6s300 双臂模型中的左臂 测试功能包为kinova-ros官方包 一、读取kinova机械臂末端执行器位姿及tf小知识 1. tf小知识之获取两个连杆坐标系的位姿关系&#xff0c;非常有用&#xff0c;非常有用&#xff0c;非…

Unity中Shader的变体shader_feature(青莲地心火 o.o )

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性&#xff0c;用于配合shader_feature来控制…

Flask狼书笔记 | 05_数据库

文章目录 5 数据库5.1 数据库的分类5.2 ORM5.3 使用Flask_SQLAlchemy5.4 数据库操作5.5 定义关系5.6 更新数据库表5.7 数据库进阶小结 5 数据库 这一章学习如何在Python中使用DBMS&#xff08;数据库管理系统&#xff09;&#xff0c;来对数据库进行管理和操作。本书使用SQLit…

02JVM_垃圾回收GC

二、垃圾回收GC 在堆里面存放着java的所有对象实例&#xff0c;当对象为“死去”&#xff0c;也就是不再使用的对象&#xff0c;就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器&#xff0c;当一个对象被其他变量引用时这个对象…

软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路 前后端分离架构服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进&#xff1a;应用服务器和数据库服务器分开部署3. 第二次演进&#xff1a;引入本地缓存和分部署缓存4. 第三次演进&#xff1a;引入反向代理和负…

SQL语句如何生成PDM文件

首先我们先了解一下什么是PDM 物理数据模型&#xff08;PDM&#xff09;是数据库设计和管理过程中的重要组成部分&#xff0c;具有以下好处&#xff1a; 可视化数据库结构&#xff1a; PDM提供了一个直观的方式来可视化数据库的结构&#xff0c;包括表、列、索引、关系等。这使…

数据结构与算法学习(day4)——解决实际问题

前言 在本章的学习此前&#xff0c;需要复习前三章的内容&#xff0c;每个算法都动手敲一遍解题。宁愿学慢一点&#xff0c;也要对每个算法掌握基本的理解&#xff01; 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法&#xff0c;今天我们来实践一下前面的三种算法。…