初学Mybatis之动态 SQL

动态 SQL 是指根据不同的条件生成不同的 SQL 语句

动态 SQL 详情请看链接

搭建环境:

mysql 建立博客表

CREATE TABLE `blog`(`id` VARCHAR(50) NOT NULL COMMENT '博客id',`title` VARCHAR(100) NOT NULL COMMENT '博客标题',`author` VARCHAR(30) NOT NULL COMMENT '博客作者',`create_time` DATETIME NOT NULL COMMENT '创建时间',`views` INT(30) NOT NULL COMMENT '浏览量'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

创建基础工程步骤:

1.导包

2.编写配置文件

3.编写实体类

4.编写实体类对应的 Mapper 接口和 Mapper.xml 文件

实体类:

package com.demo.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Bolg {private String id;private String title;private String author;private Date createTime;private int views;
}

核心配置文件注册:

    <mappers><mapper class="com.demo.dao.BlogMapper"/></mappers>

工具类:

package com.demo.utils;import org.junit.Test;import java.util.UUID;@SuppressWarnings("all") //抑制警告
public class IDutils {public static String getId(){//生成随机数return UUID.randomUUID().toString().replaceAll("-","");}@Testpublic void test(){System.out.println(IDutils.getId());}}

mapUnderscoreToCamelCase

是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn

 核心配置文件 settings 设置:

    <settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings>

 接口:

package com.demo.dao;
import com.demo.pojo.Bolg;
public interface BlogMapper {//插入数据int addBlog(Bolg bolg);
}

mapper.xml 写 sql 语句:

<mapper namespace="com.demo.dao.BlogMapper"><insert id="addBlog" parameterType="com.demo.pojo.Bolg">insert into blog (id,title,author,create_time,views)values (#{id},#{title},#{author},#{createTime},#{views});</insert>
</mapper>

 测试类:

package com.demo.dao;import com.demo.pojo.Bolg;
import com.demo.utils.IDutils;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.Date;public class MyTest {@Testpublic void addBlog(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);Bolg bolg = new Bolg();bolg.setId(IDutils.getId());bolg.setTitle("Mybatis");bolg.setAuthor("张三");bolg.setCreateTime(new Date());bolg.setViews(100);mapper.addBlog(bolg);bolg.setId(IDutils.getId());bolg.setTitle("Java");mapper.addBlog(bolg);bolg.setId(IDutils.getId());bolg.setTitle("Spring");mapper.addBlog(bolg);sqlSession.close();}
}

插入数据成功(设了日志)

if 语句:(实现精准搜索)

写个查询接口

public interface BlogMapper {//插入数据int addBlog(Bolg bolg);//查询博客List<Bolg> queryBlogIf(Map map);
}

mapper.xml:

<if test=" 非空 ">

        and xx = #{xx}

</if>

实现查询语句的拼接

    <select id="queryBlogIf" parameterType="map" resultType="com.demo.pojo.Bolg">select * from blog where 1=1<if test="title != null">and title = #{title}</if><if test="author != null">and author = #{author}</if></select>

测试:

new 一个 HashMap

通过 put 方法为查询语句拼接 title、author,指定二者的某条数据

即 select * from blog where title = "Java" and author = "张三";

    @Testpublic void queryBlogIf() {SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);HashMap map = new HashMap();map.put("title","Java");map.put("author","张三");for (Bolg bolg : mapper.queryBlogIf(map)) {System.out.println(bolg);}sqlSession.close();}

可以看到查出一条数据

where 标签:

 <select id="queryBlogIf" parameterType="map" resultType="com.demo.pojo.Bolg">select * from blog<where><if test="title != null">title = #{title}</if><if test="author != null">and author = #{author}</if></where></select>

choose 选择:多个条件中选择一个使用

写个接口:

List<Bolg> queryBlogChoose(Map map);

choose 标签和 when 标签配套

只要执行了第一个,后面就不执行

    <select id="queryBlogChoose" parameterType="map" resultType="com.demo.pojo.Bolg">select * from blog<where><choose><when test="title != null">title = #{title}</when><when test="author != null">and author = #{author}</when><otherwise>and views = #{views}</otherwise></choose></where></select>

测试类:

    @Testpublic void queryBlogChoose() {SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);HashMap map = new HashMap();//map.put("title","Java");map.put("author","张三");map.put("views",100);for (Bolg bolg : mapper.queryBlogChoose(map)) {System.out.println(bolg);}sqlSession.close();}

运行结果:

set 标签:

set 元素会动态地在行首插入 SET 关键字,同时删掉额外的逗号

(这些逗号是在使用条件语句给列赋值时引入的)

写个接口:

    //更新博客int updateBlog(Map map);

修改数据 sql:

    <update id="updateBlog" parameterType="map">update blog<set><if test="title != null">title = #{title}</if><if test="author != null">author = #{author}</if></set>where id = #{id}</update>

自定义 trim 元素来定制 where 元素的功能 

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

 同理,prefix 前缀也可以是 SET

<trim prefix="SET" suffixOverrides=",">...
</trim>

所谓动态 SQL,本质上还是 SQL 语句

只是我们可以在 SQL 层面,去执行一个逻辑代码

需要复用时,可以使用 SQL 标签抽取公共部分,在需要使用的地方用 Include 标签引用即可

    <sql id="xx"><if test="title != null">title = #{title}</if><if test="author != null">and author = #{author}</if></sql><select id="queryBlogIf" parameterType="map" resultType="com.demo.pojo.Bolg">select * from blog<where><include refid="xx"> </include></where></select>

foreach 标签:对集合进行遍历

指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量

它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符

写个接口:

List<Bolg> queryBlogForeach();

map 可以存在一个集合

    <!-- map可以存在一个集合 --><select id="queryBlogForeach" parameterType="map" resultType="com.demo.pojo.Bolg">select * from blog<where><foreach collection="ids" item="id" open="and (" close=")" separator="or">id = #{id}</foreach></where></select>

测试:

    @Testpublic void queryBlogForeach() {SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);HashMap map = new HashMap();ArrayList<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(2);ids.add(3);map.put("ids",ids);for (Bolg bolg : mapper.queryBlogForeach(map)) {System.out.println(bolg);}sqlSession.close();}

可以看到执行的查询语句

动态 SQL 就是拼接 SQL 语句,只需保证 SQL 的正确性,按照 SQL 的格式排列组合即可

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

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

相关文章

SolidWorks 2022安装包下载(图文详细安装教程)

SolidWorks 2022提供了强大的工具和功能&#xff0c;旨在帮助工程师和设计师进行产品设计和工程分析。它具有直观的用户界面和用户友好的操作&#xff0c;使得用户可以快速上手并进行复杂的设计任务。 主要特点和功能包括&#xff1a; 三维建模和装配&#xff1a;SolidWorks 20…

电脑没有摄像头怎么用手机当摄像头?虚拟摄像头使用的详细教程来了(全)

随着科技水平以及全球化经济的快速发展&#xff0c;视频会议、在线课程和直播已经成为日常办公或者生活中必不可少的一个环节。然而&#xff0c;在如今仍有许多台式电脑和一些老旧的笔记本电脑并没有内置摄像头&#xff0c;亦或者自带的摄像头质量不够理想&#xff0c;这使得视…

《python语言程序设计》2018版第6章第19题几何问题点的位置,利用4.31显示如何测试一个点是在一条有向线的左、右还是刚好在线上

# 这个是4.31的代码&#xff0c;一个函数里包含了。在线上&#xff0c;在线左&#xff0c;在线右 def judgePoint(x0, y0, x1, y1, x2, y2):juMethod ((x1 - x0) * (y2 - y0)) - ((x2 - x0) * (y1 - y0))if juMethod > 0:print("p2 is on the left side of the line f…

学习笔记:MySQL数据库操作5

1. 触发器&#xff08;Triggers&#xff09; 触发器是数据库的一种高级功能&#xff0c;它允许在执行特定数据库操作&#xff08;如INSERT、UPDATE、DELETE&#xff09;之前或之后自动执行一段代码。 1.1 创建商品和订单表 商品表&#xff08;goods&#xff09; gid: 商品编号…

Web3.js 4.x版本事件监听详解:从HTTP到WebSocket的迁移

项目场景 在一个使用以太坊区块链技术的项目中&#xff0c;需要监听智能合约的事件&#xff0c;以便在事件触发时能够及时响应。项目中使用了web3.js库的4.x版本&#xff0c;节点使用Geth启动&#xff0c;并通过HTTP与节点进行通信。 问题描述 合约DataStorage.sol文件已经定…

优雅单片机之STM32C8T6------蓝牙模块基本设置(2)

0&#xff0c;C8T6系列 1&#xff0c;入门之程序的下载 2&#xff0c;蓝牙模块基本设置&#xff08;本文&#xff09; 2&#xff0c;蓝牙模块基本应用 3&#xff0c;蓝牙小车&#xff08;待定&#xff09; 一&#xff0c;蓝牙模块基础设置 需要硬件&#xff1a;电脑&#x…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…

NGINX项目实战

一、nginx四层代理 部署支持4层TCP/UDP代理的Nginx服务器 部署nginx服务器 编译安装必须要使用--with-stream参数开启4层代理模块。 [rootproxy ~]# rm -rf /usr/local/nginx/ #清理环境 [rootproxy nginx-1.16.1]# ./configure --with-http_ssl_module --with-stream #开…

Java 沙漏图案(Hour-glass Pattern)

给定正整数 n&#xff0c;以沙漏形式打印数字模式。示例&#xff1a; 输入&#xff1a;rows_no 7 输出&#xff1a; 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 6 7 5 6 7 4 5 6 7 3 4 5 6 7 2 3 4 5 6 7 1 2 3 4 5 6…

phpwamp集成环境中里在php7.1.5下安装php_redis扩展及mysql索引类型和索引方法笔记

一、phpwamp集成环境中里在php7.1.5下安装php_redis扩展 phpwamp集成环境使用起来非常方便&#xff0c;选择要启用的环境启动即可&#xff0c;可以非常方便地在apache,nginx&#xff0c;php各版本之间切换。启动后的界面如下图&#xff0c;不过在使用phpwamp的过程中&#xff0…

C# 6.定时器 timer

使用控件&#xff1a; 开启定时器&#xff1a;timer1.Start(); 关闭定时器&#xff1a;timer1.Stop(); 定时间时间间隔:Interval timer1.Interval 1000; Interva等于1000是每一秒刷新一次 定时器默认时间间隔是100ms 代码创建定时器 ①创建 Timer t1 new Timer(); …

dotnet-starter-kit:一个Web API+Blazor多租户、模块化、简洁DDD架构!

推荐一个Web APIBlazor多租户、模块化、简洁DDD项目框架。 01 项目简介 dotnet-starter-kit是一个基于 .NET 8 的开源项目&#xff0c;架构构建基于 Clean Architecture 原则的解决方案。支持多租户、模块化&#xff0c;一个开箱即用的项目&#xff0c;方便我们快速开发项目。…

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级

定义一系列的AI行为类型和它们的优先级&#xff0c;以及一个映射表ai_tbl来关联每种AI行为类型与对应的脚本文件和优先级。以下是对代码的详细解释&#xff1a; lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客https://blog.csdn.net/heyuchang666/artic…

【C++题解】1069. 字符图形5-星号梯形

问题&#xff1a;1069. 字符图形5-星号梯形 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3输…

【公式解释】《系统论》《控制论》《信息论》的共同重构:探索核心公式与深度解析

《系统论》《控制论》《信息论》的共同重构&#xff1a;探索核心公式与深度解析 关键词&#xff1a;系统论、控制论、信息论、状态空间方程、系统矩阵。 Keywords: System theory, Control theory, Information theory, State-space equations, System matrices. 核心公式与…

访问控制列表(ACL)

文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List&#xff0c;访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows&#xff1a;微软公司开发的一款桌面操作系统&#xff08;闭源系统&#xff09;。版本有dos&#xff0c;win98&#xff0c;win NT&#xff0c;win XP , win7, win vista. win8, win10&#xff0c;win11。服务器操作系统&#xff1a;winserve…

论文阅读【检测】:商汤 ICLR2021 | Deformable DETR

文章目录 论文地址AbstractMotivation技术细节多尺度backbone特征MSDeformAttention 小结 论文地址 Deformable DETR 推荐视频&#xff1a;bilibili Abstract DETR消除对目标检测中许多手工设计的组件的需求&#xff0c;同时表现出良好的性能。然而&#xff0c;由于Transfor…

学习笔记之JAVA篇(0724)

p 方法 方法声明格式&#xff1a; [修饰符1 修饰符2 ...] 返回值类型 方法名&#xff08;形式参数列表&#xff09;{ java语句;......; } 方法调用方式 普通方法对象.方法名&#xff08;实参列表&#xff09;静态方法类名.方法名&#xff08;实参列表&#xff09; 方法的详…

软考:软件设计师 — 7.软件工程

七. 软件工程 1. 软件工程概述 &#xff08;1&#xff09;软件生存周期 &#xff08;2&#xff09;软件过程 软件开发中所遵循的路线图称为 "软件过程"。 针对管理软件开发的整个过程&#xff0c;提出了两个模型&#xff1a;能力成熟度模型&#xff08;CMM&#…