MyBatis深度剖析:从入门到精通的实践指南

前言

什么是mybatis?

MyBatis是一款优秀的持久层框架,用于简化Java应用程序与数据库之间的交互

 什么是框架,为什么需要框架技术?

  • 框架技术
    • 是一个应用程序的半成品
    • 提供可重用的公共结构
    • 按一定规则组织的一组组件
  • 框架优势:
    • 不用再考虑公共问题
    • 专心在业务实现上
    • 结构统一,易于学习、维护
    • 新手也可写出好程序
  • 框架缺点(对于新手):
    • 对于没有基础的新手老说,学习框架意味着更多的学习成本

简而言之,使用框架技术,可以帮助我们快速的构建一个项目的基本结构,使得我们不必重复书写一些繁琐的代码,释放程序员的精力,从而使得程序员可以更加关注业务代码的实现

 什么是持久层框架?

持久化是程序数据在瞬时状态和持久状态间转换的过程

简单讲,就是将我们内存中运行的数据保存在数据库中,即使我们停止程序的运行,数据仍然存在在数据库中,而不会消失。

 MyBatis的起源和特点

一、MyBatis的起源与发展

  • MyBatis最初是Apache的一个开源项目iBatis,2010年该项目由Apache Software Foundation迁移到了Google Code,并改名为MyBatis。
  • 2013年11月,MyBatis项目迁移到Github,至今仍在持续更新和发展。
  • 当前,MyBatis的最新版本是3.5.x系列,如3.5.13等,这些版本在功能和性能上不断优化,以满足开发者的需求。

二、MyBatis的特点

  1. 简化JDBC开发:MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建Statement等繁杂的过程,开发者只需要关注SQL语句本身。
  2. 支持定制化SQL:MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(对象关系映射)实现。
  3. 灵活性与易用性:MyBatis提供了XML或注解两种方式来配置和映射原生信息,使得开发者可以根据项目需求灵活选择。同时,MyBatis的架构清晰,易于学习和使用。
  4. 性能优秀:MyBatis采用了一级缓存和二级缓存机制,可以有效地减少与数据库的交互次数,提高数据库操作的性能。
  5. 易于集成和扩展:MyBatis与Spring等主流Java框架无缝集成,可以通过简单的配置完成整合。同时,MyBatis提供了插件机制,可以自定义插件来扩展其功能。

三、MyBatis的工作原理

MyBatis的工作流程大致可以分为以下几个步骤:

  1. 加载配置并初始化:MyBatis在启动时会加载配置文件(如mybatis-config.xml),将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),并存储在内存中。
  2. 接收调用请求:当开发者通过MyBatis提供的API调用数据库操作时,会传入SQL的ID和参数对象。
  3. 处理操作请求:MyBatis会根据SQL的ID查找对应的MappedStatement对象,并根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL语句和参数。然后,MyBatis会获取数据库连接,执行SQL语句,并处理执行结果。
  4. 返回处理结果:MyBatis将执行结果按照MappedStatement对象中的结果映射配置进行转换处理,并最终将处理结果返回给开发者。

四、MyBatis的应用场景

MyBatis广泛应用于各种Java应用程序中,特别是在需要频繁进行数据库操作的场景下。例如,在电商系统、金融系统、CRM系统等中,MyBatis都发挥着重要的作用。通过MyBatis,开发者可以更加高效、便捷地进行数据库操作,提高开发效率和系统性能。

综上所述,MyBatis是一款功能强大、灵活易用的持久层框架,它简化了Java应用程序与数据库之间的交互过程,提高了开发效率和系统性能。

 Mybatis简介

  • MyBatis前身是iBatis,本是Apache的一个开源的项目
  • 官方网站
    • mybatis(国内可能访问不到)
  • ORM框架
    • 实体类和SQL语句之间建立映射关系
  • 特点
    • 基于SQL语法,简单易学
    • 能了解底层封装过程
    • SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
    • 方便程序代码调试
  • MyBatis 是支持普通SQL查询,动态sql和高级结果映射的优秀持久层框架。
  • MyBatis 几乎封装了所有必须但是又重复、繁琐的JDBC 代码
  • MyBatis 使用简单的 XML 方式进行主要的配置和SQL映射配置,从而将接口的方法映射到sql,将 Java 的POJOs(Plan Old Java Objects,普通的 Java象)映射成数据库中的记录。

MyBatis入门实践-查询用户信息

我将通过一个基础的mybatis查询mysql数据表的操作,演示mybatis开发的整体流程 

 Mybatis执行流程分析:

 书写mybatis的基本步骤:

1. 导包
2.实体类 (注意:属性名最好和字段命名一致,这样就可以不用手动映射了)
3.主配置文件
4.读取主配置文件和获取SqlSession对象的工具类
SqlSessionFactoryUtil
SqlSession=factory.openSession();
5.创建接口
6.创建mapper ,namespace就是接口的完整路径
7.编写相应的标签,id是与其绑定的接口的方法名,resultType是返回值类型,如果是集合,可以设置为它的泛型(实体类类型)
8.将mapper的完整路径注册在mybatis.xml主配置文件的<envoriments>的下面 
<mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>    

</mappers>

9.编写测试类
Dao dao=new Sqlsession.getMapper(Dao.class);
dao.调用定义的方法

完整项目结构如下:

我创建的是JavaWeb项目(有webapp目录),实际上在这个项目中,只需要创建一个普通的maven项目即可

 第一步:打开idea,创建一个maven项目,导入相关依赖包

pom.xml:

导入如下四个依赖:

其中:

mysql-connector-javamybatis是实现mybatis必须导入的依赖。

junit和lombok是为了进行单元测试和使用lombok注解简化开发而导入的依赖。

<!--junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--jdbc连接数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>

 第二步:创建数据库表和对应的实体类

例如:

用户表t_user

user_pic存放着用户的头像的照片全名,在这个项目中实际上可以没有这个字段

User实体类

实体类的属性命名如果和字段名一致,后面书写sql语句时就不需要手动进行映射,如果不一致,需要进行映射。

package entity;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {private Integer userId;private String userName;private String password;private String userPic;}

 第三步:创建myabtis的主配置文件

mybatis.xml

配置连接数据库的相关参数

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/csx_demo?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone = GMT"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments>
</configuration>

 第四步:创建读取主配置文件和获取SqlSession对象的工具类

SQLSessionFactoryUtil

目的是为了创建一个SqlSessionFactory会话工厂,并且返回SqlSession会话。

package util;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 java.io.IOException;
import java.io.Reader;public class SQLSessionFactoryUtil {private static SqlSessionFactory factory;private SQLSessionFactoryUtil(){}static {Reader reader=null;try{reader= Resources.getResourceAsReader("mybatis.xml");factory=new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession getSessionSql(){return factory.openSession();}
}

第五步:创建DAO层的接口

UserDao

package dao;import entity.User;import java.util.List;public interface UserDao {public List<User> selectUsers();
}

第六步:创建mapper.xml配置文件绑定接口和sql的映射关系,定义SQL语句

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--mapper为映射的根节点,用来管理DAO接口 namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象-->
<mapper namespace="dao.UserDao"><select id="selectUsers" resultType="entity.User">select user_id as userId,user_name as userName from t_user</select><!--id = "接口中的方法名"parameterType = "接口中传入方法的参数类型"resultType = "返回实体类对象:包.类名"  处理结果集 自动封装注意:sql语句后不要出现";"号查询:select标签增加:insert标签修改:update标签删除:delete标签-->
</mapper>

第七步:将mapper的完整路径注册在mybatis.xml主配置文件下

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/csx_demo?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone = GMT"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers>
</configuration>

第八步:编写测试类,测试sql

UserTest

如果有多个测试,可以将SqlSession放在@Before注解下的方法中进行初始化操作

import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;import org.junit.Before;
import org.junit.Test;
import util.SQLSessionFactoryUtil;public class UserTest {private SqlSession sqlSession;@Beforepublic void testBefore(){sqlSession= SQLSessionFactoryUtil.getSessionSql();}@Testpublic void testUser(){UserDao mapper = sqlSession.getMapper(UserDao.class);for (User user : mapper.selectUsers()) {System.out.println(user.getUserId()+","+user.getUserName());}}
}

总结

以上是一个基本的Mybatis查询表中所有信息的实践案例,其他的增删改操作步骤,都是类似的,学习最基础的一个查询所有的操作,可以帮助我们快速入门mybatis的学习。

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

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

相关文章

Linux之实战命令05:find应用实例(三十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

node.js居家养老服务系统—计算机毕业设计源码35247

目 录 摘要 1 绪论 1.1选题的背景 1.2研究的意义 1.3国内外居家养老信息化管理现状分析 1.4 express框架介绍 1.5node.js功能模块 1.6论文结构与章节安排 2 居家养老服务系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.…

jvm中的程序计数器、虚拟机栈和本地方法栈

引言 本文主要介绍一下jvm虚拟机中的程序计数器、虚拟机栈和本地方法栈。 程序计数器 作用 作用&#xff1a;记录下一条jvm指令的执行地址。 下面具体描述一下程序计数器的作用。 这里有两个代码&#xff0c;右边的为源代码&#xff0c;左边为编译之后的字节码。 当我们…

ElasticSearch分页查询性能及封装实现

Es的分页方式 fromsize 最基本的分页方式&#xff0c;类似于SQL中的Limit语法&#xff1a; //查询年龄在12到32之间的前15条数据 {"query":{"bool":{"must":{"range":{"user_age":{"gte":12,"lte":3…

vue实现数据栏无缝滚动实现方式-demo

效果 方式一 通过实现两个item 进行循环 <!--* Author: Jackie* Date: 2023-08-16 21:27:42* LastEditTime: 2023-08-16 21:41:51* LastEditors: Jackie* Description: scroll 水平滚动 - 效果基本满足需求* FilePath: /vue3-swiper-demo/src/components/scroll/Scroll12.…

Linux线程同步与互斥

&#x1f30e;Linux线程同步与互斥 文章目录&#xff1a; Linux线程同步与互斥 Linux线程互斥 线程锁       互斥量Mutex         初始化互斥量的两种方式         申请锁方式         解除与销毁锁 问题解决及线程饥饿       互斥锁的底…

MWD天气图像多分类数据集,用于图像分类总共6个类别,多云,下雨,下雪,雾天,正常天气,共60000张图像数据

MWD天气图像多分类数据集&#xff0c;用于图像分类 总共6个类别&#xff0c;多云&#xff0c;下雨&#xff0c;下雪&#xff0c;雾天&#xff0c;正常天气&#xff0c;共60000张图像数据 MWD天气图像多分类数据集 (Multi-Weather Dataset, MWD) 数据集描述 MWD天气图像多分类…

AcWing算法基础课-790数的三次方根-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》790 题——数的三次方根。本题考查算法为浮点数二分查找。本文详细介绍了一个使用二分法计算浮点数三次方根的算法。通过逐步逼近目标值&#xff0c;程序能够在给定的区间内精确计算出结果&…

【Elasticsearch系列廿】Logstash 学习

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么是Rspack?

Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具&#xff0c;旨在提供与 webpack 生态系统的强兼容性&#xff0c;允许无缝替换 webpack&#xff0c;并提供极快的构建速度。 介绍 - Rspack 它由字节跳动 Web Infra 团队孵化&#xff0c;具有以下特点&#xff1a; 高…

2024年汉字小达人区级自由报名备考冲刺:最新问题和官模题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛&#xff0c;还有两天就开始比赛。 今天继续回答几个关于汉字小达人的最新问题&#xff0c;做几道2024年官方模拟题&#xff0c;帮助孩子们更精准地备考2024年汉字小达人。 【温馨提示】本专题在比赛期间持续更新…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去&#xff0c;很不安全&#xff0c;外部可以随意调用 所以取消public,封闭它&#xff0c;我们可以自己书写两个方法&#xff0c;供外部注册与注销&#xff0c;委托调用在子方法里调用&#xff0c;这样封装委托变量可以使它更安全&#xff0c;这个就叫…

LLM大模型训练/推理的显卡内存需求计算

无论你是从头开始训练 LLM、对其进行微调还是部署现有模型&#xff0c;选择合适的 GPU 对成本和效率都至关重要。在这篇博客中&#xff0c;我们将详细介绍使用单个和多个 GPU 以及不同的优化器和批处理大小进行 LLM 训练和推理时 GPU 要求的所有信息。 计算机处理器由多个决定…

C/C++逆向:switch语句逆向分析

在逆向分析中&#xff0c;switch语句会被编译器转化为不同的底层实现方式&#xff0c;这取决于编译器优化和具体的场景。常见的实现方式包括以下几种&#xff1a; ①顺序判断&#xff08;if-else链&#xff09;&#xff1a; 编译器将switch语句转化为一系列的if-else语句。这…

管道物体计数系统源码分享

管道物体计数检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

信创背景下中职计算机组装与维护课程教学解决方案

在当前的国际形势下&#xff0c;确保信息化系统的安全性和可靠性显得尤为重要。为了提高信息技术的安全性和可靠性&#xff0c;国家鼓励并支持使用国产的信息技术、工具和资源来替代现有的技术体系。这一过程被称为“安全可信的创新替代”&#xff0c;它已经成为国家安全战略的…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电) 定制版、Huawei (华为) OEM 定制版 请访问…

OpenResty安装及使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

构建高可用和高防御力的云服务架构第四部分:REDIS(4/5)

本文的目的是深入探讨Redis在构建高可用和高防御力云服务架构中的应用。我们将分析Redis的工作原理、核心特性以及如何通过Redis优化云服务架构的性能和安全性。此外&#xff0c;我们还将提供实际案例和最佳实践&#xff0c;帮助读者更好地理解和应用Redis&#xff0c;以构建更…

中小企业体系技术抽象沉淀-异地灾备篇

IT团队内部使用工具 系列文章&#xff1a;https://blog.csdn.net/caicongyang/article/details/136857045 DDL DML管控 https://github.com/hhyo/Archery/ flyway 文档编写 wiki 技术对外输出文档推荐gitbook 同城双活数据同步方案 总览&#xff1a; vivo 系列文章&#x…