[SpringBoot]xml写mapper

news2024/11/18 20:19:46

创建工程
[SpringBoot框架]如何使用SpringBoot框架_万物更新_的博客-CSDN博客

 实现步骤:

 

测试:  

<?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="cn.tedu.demo529.mapper.ProductMapper"><!--里面写mapper接口的完全限定名-->
    <insert id="insert">
        INSERT INTO cs.product(id,title,price,num) VALUES (NULL,#{title},#{price},#{num})
    </insert>
    <select id="select" resultType="cn.tedu.demo529.entity.Product"># resultType这个里面想把数据封装成什么对象就写什么
        SELECT * FROM cs.product
    </select>
    <delete id="deleteById">
        DELETE FROM cs.product WHERE id=#{id}
    </delete>
    <update id="update">
        UPDATE cs.product SET title=#{title},price=#{price},num=#{num} WHERE id=#{id}
    </update>
</mapper>

动态sql

 第一种批量删除 

foreach循环遍历标签,collection用来设置遍历对象的类型,#{id}代表的是遍历出来的每一个item里面的id,separator=","是分割符号

  //第一种批量删除
    int deleteByIds1(Integer[] ids);

    <delete id="deleteByIds1">
        DELETE FROM cs.product WHERE id IN(
            <foreach collection="array" item="id" separator=",">#{id}</foreach>
            )
    </delete>
   @Test
    void delete1(){
        Integer[] ids = {10,11,12,13};
        System.out.println(productMapper.deleteByIds1(ids));
    }

第二种批量删除 参数为list集合

    //第二种批量删除
    int deleteByIds2(List<Integer> ids);
    <delete id="deleteByIds2">
        DELETE FROM cs.product WHERE id IN(
        <foreach collection="list" item="id" separator=",">#{id}</foreach>
        )
    </delete>

    @Test
    void delete2(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(18);
        list.add(19);
        list.add(20);
        System.out.println(productMapper.deleteByIds2(list));
    }

   第三种批量删除 参数为Integer... 和Array数组一样

 //第三种批量删除
    int deleteByIds3(Integer... ids);
    <delete id="deleteByIds3">
        DELETE FROM cs.product WHERE id IN(
        <foreach collection="array" item="id" separator=",">#{id}</foreach>
        )
    </delete>
    @Test
    void delete3(){
        System.out.println(productMapper.deleteByIds3(21,22,23,24));
    }

动态修改 

和上面普通修改的区别在于,如果set修改的字段没给值,那么根据实体类的包装类型会把原字段改为null,动态修改则只是给值的才修改,没给值的不会改.


把STE 改为<set>标签会把多余的逗号去掉(因为如果修改的字段是空的话就就会多一个逗号)


if标签用来进行动态的判断,满足条件时才会生成标签体内的

  //动态修改
    int dynamicUpdate(Product product);
   <update id="dynamicUpdate">
        UPDATE cs.product
        <set>
        <if test="title!=null">title=#{title},</if>
        <if test="price!=null">price=#{price},</if>
        <if test="num!=null">num=#{num}</if>
        </set>
        WHERE id=#{id}
    </update>
@Test
    void dynamicUpdate(){
        Product p = new Product();
        p.setId(25);
        p.setTitle("智能语言机器人");
        System.out.println(productMapper.dynamicUpdate(p));
    }

sql片段 

定义sql片段,如果要查询的字段非常多,就可以定义为片段

    <sql id="selectSQL">
        id,title,price,num
    </sql>
    <select id="selectById" resultType="cn.tedu.demo529.entity.Product">
    SELECT <include refid="selectSQL"></include> FROM cs.product WHERE id=#{id}
    </select>

也许会飘红,但不影响效果

 

 当使用MyBatis框架查询数据,自定义对象的属性名和表字段的名不一致时如何解决?

1.如果仅仅是命名规范不一致 可以通过在application.properties里面添加以下配置解决  

# 配置自动匹配对象属性名和表字段名不一致的问题
mybatis.configuration.map-underscore-to-camel-case=true

2.通过别名的方式解决 可以解决属性名和字段名完全不一致的问题

<select id="select" resultType="cn.tedu.boot10.entity.Class">
    SELECT id,class_name name,teacher_name teacherName,grade_level gradeLevel FROM class
</select>

 3.通过resultMap标签解决,比别名的好处是可以复用

<!--通过ResultMap标签解决属性名和字段名不一致的问题-->
<resultMap id="classRM" type="cn.tedu.boot10.entity.Class">
    <id property="id" column="id"></id>
    <result property="name" column="class_name"></result>
    <result property="teacherName" column="teacher_name"></result>
    <result property="gradeLevel" column="grade_level"></result>
</resultMap>
<select id="select" resultMap="classRM">
    SELECT id,class_name,teacher_name,grade_level FROM class
</select>

 

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

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

相关文章

Visual Studio || Visual Studio Code 连接 SQL Server 和 mysql

使用Visua Studio链接本地SQL Server和服务器上的mysql。 软件版本&#xff1a; Visual Studio 2022&#xff1b;Visual Studio Code 2023&#xff1b;SQL Server 2019mysql8.0 一、软件准备二、连接SQL Server2.1 使用Visual Studio 连接SQL Server2.2 使用VS Code连接SQL Ser…

【qemu】将vmdk转换为img镜像教程

qemu软件下载地址&#xff1a; 64位下载地址&#xff1a;QEMU for Windows – Installers (64 bit) 32位下载地址&#xff1a;QEMU for Windows – Installers (32 bit) 找到qemu的目录&#xff0c;然后使用cmd打开&#xff08;qemu软件没有封装exe包&#xff0c;所以只能用…

伺服系统使用S曲线

在之前文章《S形曲线规划方式汇总》 介绍过贝塞尔曲线方式&#xff0c;并且在Marlin开源工程中也有贝塞尔曲线步进系统的实现方式。本篇介绍伺服系统中基于时间分割法实现的贝塞尔S曲线。 1 贝塞尔曲线路程规划 上文中推导过贝塞尔曲线&#xff0c;本文直接用结论&#xff1a…

分享一下如何使用echarts绘制散点图

文章目录 散点图源码地址 散点图 今天我来分享一下如何使用echarts绘制散点图 首先&#xff0c;我们需要引入echarts库。可以通过以下代码在HTML文件中引入&#xff1a; <script src"https://cdn.jsdelivr.net/npm/echarts5.2.0/dist/echarts.min.js"></s…

整合SSM(Spring + SpringMVC + Mybatis)

7、整合SSM 7.1、环境要求7.2、数据库环境7.3、基本环境搭建7.4、Mybatis层编写7.5、Spring层7.6、SpringMVC层7.7、小结及展望 7.1、环境要求 环境&#xff1a; IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#…

FMT ICF5实时仿真,不止于飞控

基于ICF5的实时仿真 作为FMT的首款自研的国产开源飞控硬件平台&#xff0c;ICF5不仅功能强大&#xff0c;而且高颜值和高性价比获得了用户的一致好评。 FMT ICF5飞控 ICF5购买链接​item.taobao.com/item.htm?id705459383848&ali_refida3_430620_1006:1123834906:N:O3mc…

常见的主流自动化测试框架,这5种真的帮助巨大

今天我们要向大家介绍的是常见5种主流自动化测试框架&#xff0c;包括优缺点等内容&#xff0c;供大家参考学习。 1.ATF 自动化测试框架AutoTestFramework是B/S架构框架&#xff0c;可实现Selenium等多种自动化测试全流程、团队化管理的高级框架平台&#xff0c;通过集成自动化…

Zookeeper+消息队列Kafka

一、Zookeeper 概述 官方下载地址&#xff1a;Index of /dist/zookeeper 1.1 Zookeeper 定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1.2 Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设…

PyCharm配置Opencv(多人亲测可用)

23/5/29更新&#xff1a; 之前由于只安装opencv-python-contrib这个包&#xff0c;导致Opencv版本过高&#xff0c;有些算法无法使用&#xff0c; 所以这里更新安装opencv-contrib-python这个包&#xff0c;具体如下配置。 ————————————————————————…

【C++】map和set的使用及其模拟实现

文章目录 一、map和set的使用1. 关联式容器2. 键值对3. 关联式容器的使用3.1 set3.2 multiset3.3 map3.4 multimap 二、map和set的模拟实现1. 红黑树的实现(封装map和set版本)1.1 节点的实现1.2 KeyOfT(仿函数)1.3 红黑树的插入Insert1.4 迭代器iterator 2. set的模拟实现3. ma…

【分布式】分片存储服务器

完成了配置路由服务器之后&#xff0c;我们来到了对存储服务器的重构 在我们加入配置服务器组之后&#xff0c;我们发现我们的kvserver&#xff0c;也就是存储服务器还是单点的&#xff1a; 同样&#xff0c;我们可以借助之前实现的raft对单点进行拓展&#xff0c;我们可以设置…

【LeetCode热题100】打卡第7天:盛最多水的容器

文章目录 盛最多水的容器⛅前言&#x1f512;题目&#x1f511;题解 盛最多水的容器 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合…

自制Arduino 风格开发板 - HK32F030MF4P6 紧凑开发板

模仿Arduino Nano 做一个HK32F030M 的紧凑开发板&#xff0c;排针间距和Arduino Nano 相同&#xff0c;整体尺寸略小&#xff0c;适合插在面包板上。兼容HK32F030MF4P6 和0301M&#xff0c;板载CH340N 串口和DS1307 时钟模块。开源工程地址&#xff1a;HK32F030MF4P6 紧凑开发板…

Python学习36:文本分析与加密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…

测试百科:白盒测试用例的设计

正文 语句覆盖&#xff1a;每条语句至少执行一次。判定覆盖&#xff1a;每个判定的所有可能结果至少出现一次。&#xff08;又称“分支覆盖”&#xff09;条件覆盖&#xff1a;每个条件的所有可能结果至少执行一次。判定/条件覆盖&#xff1a;一个判定中的每个条件的所有可能结…

PyTorch-网络模型的保存和读取

1. 模型的保存 方法一&#xff1a;保存模型的结构模型的参数 陷阱&#xff1a;需要让文件访问到你自己的模型定义方式&#xff0c;可以用import的方式引入先前的模型定义。 model_save.py import torch import torchvisionvgg16 torchvision.models.vgg16(weightsNone) # …

Linux— 网络编程套接字

目录 预备知识 认识端口号 理解源端口号和目的端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 socket 常见API sockaddr结构 sockaddr 结构​编辑 sockaddr_in 结构 in_addr结构 地址转换函数 简单的UDP网络程序 实现一个简单的英译汉的功能 简易的远程…

注解-反射-XML配置原理

java刚开始原本是直接在方法中创建对象执行程序等&#xff0c;部分代码重复率高&#xff0c;后来就发展成方法封装调用&#xff0c;再后来出现的像spring框架等&#xff0c;引入了XML配置&#xff0c;使得程序更加简洁&#xff0c;方便等&#xff0c;其中XML配置也是基于java反…

java 线程安全和多线程

文章目录 前言一、ThreadLocal是什么&#xff1f;二、synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁&#xff0c;二者的主要区别有以下 5 个&#xff1a;三、线程安全的集合类有哪些&#xff1f;四、说一下你对CompletableFuture的理解四、项目中是如何创建线程池…

R语言生物群落(生态)数据统计分析与绘图(从数据整理到分析结果展示)

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…