springboot组件使用-mybatis组件使用
文章目录
- springboot使用mybatis组件
- 1. 添加依赖
- 2. 配置数据源
- 3. 创建实体类
- 4. 创建Mapper接口
- 5. 创建Mapper XML文件
- 6. 使用Mapper
- 7. 启动类配置
- mybtis 动态SQL
- 1. `@Mapper` 注解
- 2. `@Select` 注解
- 3. `@Insert` 注解
- 4. `@Update` 注解
- 5. `@Delete` 注解
- 6. `@Results` 注解
- 7. `@Param` 注解
- 8. `@CacheNamespace` 注解
- 9. `@Options` 注解
- 10. `@ResultMap` 注解
- 总结
- mybatis XML标签
- 1. `<mapper>` 标签
- 2. `<select>` 标签
- 3. `<insert>` 标签
- 4. `<update>` 标签
- 5. `<delete>` 标签
- 6. `<resultMap>` 标签
- 7. `<collection>` 标签
- 8. `<include>` 标签
- 9. `<if>` 标签
- 10. `<choose>`、`<when>` 和 `<otherwise>` 标签
- 11. `<foreach>` 标签
- 12. `<trim>` 标签
- 总结
- 注意
- 参考文献
springboot使用mybatis组件
在Spring Boot项目中加入MyBatis组件,可以方便地进行数据库操作。以下是详细的步骤:
1. 添加依赖
首先,在pom.xml
文件中添加MyBatis和数据库驱动的依赖。例如,如果你使用的是MySQL数据库,可以添加以下依赖:
<dependencies><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>
</dependencies>
2. 配置数据源
在application.properties
或application.yml
文件中配置数据源信息。例如,在application.properties
文件中添加以下配置:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
3. 创建实体类
创建与数据库表对应的实体类。例如:
package com.example.demo.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax protectedById;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private Integer age;// Getters and Setters
}
4. 创建Mapper接口
创建MyBatis的Mapper接口,并使用@Mapper
注解标记。例如:
package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM user")List<User> findAll();
}
5. 创建Mapper XML文件
在src/main/resources/mapper
目录下创建Mapper的XML文件。例如,创建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 namespace="com.example.demo.mapper.UserMapper"><select id="findAll" resultType="com.example.demo.entity.User">SELECT * FROM user</select>
</mapper>
6. 使用Mapper
在Service层或Controller层中使用Mapper进行数据库操作。例如,在Service层中:
package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.findAll();}
}
7. 启动类配置
确保在Spring Boot启动类上添加@MapperScan
注解,以扫描Mapper接口。例如:
package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
通过以上步骤,你就可以在Spring Boot项目中成功加入MyBatis组件,并进行数据库操作了。
mybtis 动态SQL
在 MyBatis 中,除了使用 XML 映射文件来定义 SQL 语句之外,还可以使用注解(Annotations)的方式来编写 SQL 语句。这种方式可以让 SQL 语句更紧密地与 Java 代码结合,使得代码结构更加清晰。下面是一些常用的 MyBatis 注解及其使用方法。
1. @Mapper
注解
@Mapper
注解用于标记一个接口为 MyBatis 的 Mapper 接口。这个接口将包含一系列的 CRUD 方法。
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper {// 方法定义
}
2. @Select
注解
@Select
注解用于定义一个 SELECT 语句。
import org.apache.ibatis.annotations.Select;
import com.example.demo.model.User;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(Long id);
}
3. @Insert
注解
@Insert
注解用于定义一个 INSERT 语句。如果需要获取自动生成的主键值,可以使用 @Options
注解。
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;@Mapper
public interface UserMapper {@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);
}
4. @Update
注解
@Update
注解用于定义一个 UPDATE 语句。
import org.apache.ibatis.annotations.Update;@Mapper
public interface UserMapper {@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")void updateUser(User user);
}
5. @Delete
注解
@Delete
注解用于定义一个 DELETE 语句。
import org.apache.ibatis.annotations.Delete;@Mapper
public interface UserMapper {@Delete("DELETE FROM user WHERE id=#{id}")void deleteUser(Long id);
}
6. @Results
注解
@Results
注解用于定义结果映射。它可以帮助处理复杂的结果集,比如一对一(One-to-One)或一对多(One-to-Many)的关系。
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.ResultMap;
import com.example.demo.model.User;
import com.example.demo.model.Address;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age"),@Result(property = "address", column = "address_id",one = @One(select = "com.example.demo.mapper.AddressMapper.getAddressById"))})User getUserById(Long id);
}
7. @Param
注解
@Param
注解用于指定 SQL 语句中的参数名称。
import org.apache.ibatis.annotations.Param;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')")List<User> findUsersByName(@Param("name") String name);
}
8. @CacheNamespace
注解
@CacheNamespace
注解用于定义缓存的命名空间,可以指定缓存的实现类等。
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.cache.decorators.Synchronized;@Mapper
@CacheNamespace(implementation = SynchronizedCache.class)
public interface UserMapper {// 方法定义
}
9. @Options
注解
@Options
注解用于定义 SQL 执行后的一些选项,如获取自动生成的主键等。
import org.apache.ibatis.annotations.Options;@Mapper
public interface UserMapper {@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);
}
10. @ResultMap
注解
@ResultMap
注解用于引用已经定义好的结果映射。
import org.apache.ibatis.annotations.ResultMap;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")@ResultMap("UserResultMap")User getUserById(Long id);
}
总结
使用 MyBatis 的注解可以让你在 Java 代码中直接定义 SQL 语句,这种方式更加简洁,特别是在一些简单的 CRUD 操作中。然而,对于复杂的 SQL 逻辑或者需要高度定制化的映射关系,XML 映射文件仍然是一种非常好的选择。在实际开发中,可以根据具体情况选择最适合的方式来定义 SQL 语句和结果映射。
mybatis XML标签
MyBatis 是一个优秀的持久层框架,它支持定制化的 SQL、存储过程以及高级映射。在 MyBatis 中,XML 映射文件用于定义 SQL 语句、结果映射以及其他与数据库交互相关的配置。下面是 MyBatis 中常用的一些 XML 标签及其用途。
1. <mapper>
标签
<mapper>
标签用于定义一个映射器接口,它包含一系列 SQL 语句和结果映射。
<mapper namespace="com.example.demo.mapper.UserMapper"><!-- SQL 语句和结果映射定义 -->
</mapper>
2. <select>
标签
<select>
标签用于定义一个 SELECT 语句。
<select id="getUserById" parameterType="long" resultType="com.example.demo.model.User">SELECT * FROM user WHERE id = #{id}
</select>
3. <insert>
标签
<insert>
标签用于定义一个 INSERT 语句。
<insert id="insertUser" parameterType="com.example.demo.model.User">INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
4. <update>
标签
<update>
标签用于定义一个 UPDATE 语句。
<update id="updateUser" parameterType="com.example.demo.model.User">UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>
5. <delete>
标签
<delete>
标签用于定义一个 DELETE 语句。
<delete id="deleteUser" parameterType="long">DELETE FROM user WHERE id=#{id}
</delete>
6. <resultMap>
标签
<resultMap>
标签用于定义复杂的结果映射关系,它可以处理一对一(One-to-One)、一对多(One-to-Many)或多对一(Many-to-One)的关系。
<resultMap id="UserResultMap" type="com.example.demo.model.User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><association property="address" javaType="com.example.demo.model.Address" resultMap="AddressResultMap"/>
</resultMap>
7. <collection>
标签
<collection>
标签用于处理一对多关系。
<resultMap id="UserResultMap" type="com.example.demo.model.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="com.example.demo.model.Order" select="getOrdersById"/>
</resultMap>
8. <include>
标签
<include>
标签用于引用外部 SQL 片段。
<sql id="commonColumns">name, age</sql><select id="getAllUsers" resultType="com.example.demo.model.User">SELECT ${commonColumns} FROM user
</select>
9. <if>
标签
<if>
标签用于条件判断,可以动态地构建 SQL 语句。
<select id="findUsersByName" parameterType="string" resultType="com.example.demo.model.User">SELECT * FROM user WHERE 1=1<if test="name != null">AND name LIKE '%${name}%'</if>
</select>
10. <choose>
、<when>
和 <otherwise>
标签
<choose>
、<when>
和 <otherwise>
标签用于实现多条件判断。
<select id="findUsers" parameterType="com.example.demo.model.SearchCriteria" resultType="com.example.demo.model.User">SELECT * FROM user WHERE<choose><when test="name != null">name LIKE '%${name}%'</when><when test="age != null">age = ${age}</when><otherwise>1 = 1</otherwise></choose>
</select>
11. <foreach>
标签
<foreach>
标签用于处理集合参数,常用于批量操作。
<insert id="batchInsert" parameterType="java.util.List">INSERT INTO user(name, age) VALUES<foreach item="item" index="index" collection="list" open="(" separator=")," close=")">#{item.name}, #{item.age}</foreach>
</insert>
12. <trim>
标签
<trim>
标签用于动态拼接 SQL 语句,并提供去除前导或尾随空白的功能。
<select id="findUsers" parameterType="com.example.demo.model.SearchCriteria" resultType="com.example.demo.model.User">SELECT * FROM user WHERE<trim prefix="WHERE" prefixOverrides="AND|OR"><if test="name != null">AND name LIKE '%${name}%'</if><if test="age != null">OR age = ${age}</if></trim>
</select>
总结
以上是 MyBatis 中常用的 XML 标签及其用途。通过这些标签,可以灵活地定义 SQL 语句、结果映射以及其他与数据库交互相关的配置。掌握这些标签的使用方法,可以帮助你更好地利用 MyBatis 处理复杂的数据库操作。
注意
- sql的配置有两种方式:动态SQL和xml配置
- 推荐使用xml配置,原因如下:
某些场景下,可能需要对迁移到其他类型数据库,使用xml配置:
- 可以不需要改动代码, 而仅需复制一份xml, 针对新的类型的数据库进行兼容性改造。
- 新旧数据库切换时,在发生异常时,可以切换回旧的数据库操作,保证业务连续性。
参考文献
官网中文文档
相关文章:
springboot组件使用-mybatis组件使用
文章目录 springboot使用mybatis组件1. 添加依赖2. 配置数据源3. 创建实体类4. 创建Mapper接口5. 创建Mapper XML文件6. 使用Mapper7. 启动类配置 mybtis 动态SQL1. Mapper 注解2. Select 注解3. Insert 注解4. Update 注解5. Delete 注解6. Results 注解7. Param 注解8. Cache…...
Ribbon 源码分析【Ribbon 负载均衡】
前言 在 Spring Cloud 2020 版本以后,移除了对 Netflix 的依赖,也就移除了负载均衡器 Ribbon,Spring Cloud 官方推荐使用 Loadbalancer 替换 Ribbon,而在 LoadBalancer 之前 Spring Cloud 一直使用的是 Ribbon 来做负载[均衡器的…...

Python | Leetcode Python题解之第385题迷你语法分析器
题目: 题解: class Solution:def deserialize(self, s: str) -> NestedInteger:if s[0] ! [:return NestedInteger(int(s))stack, num, negative [], 0, Falsefor i, c in enumerate(s):if c -:negative Trueelif c.isdigit():num num * 10 int…...

进程间通信-进程池
目录 理解 完整代码 完善代码 回收子进程: 不回收子进程: 子进程使用重定向优化 理解 #include <iostream> #include <unistd.h> #include <string> #include <vector> #include <sys/types.h>void work(int rfd) {…...

【PYTHON 基础系列-request 模块介绍】
一、requests库简介 使用requests库能快速构建 HTTP 请求,而无需深入了解底层网络协议细节。其API设计直观,使得发送请求就像调用函数一样简单,同时提供了丰富的选项以满足复杂网络交互的需求。这种设计使得无论是初学者还是经验丰富的开发者…...
springboot 实现策略模式通过id进入不同的服务类service
在Spring Boot中实现策略模式,通常是将不同的算法封装在单独的类中,并使它们可以相互替换。这些类通常都实现同一个接口。在Spring Boot应用中,你可以通过Spring的依赖注入(DI)来管理这些策略类的实例,并通…...
AUC真的什么情形下都适合吗
AUC(Area Under the ROC Curve)是一个广泛使用的性能评价指标,它衡量了分类模型在不同阈值下区分正类和负类的能力。然而,在某些情况下,AUC可能不是最准确的评价指标,以下是几种可能的情况: 数据极度不均衡:在数据极度不均衡的情况下,即使模型只预测多数类,AUC也可能…...

Flutter基本组件Text使用
Text是一个文本显示控件,用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…...

DDS基本原理--FPGA学习笔记
DDS信号发生器原理: timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/09/04 15:20:30 // Design Name: hilary // Module Name: DDS_Module //module DDS_Module(Clk,Reset_n,Fword,Pword,Data);input Clk;input Reset_n;input [31:0]…...
有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数
有temp表,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数 建表语句如下 CREATE TABLE temp(A STRING ,B STRING );INSERT INTO …...

【H2O2|全栈】关于HTML(6)HTML基础(五 · 完结篇)
HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类(五) 本文中的标签在什么位置中使用? 表单(二) 下拉选择菜单 文本域 案例 拓展标签 iframe框架 案例 预告和回顾 后话 前言 本系列博客介…...

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家
前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家,个人还是非常推荐这个比赛。 难度分布:4 easy/4 mid-hard/2 hard 赛前练习赛一…...
IIS网站允许3D模型类型的文件
参与threejs项目的研发,本地开发完成后,发布后使用时发现模型文件不能正常获取资源,原因是IIS站点默认不支持模型类型。 一开始是通过直接在IIS网站管理中的类型添加来实现网站对类型的支持。 后来发现一段对于后端来说可以直接实现代码上添加…...

Linux 性能调优之CPU上下文切换
写在前面 博文内容为 Linux 性能指标 CPU 上下文切换认知内容涉及: 上下文认知,发生上下文切换的场景有哪些上下文指标信息查看,内核上下文切换事件跟踪,系统上下文切换统计上下文异常场景分析,CPU亲和性配置优化上下文…...

【无标题】符文价值的退化页
我们利用现有的符文体系建立了一个健全的符文扩展空间,可假若符文让我们感到十分困惑,我们不介意毁灭它们,让一切回到没有字迹的蛮荒纪。 如此,眼睛也失去了作用。我们的成GUO也会给后来者提供又是一DUI 令人眼花缭乱的无用符咒。…...

DFS 算法:洛谷B3625迷宫寻路
我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法:记忆化搜索DFS 算法…...

结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141931518 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
Android 15 新特性快速解读指南
核心要点 16K 页面大小支持目前作为开发人员选项提供,并非强制要求。 引入多项提升开发体验、多语言支持、多媒体功能、交互体验和隐私安全的更新。 重点关注前台服务限制、Window Insets 行为变化、AndroidManifest 文件限制等适配要求。 开发体验 ApplicationS…...
【机器人工具箱Robotics Toolbox开发笔记(十九)】机器人工具箱Link类函数参数说明
机器人工具箱中的Link对象保存于机器人连杆相关的所有信息,如运动学参数、刚体惯性参数、电机和传动参数等。 与Link对象有关参数如表1所示。 表1 Link对象参数 参 数 意 义 参 数 意 义 A 连杆变换矩阵 islimit 测试关节是否超过软限制 RP RP关节类型 isrevo…...

排查SQL Server中的内存不足及其他疑难问题
文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...