MyBatis 框架学习笔记:功能与应用全解析

news/2024/12/14 18:00:25/

引子

在现代 Java 应用开发中,数据持久化是至关重要的一环。MyBatis 作为一款优秀的持久层框架,为开发者提供了便捷、高效的数据访问方式。本文将详细介绍 MyBatis 框架的基本概念、功能特性以及在实际应用中的具体操作,帮助读者更好地理解和掌握这一强大的框架。

一、MyBatis 框架概述

MyBatis 是一个支持自定义 SQL、存储过程和高级映射的持久层框架。它简化了数据库操作,使得开发者能够更加专注于业务逻辑的实现。MyBatis 的主要特点包括:

1. 简单易学

MyBatis 的配置和使用相对简单,开发者可以通过 XML 或注解的方式定义 SQL 语句,与数据库进行交互。

2. 灵活强大

支持动态 SQL、存储过程调用以及复杂的映射关系,能够满足各种不同的数据库操作需求。

3. 性能优异

通过合理的配置和优化,可以实现高效的数据访问和操作,提升应用的整体性能。

4. 与 Spring 等框架无缝集成

方便在企业级应用开发中与其他主流框架协同工作,构建完整的应用架构。

二、MyBatis 的基础操作

1. 单表操作

使用注解完成单表的增删改查操作,如@Select@Insert@Delete@Update等注解,方便快捷地定义 SQL 语句与数据库交互。

2. 优化策略

  • 添加日志:引入 log4j 的 jar 包并添加 log4j.properties 配置文件,便于记录和调试 MyBatis 的运行情况。
  • 实体类别名:为实体类起别名,简化在 SQL 语句中引用实体类的方式。
  • 数据源信息抽取:将数据源的信息抽取到属性文件中,通过${key}的方式引用,提高配置的灵活性和可维护性。

3. 特殊情况处理

  • 获取递增 ID 值:在插入数据时,通过<insert useGeneratorKey="true" keyProperty="属性">获取递增的 ID 值,确保数据的完整性和一致性。
  • 解决多参问题:使用@Param("名称")注解为参数命名,在 SQL 语句中通过#{名称}引用参数,避免参数混淆。
  • 处理特殊符号:采用转义符或<![CDATA[sql]]>的方式处理特殊符号,确保 SQL 语句的正确性。
  • 模糊查询:使用concat("%",#{},"%")实现模糊查询,方便根据关键词搜索数据。
  • 属性名和列名不一致处理:可以为查询的列起别名与属性名一致,或者通过ResultMap标签完成列名和属性名的映射关系。

三、分页查询与联表查询

1. 分页查询

使用 PageHelper 分页插件实现分页功能,具体步骤如下:

引入依赖

在项目的 pom.xml 文件中添加 PageHelper 的依赖:

收起

xml

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>最新版本</version>
</dependency>
配置 MyBatis

mybatis 配置文件中添加插件配置:

收起

xml

<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="param1" value="value1"/></plugin>
</plugins>
编写代码

在 Java 代码中,使用 PageHelper 开启分页,并获取分页结果:

收起

java

// 开启分页,查询第一页,每页显示3条记录
PageHelper.startPage(1, 3);
List<Teacher> teachers = teacherDao.selectAll();
// 将查询结果封装到PageInfo类中
PageInfo<Teacher> pageInfo = new PageInfo<>(teachers);
// 展示相关信息
System.out.println("总条数: " + pageInfo.getTotal());
System.out.println("总页数: " + pageInfo.getPages());
System.out.println("当前的记录:");
List<Teacher> list = pageInfo.getList();
for (Teacher t : list) {System.out.println(t);
}

2. 联表查询

数据库中表与表之间通过外键建立连接关系,在查询数据时可能需要进行多表联查。MyBatis 支持多种联表查询方式,包括内连接(inner join)、左连接(left join)和右连接(right join)。

多对一查询

  • 第一种方案:采用 map 集合类
    通过查询结果封装到Map集合中,在代码中根据键值获取关联对象。这种方式简单直接,但在调用属性时不够直观,需要额外的处理。

  • 第二种方案:使用 association 标签
    在 MyBatis 的映射文件中,使用<association>标签定义多对一的关联关系,指定属性名和关联对象的类型,并通过子标签<id><result>映射关联对象的属性。这种方式更加清晰和规范,方便在代码中直接访问关联对象的属性。

一对多查询

  • 使用 Map 类(省略)
  • 使用 Collection 标签解决
    在查询部门信息时,通过<collection>标签定义一对多的关联关系,指定集合属性名和集合中元素的类型,并通过子标签<id><result>映射集合中元素的属性。这样可以在查询部门信息的同时,获取该部门对应的员工信息。

四、动态 SQL

动态 SQL 是 MyBatis 的强大特性之一,它能够根据不同的条件动态拼接 SQL 语句,满足多样化的查询需求。

1. 动态 SQL 标签介绍

  • <trim>:通过修剪 SQL 语句的开头和结尾来动态生成 SQL 片段,可用于去除不必要的 SQL 关键字或条件语句,并提供了定义修剪规则的属性。
  • <where>:用于在生成的 SQL 语句中添加 WHERE 子句,自动处理条件语句的前缀,在有条件语句存在时添加 WHERE 关键字,并去除 SQL 的第一个and标签。
  • <set>:用于在生成的 SQL 语句中添加 SET 子句,主要用于更新操作,根据条件动态生成需要更新的列。
  • <foreach>:用于在 SQL 语句中进行循环操作,遍历集合或数组,并根据指定模板将元素插入到 SQL 语句中,适用于批量删除和批量添加等操作。
  • <if>:用于在 SQL 语句中添加条件判断,根据指定条件决定是否包含某个 SQL 语句片段。
  • <choose>:类似于 Java 中的switch语句,根据条件选择执行不同的 SQL 语句片段,包含多个<when>和一个可选的<otherwise>标签。
  • <when>:在<choose>标签中定义条件分支,根据指定条件判断是否执行特定的 SQL 语句片段。
  • <otherwise>:在<choose>标签中可选的标签,用于定义当没有任何<when>条件匹配时执行的 SQL 语句片段。

2. 动态 SQL 应用示例

if 标签

例如,根据姓名、职位和薪资进行员工信息查询:

收起

java

public List<Emp> selectByCondition01(@Param("name") String name, @Param("job") String job, @Param("salary") Double salary);

xml

<select id="selectByCondition01" resultMap="EmpMapper">select * from tbl_empwhere 1=1<if test="name!=null and name!=''">and emp_name like concat('%',#{name},'%')</if><if test="job!=null and job!=''">and emp_job=#{job}</if><if test="salary!=null">and emp_salary=#{salary}</if>
</select>
where 标签

使用<where>标签优化上述查询,去除万能条件1=1

收起

xml

<select id="selectByCondition01" resultMap="EmpMapper">select * from tbl_emp<where><if test="name!=null and name!=''">and emp_name like concat('%',#{name},'%')</if><if test="job!=null and job!=''">and emp_job=#{job}</if><if test="salary!=null">and emp_salary=#{salary}</if></where>
</select>
choose when otherwise 标签

根据不同条件选择查询方式:

收起

xml

<select id="selectByCondition02" resultMap="EmpMapper">select * from tbl_emp<where><choose><when test="name!=null and name!=''">and emp_name like concat('%', #{name}, '%')</when><when test="job!=null and job!=''">and emp_job=#{job}</when><when test="salary!=null">and emp_salary=#{salary}</when></choose></where>
</select>
foreach 标签

  • 批量删除

收起

java

public int batchDelete(@Param("ids") Integer[] ids);

xml

<delete id="batchDelete">delete from tbl_emp where id in<foreach collection="ids" item="i" open="(" close=")" separator=", ">#{id}</foreach>
</delete>

  • 批量添加

收起

java

public int batchInsert(@Param("emps") List<Emp> emps);

xml

<insert id="batchInsert">insert into tbl_emp(emp_name,emp_job,emp_salary,did) values<foreach collection="emps" item="e" separator=",">(#{e.name},#{e.job},#{e.salary},#{e.did})</foreach>
</insert>

五、MyBatis 代码自动生成

MyBatis 提供了代码自动生成工具,可以根据数据库表结构快速生成实体类、DAO 接口、映射文件等代码,提高开发效率。通过配置生成选项,如模块路径、基础包名、编码方式、实体类策略等,可以定制生成的代码风格和内容。生成的代码遵循 MyBatis 的规范,减少了手动编写代码的工作量,同时也降低了出错的概率。

六、总结

MyBatis 框架在 Java 应用开发中的数据持久化方面发挥着重要作用。通过对其基础操作、分页查询、联表查询、动态 SQL 以及代码自动生成等功能的学习,我们能够更加高效地与数据库进行交互,实现复杂的数据操作需求。在实际项目中,合理运用 MyBatis 的各种特性,可以提高开发效率、提升代码质量,并为应用的性能优化提供有力支持。希望本文能够帮助读者更好地理解和掌握 MyBatis 框架,为后续的开发工作打下坚实的基础。


http://www.ppmy.cn/news/1555083.html

相关文章

【GAMES101笔记速查——Lecture 22 Animation Cont】

目录 1 单粒子模拟 1.1 欧拉方法 1.2 不稳定性及其改进 1.2.1 误差&#xff08;Errors&#xff09; 1.2.2 不稳定性&#xff08;Instability&#xff09; 1.2.3 解决不稳定性&#xff08;Combating Instability&#xff09; &#xff08;1&#xff09;中点法 &#xff0…

SSH连接报错,Corrupted MAC on input 解决方法

问题描述 客户在windows CMD中SSH连接失败&#xff0c;报错: Corrupted MAC on input ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect值得注意的是&#xff0c;客户通过别的机器做SSH连接可以成功&#xff0c;使用putty, mo…

HTTP 常见状态码解析

HTTP 常见状态码解析 文章目录 HTTP 常见状态码解析一、引言二、1XX 信息性状态码&#xff08;一&#xff09;100 Continue&#xff08;二&#xff09;101 Switching Protocols 三、2XX 成功状态码&#xff08;一&#xff09;200 OK&#xff08;二&#xff09;201 Created&…

word中写论文的一些trick

文章目录 加图注使用latex|matjax语法打公式给公式加上编号引用文献 加图注 这样就给图片插入图注 使用latex|matjax语法打公式 按下alt 会出现下面的情景 在右上角选择专业 然后就可以在里面打入latex或mathjax了&#xff0c;不过这个没有预览功能&#xff0c;可以在别的…

鸿蒙实现应用通知

目录&#xff1a; 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…

国科大智能设备安全-APK逆向分析实验

APK逆向分析实验 使用APK常用逆向分析工具&#xff0c;对提供的移动应用程序APK文件进行逆向分析&#xff0c;提交逆向后代码和分析报告。具体任务如下&#xff1a; 任务一&#xff1a;安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法&#xff0c;对提供的Facebook Updat…

【ETCD】【源码阅读】深入解析 etcd 的 `EtcdServer.Start` 函数

深入解析 etcd 的 EtcdServer.Start 函数 在 etcd 的代码中&#xff0c;EtcdServer.Start 是一个关键方法&#xff0c;用于初始化并启动服务器以便处理请求。本文将从源码的角度逐步分析此函数的每一步操作。 函数签名及注释 // Start performs any initialization of the Se…

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…