Mybatis进阶(动态SQL)

文章目录

    • 1.动态SQL
        • 1.基本介绍
          • 1.为什么需要动态SQL
          • 2.基本说明
          • 3.动态SQL常用标签
        • 2.环境搭建
          • 1.新建子模块
          • 2.删除不必要的两个文件夹
          • 3.创建基本结构
          • 4.父模块的pom.xml
          • 5.jdbc.properties
          • 6.mybatis-config.xml
          • 7.MyBatisUtils.java
          • 8.MonsterMapper.java
          • 9.MonsterMapper.xml
          • 10.测试MonsterMapperTest.java
        • 3.动态SQL-if标签
          • 1.需求分析
          • 2.MonsterMapper.java添加@Param注解
          • 3.MonsterMapper.xml
          • 4.测试
        • 4.动态SQL-where标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 5.动态SQL-choose标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 6.动态SQL-foreach标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 7.动态SQL-set标签(重点)
          • 1.需求分析
          • 2. MonsterMapper.java添加方法
          • 3.MonsterMapper.xml
          • 4.测试

1.动态SQL

1.基本介绍
1.为什么需要动态SQL

image-20240304161024014

2.基本说明

image-20240304161328438

3.动态SQL常用标签

image-20240304161355168

2.环境搭建
1.新建子模块

image-20240304161536794

2.删除不必要的两个文件夹

image-20240304161639688

3.创建基本结构

image-20240304162428796

4.父模块的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><name>Archetype - mybatis</name><url>http://maven.apache.org</url><modules><module>mybatis_quickstart</module><module>xml-mapper</module><module>dynamic-sql</module></modules><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--如果设置scope为test,则只能在test包下使用--><scope>test</scope></dependency></dependencies><!--在父模块中的pom.xml文件中配置在build的时候要扫描的文件,解决某些类型文件拷贝到target目录失败的问题--><build><resources><resource><directory>src/main/java</directory><includes><!--在java文件夹下的多级目录下的xml文件--><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><!--在resources文件夹下的多级目录下的xml文件和properties文件--><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources></build>
</project>
5.jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
6.mybatis-config.xml
  • 配置com.sun.entity的类型别名
  • 引入com.sun.mapper里的Mapper.xml文件或者带注解的类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入外部文件jdbc.properties--><properties resource="jdbc.properties"/><!--配置mybatis自带的日志,settings需要放到最前面--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置类型别名--><typeAliases><!--方式二:这样配置完了在这个包下的所有类都可以直接使用类名表示--><package name="com.sun.entity"/></typeAliases><environments default="development"><environment id="development"><!--配置事务管理器--><transactionManager type="JDBC"/><!--配置数据源--><dataSource type="POOLED"><!--配置驱动--><property name="driver" value="${jdbc.driver}"/><!--配置连接url--><!--1.jdbc:mysql:协议2.127.0.0.1:3306:指定连接mysql的ip+端口3.mybatis:连接的db4.useSSL:使用安全连接5.&amp;:表示&6.useUnicode=true:使用unicode,防止编码错误7.characterEncoding=UTF-8:字符集使用utf-8--><property name="url" value="${jdbc.url}"/><!--用户名--><property name="username" value="${jdbc.username}"/><!--密码--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><!--包的方式引入含有Mapper.xml文件的类--><package name="com.sun.mapper"/></mappers></configuration>
7.MyBatisUtils.java
package com.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.InputStream;/*** @author 孙显圣* @version 1.0*/
public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;//使用静态代码块初始化SqlSessionFactorystatic {try {//获取Mybatis配置文件的输入流String resource = "mybatis-config.xml";//默认是从类路径下获取资源,在maven中指的就是resources文件夹下,会映射到实际的工作目录InputStream resourceAsStream = Resources.getResourceAsStream(resource);//读取资源获取SessionFactory,可以理解为连接池sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {throw new RuntimeException(e);}}//编写方法返回SqlSessionpublic static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}
8.MonsterMapper.java
package com.sun.mapper;/*** 这个接口用于声明操作monster表的方法** @author 孙显圣* @version 1.0*/
public interface MonsterMapper {}
9.MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.MonsterMapper"></mapper>
10.测试MonsterMapperTest.java
package com.sun.mapper;import com.sun.entity.Monster;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class MonsterMapperTest {//两个属性private SqlSession sqlSession; //相当于连接private MonsterMapper monsterMapper;//编写方法完成初始化@Before //标注了Before之后表示了在执行目标测试方法前会执行该方法public void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//获取到MonsterMapper对象monsterMapper = sqlSession.getMapper(MonsterMapper.class);System.out.println(monsterMapper.getClass());}@Testpublic void test() {System.out.println("ttt");}}

image-20240304163252656

3.动态SQL-if标签
1.需求分析

image-20240304163531716

2.MonsterMapper.java添加@Param注解
package com.sun.mapper;import com.sun.entity.Monster;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 这个接口用于声明操作monster表的方法** @author 孙显圣* @version 1.0*/
public interface MonsterMapper {//使用@Param("age")注解来使得动态sql的test域可以取出这个agepublic List<Monster> findMonsterByAge(@Param("age") Integer age);
}
3.MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.MonsterMapper"><!--public List<Monster> findMonsterByAge(Integer age);要求:当用户输入的值不大于0则输出所有妖怪--><select id="findMonsterByAge" resultType="Monster" parameterType="Integer">select * from monster where 1 = 1<!--这里的age是在参数中使用@Param注解取出的--><if test="age >= 0">and age > #{age}</if></select>
</mapper>
4.测试
    @Testpublic void findMonsterByAge() {List<Monster> list = monsterMapper.findMonsterByAge(10);for (Monster monster : list) {System.out.println(monster);}//关闭sqlsessionif (sqlSession != null) {sqlSession.close();}}
4.动态SQL-where标签
1.需求分析

image-20240304171800511

2.MonsterMapper.java添加方法
    public List<Monster> findMonsterByIdAndName(Monster monster);
3.MonsterMapper.xml添加实现类
    <!--public List<Monster> findMonsterByIdAndName(Monster monster);1.id小于0则不拼接,名字为空也不拼接2.where标签会自动清除没用的and3.如果传入的是对象,就不用使用@Param--><select id="findMonsterByIdAndName" resultType="Monster" parameterType="Monster">SELECT * FROM monster<where><if test="id >= 0">and id > #{id}</if><if test="name != null and name != ''">and `name` = #{name}</if></where></select>
4.测试
    @Testpublic void findMonsterByIdAndName() {Monster monster = new Monster();monster.setId(4);monster.setName("牛魔王");List<Monster> monsters = monsterMapper.findMonsterByIdAndName(monster);for (Monster monster1 : monsters) {System.out.println(monster1);}//关闭sqlsessionif (sqlSession != null) {sqlSession.close();}}

image-20240304185503494

5.动态SQL-choose标签
1.需求分析

当name不为空和id>0的时候有不同的操作

2.MonsterMapper.java添加方法
    public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);
3.MonsterMapper.xml添加实现类
<!--    public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);--><select id="findMonsterByIdOrName_choose" parameterType="map" resultType="Monster">select * from `monster`<choose><when test="name != null and name != ''">where `name` = #{name}</when><when test="id > 0">where `id` = #{id}</when><otherwise>where `salary` > 100</otherwise></choose></select>
4.测试
    @Testpublic void findMonsterByIdOrName_choose() {Map<String, Object> map = new HashMap<String, Object>();map.put("id", 2);map.put("name", "");List<Monster> list = monsterMapper.findMonsterByIdOrName_choose(map);for (Monster monster : list) {System.out.println(monster);}}
6.动态SQL-foreach标签
1.需求分析

查询id为1,2,3的妖怪

2.MonsterMapper.java添加方法
public List<Monster> findMonsterById_forEach(Map<String, Object> map);
3.MonsterMapper.xml添加实现类
    <select id="findMonsterById_forEach" parameterType="map" resultType="Monster">select * from `monster`<if test="ids != null and ids != ''"><where>id in<!--map中传入一个ids集合为[1,2,3]目标:id in (1,2,3)collection:要遍历的集合item:遍历的数据项open:开始标志close:结束标志separator:数据间隔--><foreach collection="ids" item="id" open="(" separator="," close=")"><!--  这里取出的是item里的id-->#{id}</foreach></where></if></select>
4.测试
    @Testpublic void findMonsterById_forEach() {Map<String, Object> map = new HashMap<String, Object>();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(2);ids.add(3);//添加一个集合key为idsList<Monster> list = monsterMapper.findMonsterById_forEach(map);for (Monster monster : list) {System.out.println(monster);}}
7.动态SQL-set标签(重点)
1.需求分析

image-20240305144952009

2. MonsterMapper.java添加方法
    public void updateMonster_set(Map<String, Object> map);
3.MonsterMapper.xml
    <!--根据id来对表进行修改,如果没有传值则不修改那个字段--><!--public void updateMonster_set(Map<String, Object> map);--><!--UPDATE monster , birthday = '2020-1-2', email = 'libai@qq.com', gender = 1, name = '李白', salary = 12.2 WHERE id = 3--><update id="updateMonster_set" parameterType="map">UPDATE monster<set><if test="age != null and age != ''">age = #{age},</if><if test="birthday != null and birthday != ''">birthday = #{birthday},</if><if test="gender != null and gender != ''">gender = #{gender},</if><if test="name != null and name != ''">name = #{name},</if><if test="salary != null and salary != ''">salary = #{salary},</if><if test="salary != null and salary != ''">salary = #{salary},</if></set>where id = #{id}</update>
4.测试
    @Testpublic void updateMonster_set() {Map<String, Object> map = new HashMap<String, Object>();map.put("id", 3);map.put("age", 22);map.put("gender", 1);monsterMapper.updateMonster_set(map);}

image-20240305160803238

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业互联网通讯协议—欧姆龙(Fins tcp)

一、场景 近期公司要对欧姆龙CP系列设备的数据采集&#xff0c;于是就研究了下欧姆龙的Fins Tcp协议。 二、Fins Tcp 组成字节说明固定头446494E53 FINS对应的ASCII码的十六进制长度4后面剩余指令的长度命令4 握手固定为&#xff1a;00000000 读写固定为&#xff1a;0000000…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

【第3节】“茴香豆“:搭建你的 RAG 智能助理

目录 1 基础知识1.1.RAG技术的概述1.2 RAG的基本结构有哪些呢&#xff1f;1.3 RAG 工作原理&#xff1a;1.4 向量数据库(Vector-DB )&#xff1a;1.5 RAG常见优化方法1.6RAG技术vs微调技术 2、茴香豆介绍2.1应用场景2.2 场景难点2.3 茴香豆的构建&#xff1a; 3 论文快读4 实践…

15(第十四章,大数据和数据科学)

目录 概述 基本概念 数据仓库/传统商务智能与数据科学的比较 数据科学的过程 大数据 大数据来源 数据湖 机器学习 监督学习 无监督学习 强化学习 扩展 1、数据仓库&#xff08;Data Warehouse&#xff09; 2、数据湖(Data Lake) 3、大数据平台1.0 4、数据中台 …

外贸企业邮箱是什么?Zoho Mail——你的专业外贸邮局

外贸企业邮箱是什么&#xff1f;做外贸行业必须要有企业邮箱吗&#xff1f;这是一些外贸企业的困惑。外贸企业邮箱和我们平时使用的个人邮箱有着几方面的不同。一是安全稳定&#xff1b;二是功能丰富性&#xff1b;三是存储空间更大。Zoho Mail企业邮箱在这些方面都能满足外贸企…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

Java 获取 Outlook 邮箱的日历事件

Java 获取 Outlook 邮箱的日历事件 1.需求描述2.实现方案3.运行结果 IDE&#xff1a;IntelliJ IDEA 2022.3.3 JDK&#xff1a;1.8.0_351 Outlook&#xff1a;Microsoft Office 2016 1.需求描述 比如现在需要获取 Outlook 邮箱中四月的全部的会议安排&#xff0c;如下图所示 …

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…

STM32G030F6P6TR 芯片TSSOP20 MCU单片机微控制器芯片

STM32G030F6P6TR 在物联网&#xff08;IoT&#xff09;设备中的典型应用案例包括但不限于以下几个方面&#xff1a; 1. 环境监测系统&#xff1a; 使用传感器来监测温度、湿度、气压等环境因素&#xff0c;并通过无线通信模块将数据发送到中央服务器或云端平台进行分析和监控。…

Windows之隐藏特殊文件夹(自定义快捷桌面程序)

作者主页&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月1日12点55分 祝大家劳动节快乐~ Windows中的特殊文件夹是指一些预定义的文件夹&#xff0c;用于存储特定类型的数据或文件。这些文件夹通常由操作系统或应用程序使用&#xff0c;但用户也可以访问和管理它…

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 有建议要 1.0.1 版本的&#xff0c;但本人按上面的是可以正常使用&#xff08;看…

【docker 】Windows10安装 Docker

安装 Hyper-V Hyper-V 是微软开发的虚拟机&#xff0c;仅适用于 Windows 10。 按键&#xff1a; win键X &#xff0c;选着程序和功能 在查找设置中输入&#xff1a;启用或关闭Windows功能 选中Hyper-V 点击确定 安装 Docker Desktop for Windows Docker Desktop 官方下载…

013、Python+fastapi,第一个后台管理项目走向第13步:建立python+fastapi项目,创建cache模块

一、说明 在今天学习RuoYi-Vue3-FastAPI的代码过程中&#xff0c;我遇到了几个问题&#xff0c;下面说说自己的感想 二、自定义的log装饰器 源码中是log_annotation.py&#xff0c;代码也没什么好说的&#xff0c;这个知识点到处都是文章&#xff0c;可以在csdn上搜索学习&a…

数据结构—C语言实现双向链表

目录 1.双向带头循环链表 2.自定义头文件&#xff1a; 3.List.cpp 文件 3.1 newnode()函数讲解 3.2 init() 函数 初始化 3.3 pushback()函数 尾插 3.4 pushfront()函数 头插 3.5 popback() 尾删 3.6 popfront() 函数 头删 3.7 insert()函数 在pos之后插入 3.8 popbac…

ZooKeeper 环境搭建详细教程之三(真集群)

ZooKeeper 搭建详细步骤之三(真集群) ZooKeeper 搭建详细步骤之二(伪集群模式) ZooKeeper 搭建详细步骤之一(单机模式) ZooKeeper 及相关概念简介 真集群搭建 搭建 ZooKeeper 真集群涉及多个步骤,包括准备环境、配置文件设置、启动服务以及验证集群状态。 以下是一个简…

AC+AP三层组网实验(华为)

一&#xff0c;技术简介 APAC架构是一种常见的无线局域网&#xff08;WLAN&#xff09;组网方式&#xff0c;主要由接入点&#xff08;Access Point&#xff0c;简称AP&#xff09;和接入控制器&#xff08;Access Controller&#xff0c;简称AC&#xff09;组成。 在APAC架构…

PotatoPie 4.0 实验教程(25) —— FPGA实现摄像头图像直方图均衡变换

图像的直方图均衡是什么&#xff1f; 图像的直方图均衡是一种用于增强图像对比度的图像处理技术。在直方图均衡中&#xff0c;图像的像素值被重新分配&#xff0c;以使得图像的直方图变得更均匀&#xff0c;即各个像素值的分布更加平衡。这意味着直方图中每个像素值的频率大致…

免费ChatGPT合集——亲测免费

1、YesChat 无需登录 网址&#xff1a;YesChat-ChatGPT4V Dalle3 Claude 3 All in One Freehttps://www.yeschat.ai/ 2. 讯飞星火 要登录 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 3.通义千问 要登录 通义我是通义&#xff0c;一个专门响应人类指令的…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…