初学Mybatis之动态 SQL

news2024/9/17 7:42:34

动态 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("-","");
    }

    @Test
    public 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 {
    @Test
    public 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 = "张三";

    @Test
    public 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>

测试类:

    @Test
    public 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>

测试:

    @Test
    public 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.coloradmin.cn/o/1959366.html

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

相关文章

华为od机试真题:悄悄话(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给定一个二叉树&#xff0c;每个节点上站一个人&#xff0c;节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时&#xff0c;根节点所在位置的人有一个悄悄话想要传…

windows家庭版安装Hyper-V

uniapp开发鸿蒙需要开启Hyper-V&#xff0c;但家庭版默认没有&#xff0c;去网上搜索整理了一下。 1.检查是否安装过Hyper-V 直接搜索 Hyper-V&#xff0c;如果出现就代表有&#xff0c;如果没出现&#xff0c;就搜索 启用或关闭windows功能 。 如果有Hyper-V这一项&…

eclipse手动安装Ivy插件

1、下载四个文件 &#xff08;1&#xff09;从这个网址选择一个自己需要的版本的“ivy-”开头的文件夹进去&#xff08;是“ivy”开头&#xff0c;不是“ivyde”&#xff09; https://archive.apache.org/dist/ant/ivyde/updatesite/ 我这里选的是“ivy-2.5.0.final_201910201…

TortoiseSVN迁移到本地git

TortoiseSVN迁移到本地git 文章目录 TortoiseSVN迁移到本地git0 背景1 环境准备2 SVN库迁移到VisualSVN2.1 导出dump2.2 将dump文件灌入VisualSVN2.3 获取SVN仓最新URL 3 迁移到Git库中4 迁移分支到Git库 0 背景 之前在前东家工作都是采用git进行项目管理&#xff0c;高效便捷…

大模型应用中常听说的投毒实验是什么?

大模型应用中常听说的投毒实验是什么&#xff1f; 大模型投毒实验是指在训练或使用大规模人工智能模型&#xff08;如GPT-4等&#xff09;时&#xff0c;通过有意加入恶意数据或修改训练过程&#xff0c;使模型产生不正确或有害输出的行为。随着人工智能技术的快速发展&#x…

【深度学习】声码器(Vocoder),Vocos 论文

Vocos: Closing the gap between time-domain and Fourier-based neural vocoders for high-quality audio synthesis https://arxiv.org/abs/2306.00814 https://github.com/gemelo-ai/vocos?tabreadme-ov-file 文章目录 Vocos&#xff1a;弥合时域和基于傅里叶的神经声码器…

必看!50个ChatGPT顶尖学术论文指令,助你高效学术研究

随着人工智能技术的进步&#xff0c;AI已成为学术创作的重要工具。本文将为您展示如何利用AI来润色您的论文。我们精心整理了50个顶级ChatGPT学术论文指令&#xff0c;强烈建议您加以利用&#xff01; 这些指令不仅实用&#xff0c;还能大幅提升您的写作效率。无论是翻译难懂的…

高效的知识付费SaaS平台构建:探索Spring Cloud结合Spring Boot的最佳实践

知识付费平台&#xff1a;引领在线教育的未来 在数字化教育的浪潮中&#xff0c;知识付费平台以其便捷、高效的学习方式&#xff0c;迅速成为教育领域的新宠。该平台围绕用户需求构建&#xff0c;提供职业技能、生活兴趣、人文社科等多领域的专业知识&#xff0c;并通过视频播…

【时时三省】(C语言基础)for循环

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 语法 fou(表达式1&#xff1b;表达式2&#xff1b;表达式3) 循环语句 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判…

Vue 中使用 InMap 创建动态轨迹地图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 中使用 InMap 创建动态轨迹地图 应用场景介绍 动态轨迹地图广泛应用于物流追踪、车辆管理、人员定位等场景&#xff0c;可直观展示移动对象的历史轨迹和实时位置。本代码示例展示了如何使用 Vue 框架和 I…

vue3 antdv3 检测Modal的尺寸是否改变,全屏的时候获取Modal的width与height,然后我们就可以动态设置表格高度了。

1、先上个图&#xff0c;我们要实现如下的效果&#xff0c;中间的表格部分要自动随Modal的改变而改变。官方&#xff1a;Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、那我们一定要能够检测到Modal的宽高的改变才行&#xff0c;然后…

2024非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输!

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#…

vue实现简易的全局加载动画效果

效果展示 思路 封装一个组件&#xff0c;放Img&#xff0c;伪类样式&#xff0c;固定在屏幕fixed 然后App应用这个组件&#xff0c;Z index拉最大&#xff0c;防止用户在加载动画时乱点&#xff0c; v-show绑定loading&#xff0c;该数据可以放vuex还是任一的公共状态管理变…

Vue中使用wangEditor富文本编辑器|图片上传(含后端代码)

一、效果 二、安装依赖 npm install wangeditor --save npm install wangeditor/editor-for-vuenext --save 三、使用 在src下common文件夹下创建wangEditor文件夹&#xff0c;并在其文件夹下创建index.vue文件 <template><div style"border: 1px solid #ccc…

2024杭电多校第四场

目录 1003-最优 K 子段 1005-多层血条 1007-序列更新 1009-昵称检索 1012-寻找宝藏 概率专场&#xff1f; 1003-最优 K 子段 二分答案&#xff0c;判断能否划分出 k 个不相交子段使得每段长度都是质数且权值和至少为 mid 从左往右贪心进行划分&#xff1a;维护一个集合 …

解析淘宝商品评论API返回值中的用户画像与偏好

在淘宝或类似电商平台的商品评论API中&#xff0c;用户画像和偏好通常不会直接作为评论本身的返回值出现&#xff0c;因为用户画像和偏好通常涉及更广泛的用户行为数据分析和隐私保护。不过&#xff0c;通过一些间接的方式和数据处理技术&#xff0c;我们可以从评论数据或其他A…

清华学姐熬夜肝了15天的软件测试面试题出炉(附答案)建议收藏!

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以…

技术速递|Java on Azure Tooling 6月更新 - Azure Container Apps工作负载配置文件支持

作者&#xff1a;Jialuo Gan 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 开发者工具6月份更新。在本次更新中&#xff0c;我们将介绍在 IntelliJ IDEA 中 Azure Toolkit 对 Azure Container Apps 提供的工作负载配置文件支持。我们希望您喜欢这些更新…

vue3项目报错集合

目录 一、does not provide an export named default 一、does not provide an export named default 报错截图&#xff1a; 原因&#xff1a; vite对commonjs兼容性太差&#xff0c;导致无法引入jsoneditor&#xff0c;可以使用originjs/vite-plugin-commonjs插件解决。&am…

cdga|数据资产运营:加速企业数据价值释放的新引擎

在当今这个数字化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其潜在价值远超传统意义上的货币、土地和人力资源。然而&#xff0c;仅仅拥有海量数据并不足以确保企业在激烈的市场竞争中脱颖而出&#xff0c;关键在于如何有效运营这些数据资产&#xff0c;以加…