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

news2024/11/9 3:49:37

前言

什么是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 configuration
        PUBLIC "-//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 mapper
        PUBLIC "-//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 configuration
        PUBLIC "-//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;
    @Before
    public void testBefore(){
        sqlSession= SQLSessionFactoryUtil.getSessionSql();
    }
    @Test
    public void testUser(){
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        for (User user : mapper.selectUsers()) {
            System.out.println(user.getUserId()+","+user.getUserName());
        }


    }
}

总结

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

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

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

相关文章

【自动化测试】Appium 生态工具以及Appium Desktop如何安装和使用

引言 Appium 是一个开源的自动化测试框架&#xff0c;用于测试原生、移动 Web 和混合应用程序。它支持 iOS、Android 和 Windows 平台。Appium 生态系统包含多个工具和库&#xff0c;这些工具和库可以与 Appium 一起使用&#xff0c;以提高移动应用的自动化测试效率 文章目录 引…

Java面试指南(基础篇)

文章目录 前言01 Java语言的特点02 JVM、JRE及JDK的关系03 Java和C的区别04 基本数据类型05 类型转换06 自动装箱与拆箱07 String的不可变性08 字符常量和字符串常量的区别09 字符串常量池10 String 类的常用方法11 String和StringBuffer、StringBuilder的区别12 switch 是否能…

舒服了!学大模型必看的学习书籍来了

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01;&#xff08;文末获取&#xff09; 部分书…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

Leetcode 反转链表

使用递归 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class S…

超低排放燃气锅炉

在全球环保浪潮的推动下&#xff0c;超低排放燃气锅炉以其卓越的环保性能和高效能源利用&#xff0c;正逐渐成为现代热能供应的主力军。作为传统锅炉的升级版&#xff0c;超低排放燃气锅炉不仅在技术上实现了质的飞跃&#xff0c;更在环保和节能方面树立了新的标杆。朗观视觉小…

linux入门到实操-10 控制台显示和输出重定向、监控文件变化、软连接

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff08;包含课程同版本linux系统文件等内容&#xff09;&#xff0c;供大家学习交流下载&#xff1a;…

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤一)

本例中演示将TLabel控件扩展成TClockLabel新控件。具体如下&#xff1a; 步骤 1 - 使用新建组件向导创建组件 1. 菜单选择 Component -> New Component。 2. 在新建组件向导的第一页&#xff0c;选择 FireMonkey for Delphi &#xff1a; 3. 在 “Ancestor Component ”页…

【最新华为OD机试E卷-支持在线评测】爱吃蟠桃的孙悟空(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

解决windows上VMware的ubuntu虚拟机不能拷贝和共享

困扰多时的VMware虚拟机不能复制拷贝和不能看到共享文件夹的问题&#xff0c;终于解决了~ 首先确定你已经开启了复制拷贝和共享文件夹&#xff0c;并且发现不好用。。。 按照下面方式解决这个问题。 1&#xff0c;删除当前的vmware tools。 sudo apt-get remove --purge ope…

【Redis技术进阶之路】「原理分析系列开篇」揭秘分析客户端和服务端网络通信交互实现(客户端篇)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 客户端和服务器Redis服务器IO多路复用RedisClient结构 客户端属性分析套接字描述符客户端的分类伪客户端…

【二十五】【QT开发应用】无边窗窗口鼠标拖动窗口移动,重写mousePressEvent,mouseMoveEvent函数

在 Qt 中&#xff0c;可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件&#xff0c;以便实现例如拖动窗口等功能。 mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数&#…

prithvi WxC气象模型

NASA发布了prithvi WxC气象模型发布 Prithvi是NASA开源的模型&#xff0c;被誉为全球最大的开源地理空间大模型。昨天晚上逛X平台&#xff0c;我看到Prithvi模型又来了新成员&#xff1a;prithvi WxC。 NASA和IBM创建了一个基于MERRA-2数据的天气和气候AI基础模型—Prithvi Wx…

C++ :借助栈完成二叉树的非递归遍历

二叉树的传统访问分为&#xff1a;前序、中序、后序、层序。 其中前三者是递归访问&#xff0c;但是递归是有缺陷的&#xff0c;树太深就会栈溢出。 因此本文我们思考如何使用非递归的方法来完成遍历。 1. 前序遍历 要迭代⾮递归实现⼆叉树前序遍历&#xff0c;⾸先还是要借…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16&#xff5e;K23二进制拨动开关作为DBUS数据输入端&#xff0c;其它开关作为控制信号的输入端&#xff0c;将通过K16&#xff5e;K23设定…

无人经济已经 next level 了吗?

01 从无人售货机开始… 晚上 11 点下班回到小区&#xff0c;顺便去驿站取个快递&#xff0c;走进驿站发现四周空无一人&#xff0c;把快递放在机器上滴一声就可以走人了。走的时候在旁边的无人超市里拿一袋方便面&#xff0c;当做加班的安慰……发现了吗&#xff0c;无人门店…

ret2dl_resolve

前言&#xff1a; ret2dl_resolve 是一种利用漏洞进行攻击的技术&#xff0c;主要针对使用动态链接库的程序。它的核心原理是利用程序的重定位机制&#xff0c;通过构造特定的函数返回地址&#xff0c;来劫持控制流并执行攻击者选择的代码。以下是对 ret2dl_resolve 原理的详细…

谷歌地图 | Navigation SDK 重磅发布!为你的 App 注入导航新体验

9月17日&#xff0c;Google 地图正式发布 Navigation SDK for Android 和 iOS&#xff01;借助 Navigation SDK&#xff0c;开发者们现在可以更轻松地为用户打造定制化的导航体验&#xff0c;提升用户满意度&#xff0c;增强用户粘性。无论是界面风格、路线规划还是实时交通信息…

城市酷选:如何四年做到3000亿销售额 会员超500w

城市酷选&#xff0c;这一融合了线上线下消费的会员制社交电商平台&#xff0c;正以其独特的运营模式在市场中崭露头角。该平台不仅汇聚了超过600万的会员与60万商家&#xff0c;更实现了年交易额的百亿突破&#xff0c;彰显了其强大的市场影响力和消费者吸引力。 创新排队免单…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…