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

news2024/9/21 22:53:40

在这里插入图片描述

一、基本知识

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.coloradmin.cn/o/1923096.html

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

相关文章

服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例

服务器存储数据恢复环境&#xff1a; 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列&#xff0c;其中包括2块热备盘。 服务器存储故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;热备盘只有一块成功激活&#xff0c;raid瘫痪&#xff0c;上层LUN…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说&#xff0c;我要求一分钟之内访问量不能超过100&#xff0c;那么我们就可以这样来实现&#xff1…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

映美精黑白相机IFrameQueueBuffer转halcon的HObject

映美精黑白相机&#xff0c;用wpfhalcon开发取图 1.到官网下载&#xff0c;开发包 1sdk 2c开发例子 3c#开发例子 引入TIS.Imaging.ICImagingControl35.dll 3.ICImagingControl使用这个类控制相机 /// <summary> /// 相机控制 /// </summary> public ICImagingC…

《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》

MindNLP 原理 MindNLP 是一个自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;用于处理和分析文本数据。 文本预处理&#xff1a;包括去除噪声、分词、词性标注、命名实体识别等步骤&#xff0c;使文本数据格式化并准备好进行进一步分析。 特征提取&#xff1a;将文…

LightRAG:高效构建和优化大型语言模型应用的 PyTorch 框架

一、前言 随着大语言模型 (LLM) 的蓬勃发展&#xff0c;检索增强生成 (RAG) 技术作为一种将 LLM 与外部知识库结合的有效途径&#xff0c;受到了越来越多的关注。 然而&#xff0c;构建 LLM 应用的真正挑战在于开发者需要根据具体需求进行高度定制化&#xff0c;而现有的 RAG …

《向量数据库指南》2024年中国向量数据库名录大全

2024年中国向量数据库名录大全 序号 百科ID 数据库名称 slogan 厂商 来源 开源 类型 1 1228 TensorDB 爱可生向量数据库 上海爱可生信息技术股份有限公司 自研 商业 向量 2 972 Milvus 开源向量数据库 上海赜睿信息科技…

centos安装minio文件系统服务器(踩坑版)

centos安装minio文件系统服务器&#xff08;踩坑版&#xff09; 引安装1. 下载2. 启动3. 创建access keys4. 创建buckets 坑 引 本来安装挺简单的&#xff0c;网上的教程一大堆&#xff0c;有些写的也挺详细的。不过自己还是踩到坑了&#xff0c;耽误了个把小时&#xff0c;特…

【源码+文档+调试讲解】全国消费水平展示平台

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于全国消费水平展示平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了全国消费水平展示平台&#xff0c;它彻底…

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

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

对进阶指针的追忆

目录 思维导图 指针前言 一&#xff1a;字符指针 二&#xff1a;指针数组 三&#xff1a;数组指针 四&#xff1a;数组参数 && 指针参数 五&#xff1a;函数指针 六&#xff1a;函数指针数组 七&#xff1a;函数指针数组的指针 八&#xff1a;回调函数 思维导…

MySql 数据库 (基础) - 下载安装

MySQL数据库 简单介绍 数据库 数据存储的仓库数据库管理系统 操作和管理数据库的大型软件SQL 操作关系型数据库的变成语言&#xff0c;是一套标准 版本 MySQL官方提供了两种不同的版本&#xff1a; 社区版 免费&#xff0c;MySQL不提供任何的技术支持商业版 收费&#xff0c…

暑期备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

谷粒商城实战笔记-29~34-前端基础 - ES6

文章目录 零&#xff0c;安装Live Server插件一&#xff0c;创建前端工程1&#xff0c;创建工程2&#xff0c;在工程ES6中创建一个html文件 二&#xff0c;ES6 简介1&#xff0c;ES6 的历史 三&#xff0c;前端基础ES61&#xff0c;let 和 const1.1&#xff0c;let1.1.1 严格的…

JavaScript青少年简明教程:开发工具与运行环境

JavaScript青少年简明教程&#xff1a;开发工具与运行环境 JavaScript是一种基于对象和事件驱动且具有安全性能的脚本语言。使用它和HTML结合可以开发出交互式的Web页面。 脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。脚本通常是解释执行而非编…

text prompt如何超过77个词

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现_prompt中token权重-CSDN博客文章浏览阅读1.6k次,点赞26次,收藏36次。文章探讨了如何在StableDiffusionProcessing中处理超过77个token的提示,涉及token_counte…

Is Temperature the Creativity Parameter of Large Language Models?阅读笔记

最近有小伙伴来问LLM的参数该如何设计&#xff0c;废话不多说来看看paper吧。首先&#xff0c;常见的可以进行调参的几个值有temperature&#xff0c;top-p和top-k。今天这篇文章是关于temperature的。 原文链接&#xff1a;https://arxiv.org/abs/2405.00492 temperature如果…

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

SpringBoot新手快速入门系列教程十一:基于Docker Compose部署一个最简单分布式服务项目

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 如果您还对于Docker或者Docker Compose不甚了解&#xff0c;可以劳烦移步到我之前的教程&#xff1a; SpringBoot新手快速入门系列教程九&#xff1a;基于docker容器&#xff…