秋招Java后端开发冲刺——Mybatis使用总结

在这里插入图片描述

一、基本知识

1. 介绍

  • MyBatis 是 Apache 的一个开源项目,它封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要再进行繁琐的 JDBC 编码。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain Old Java Objects)到数据库中的记录。
  • MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

2. 特点

  • SQL 优先:MyBatis 让 SQL 语句可以清晰地写在 XML 文件或注解中,支持动态 SQL。
  • 简单易用:简化了 JDBC 代码,专注于 SQL 本身。
  • 灵活性强:可以根据需要自定义 SQL 语句,满足复杂查询需求。
  • 支持多种数据库:支持 MySQL、PostgreSQL、Oracle 等主流数据库。

3. Maybatis VS JDBC

特性JDBCMyBatis
SQL 编写与管理手动编写 SQL 并嵌入 Java 代码中。SQL 管理复杂,维护困难。SQL 语句可放在 XML 文件或注解中,代码与 SQL 分离,结构清晰。
参数处理手动设置 SQL 语句中的参数,代码量大且易出错。自动处理参数设置,简化代码。
结果集映射手动处理结果集并映射为 Java 对象,过程繁琐。自动将结果集映射为 Java 对象,支持复杂对象映射。
数据库连接管理需手动管理数据库连接和资源,易出现资源泄漏。使用内置连接池,自动管理连接,减少资源泄漏风险。
事务管理需手动处理事务。提供方便的事务管理功能,可通过配置或编程方式管理事务。
动态 SQL 支持需通过字符串拼接实现动态 SQL,易引发 SQL 注入问题,代码难维护。提供强大的动态 SQL 支持,通过 XML 标签或注解生成动态 SQL,安全易维护。
缓存支持不直接提供缓存机制,需自行实现。内置一级缓存和二级缓存,通过配置轻松启用缓存。
开发效率需编写大量样板代码,开发效率较低。减少样板代码,提高开发效率。
灵活性提供底层 API,允许对数据库操作进行精细控制。提供灵活的 SQL 控制,适合需要直接编写 SQL 的场景。

二、Mybatis的基本使用

1. 环境配置

  • 添加依赖(以 Maven 为例):在配置文件中添加mybtis依赖
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

2. 配置数据库连接

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3. 基本使用(以用户管理为例)

  • 创建用户实体类
public class User {
    private int id;
    private String name;
    private String email;
    private int age;
    private String address;
}
  • 定义mapper接口
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
//简单的查询实际上不用定义XML文件,直接在mapper接口上面即可
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
    List<User> getAllUsers();
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}
  • 编写 Mapper 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="com.example.mapper.UserMapper">
    <select id="getAllUsers" resultType="User">
        SELECT * FROM users
    </select>
    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO users (name, email, age, address) VALUES (#{name}, #{email}, #{age}, #{address})
    </insert>
    <update id="updateUser" parameterType="User">
        UPDATE users SET name = #{name}, email = #{email}, age = #{age}, address = #{address} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

:Mybatis使用只需要定义mapper接口,不用再有具体的实现

三、Mybatis动态sql

MyBatis 提供了强大的动态 SQL 功能,允许开发者根据不同的条件动态生成 SQL 语句。动态 SQL 通常用于处理复杂的查询条件或可选的查询参数。MyBatis 的动态 SQL 是通过 XML 配置文件中的一些特殊标签来实现的,这些标签包括 if, choose, when, otherwise, trim, where, set 和 foreach 等。长常见标签的使用如下:

1. if 标签

  • if标签用于根据条件动态生成 SQL 片段。如果条件为真,则包含该 SQL 片段;否则忽略。
<select id="findUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

2. choose>标签

  • choose 标签类似于 Java 中的 switch 语句,用于选择其中一个条件。它包含多个 when 标签和一个可选的 otherwise 标签。
  • 示例
<select id="findUser" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="id != null">
                AND id = #{id}
            </when>
            <when test="name != null">
                AND name = #{name}
            </when>
            <otherwise>
                AND email = #{email}
            </otherwise>
        </choose>
    </where>
</select>

3. where标签

  • where 标签自动添加 WHERE 关键字,并处理 SQL 片段的 AND/OR 前缀,在条件中使用动态sql时就需要使用where标签。
  • 示例
<select id="findUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="email != null">AND email = #{email}</if>
        <if test="age != null">AND age = #{age}</if>
    </where>
</select>

4. set 标签

  • set 标签用于生成 UPDATE 语句中的 SET 子句,自动处理末尾的逗号。
  • 示例
<update id="updateUser" parameterType="User">
    UPDATE users
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="email != null">email = #{email},</if>
        <if test="age != null">age = #{age},</if>
        <if test="address != null">address = #{address}</if>
    </set>
    WHERE id = #{id}
</update>

5. foreach 标签

  • foreach 标签用于处理集合类型参数,如 List、Set 或数组。
  • 示例
<select id="findUsersByIds" parameterType="list" resultType="User">
    SELECT * FROM users WHERE id IN
    <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

四、使用注意事项

  1. Mapper接口和XML映射文件
  • 确保 XML 映射文件中的 namespace 与 Mapper 接口的全限定名完全匹配。
  • XML 映射文件中的 SQL 语句 ID 必须与 Mapper 接口中的方法名一致。
  • 确保 Mapper 接口方法的参数类型与 XML 中定义的 parameterType 一致。
  • 确保 Mapper 接口方法的返回类型与 XML 中定义的 resultType 或 resultMap 一致。
  1. 其他
  • 如果 Mapper 接口方法有多个参数,XML 中需要使用 @Param 注解来指定参数名称,或者使用 Map 作为参数类型
  • 当查询结果与实体类字段不完全匹配时,可以使用 ResultMap 进行映射
  • 在使用动态 SQL 时,尽量使用 MyBatis 提供的参数绑定方式,而不是直接拼接字符串,以防止 SQL 注入
  • 如果在 Mapper 接口中使用注解来定义 SQL 语句,则不需要在 XML 中重复定义,但确保注解和方法签名一致

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【提交ACM出版 | EIScopus检索稳定 | 高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024,8月16-18)

第五届大数据与社会科学国际学术会议&#xff08;ICBDSS 2024&#xff09;将于2024年08月16-18日在中国-上海隆重举行。 ICBDSS会议在各专家教授的支持下&#xff0c;去年已成功举办了四届会议。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“大数据”、“社…

小浣熊素材 - 分析博客文章分布

我上传的 Excel&#xff0c;第一列为文章标题&#xff0c;请你分析这个 Excel 里总共的文章数量&#xff0c;并且根据文章标题&#xff0c;智能地将这些文章进行归类&#xff0c;然后绘制出饼状图&#xff0c;展示每一类的文章&#xff0c;占文章总数的百分比。 自己的 Pytho…

51单片机STC89C52RC——17.1 红外线遥控器

目的/效果 LCD1602显示红外遥控按键值 一&#xff0c;STC单片机模块 二&#xff0c;红外线遥控器 2.1 简介 人的眼睛能看到的可见光按波长从长到短排列&#xff0c;依次为红、橙、黄、绿、青、蓝、紫。 光的波长和频率如下图 红外遥控是利用红外光进行通信的设备&#xff0…

程序的控制结构——switch语句【互三互三】

文章目录 &#x1f341; 引言 &#x1f341;1.语句格式&#xff1a; &#x1f341;2.语句执行过程 &#x1f341;3.语句格式举例 &#x1f341;例题 &#x1f449;【例1】 &#x1f680;示例代码 &#x1f449;【例2】 &#x1f680;【分析】 &#x1f680;示例代码…

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述

目录 ✈必备知识 进程间通信概述 &#x1f525;概述 &#x1f525;必要性 &#x1f525;原理 管道概述 &#x1f525;管道的本质 &#x1f525;管道的相关特性 &#x1f525;管道的同步与互斥机制 匿名管道 &#x1f525;系统调用接口介绍 &#x1f525;内核原理 …

如何搞定美国TikTok直播网络?

在全球范围内&#xff0c;TikTok已经积累了超过30亿次的下载量&#xff0c;月活跃用户达到13亿以上&#xff0c;支持75种语言&#xff0c;覆盖了150多个国家和地区。这一庞大的流量池吸引了众多国内电商人尝试在TikTok上进行业务拓展。本文将探讨如果要在美国运营TikTok直播&am…

Kithara与OpenCV (一)

Kithara使用 OpenCV 库 目录 Kithara使用 OpenCV 库简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 Ope…

彻底搞懂JVM垃圾回收

哈喽&#xff0c;大家好&#x1f389;&#xff0c;我是世杰。 欢迎大家关注我的公众号『程序员世杰』获取更多后端技术干货&#x1f389;&#x1f389;! 本文我为大家介绍「JVM垃圾回收那些事」 面试连环call 如何判断对象是否应被回收?finalize方法的实现机制是什么?如何判…

触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘

如何在触摸设备上为输入域添加虚拟键盘&#xff1f; 一个插件可以解决这个问题&#xff0c;关键还支持高度自定义&#xff08;git地址&#xff09;&#xff1a; GitHub - Mottie/Keyboard: Virtual Keyboard using jQuery ~ 官网地址&#xff1a;Virtual Keyboard 使用步骤&…

Photoshop

彩色转灰度&#xff1a;ctrlshiftu 背景转黑色&#xff1a; 魔术棒容差10 shift连选 shiftF5&#xff08;填充&#xff09;钢笔选择 路径 工作路径 将路径作为选区载入 点回图层 按ctrlx删除选区 待更新

如何找回误删的文件?4个常用文件恢复方法!

对于许多用户来说&#xff0c;误删文件是一种常见而令人懊恼的情况。恢复误删文件的重要性在于&#xff0c;它可以帮助用户找回宝贵的数据&#xff0c;避免因数据丢失带来的各种不便和损失。 如何找回不小心删除的文件&#xff1f; 误删数据不知道怎么恢复&#xff0c;会给我…

Spring MVC入门3

看完这篇博客你能学到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的区别 如果想真正掌握&#xff0c;还需要自己勤加练习。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

传输层协议之UDP

1、端口号 我们在应用层创建的套接字&#xff0c;是需要通过bind()接口绑定我们的IP地址与端口号的&#xff0c;这是因为数据从传输层向上交付到应用层时&#xff0c;需要用端口号来查找特定的服务进程。一般在网络通信时&#xff0c;用IP地址标识一台主机&#xff0c;用端口号…

小米起诉“小米”商标侵权,索赔500万!

近日浙江丽水有家叫小米的公司&#xff0c;因为商标侵权被小米科技起诉索赔500万&#xff0c;需要变更企业名称&#xff0c;官网也不能用“小米智能大家居”等&#xff0c;还有其它的赔偿&#xff0c;普推知产商标老杨分析&#xff0c;“小米智能大家居”“小米”&#xff0c;后…

ArduPilot开源飞控之AP_Mount_Topotek

ArduPilot开源飞控之AP_Mount_Topotek 1. 源由2. 框架设计3. 重要函数3.1 动态过程3.1.1 AP_Mount_Topotek::update3.1.2 AP_Mount_Backend::calculate_poi 3.2 基础能力3.2.1 AP_Mount_Topotek::healthy3.2.2 AP_Mount_Topotek::has_pan_control 3.3 设备功能3.3.1 AP_Mount_T…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性&#xff0c;这些属性固定&#xff0c;形成了机器人的个人偏好 在实现过程中&#xff0c;此处使用一个xml配置文件&#xff0c;配置了机器人的个人年…

卡码网KamaCoder 99. 岛屿数量

题目来源&#xff1a;99. 岛屿数量 C题解&#xff1a;来源代码随想录 懒得自己写了。直接搬运。。。 1. 深度优先搜索&#xff1a;它的循环在main函数里&#xff0c;遍历每个位置&#xff0c;判断 是否为陆地 及 是否访问过。 #include <iostream> #include <vecto…

自养号测评补单:速卖通卖家如何打造爆款?

在跨境电商的激烈竞争中&#xff0c;速卖通卖家们为了打造店铺的爆款商品&#xff0c;不仅需要紧跟市场趋势&#xff0c;还需理解爆款商品的生命周期。以下是一些实用的策略&#xff0c;帮助卖家们更有效地打造爆款&#xff1a; 一、精准选品策略 面对全球多样化的消费者群体&…

算法复杂度<数据结构 C版>

什么是算法复杂度&#xff1f; 简单来说算法复杂度是用来衡量一个算法的优劣的&#xff0c;一个程序在运行时&#xff0c;对运行时间和运行空间有要求&#xff0c;即时间复杂度和空间复杂度。 目录 什么是算法复杂度&#xff1f; 大O的渐近表达式 时间复杂度示例 空间复杂度…

Open-TeleVision——通过VR沉浸式感受人形机器人视野的远程操作

前言 7.3日&#xff0c;我司七月「大模型机器人(具身智能)线下营」群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接&#xff0c;我当时快速看了一遍&#xff0c;还是有价值的一个工作(其有受mobile aloha工作的启发…