[SpringBoot]xml写mapper

news/2024/10/30 15:22:57/

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

 实现步骤:

 

测试:  

<?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="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>
   @Testvoid 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>

    @Testvoid 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>
    @Testvoid 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>
@Testvoid 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.ppmy.cn/news/104104.html

相关文章

HTTPS协议深入理解

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、HTTPS协议的由来及概念 二、加密是什么 三、HTTPS的工作流程 3.1 使用对称密钥 3.2 引入非对称加密 3.3 中间人攻击 3.4 引入证书 一、HTTPS协议的由来及概念 HTTPS 也是…

JSON(一) -- JSON转换工具 -- Jackson的使用

目录 1. Jackson的简介: 2. JSON转换的案例 2.1 对象 => JSON && JSON=> 对象 2.2 Map => JSON && JSON=> Map

Electron-Builder Windows系统代码签名

前言 项目打包签名是两年前做的了&#xff0c;使用Electron-Bulder&#xff0c;打包工具版本迭代较少&#xff0c;倒是electron版本更新飞快&#xff0c;目前官方推荐使用Electron Forge进行打包&#xff0c;后续再对两者进行对比&#xff0c;重新整理现在的实现方案。 签名简…

【MySQL学习6:多行输入函数——聚合函数及SQL书写和执行规则】

之前做的笔记都在有道云&#xff0c;之后会一点点将以前的笔记分享出来~ &#xff08;配图在笔记中查看&#xff09; MySQL学习6&#xff1a;多行输入函数——聚合函数及SQL书写和执行规则 SQL书写顺序&#xff1a;SQL99执行顺序&#xff1a;一、常见的聚合函数1. 常见的聚合函…

【AI面试】降低过拟合的方式方法横评探究

对于一个“训练调参工程师”来说&#xff0c;在训练过程遇到过拟合现象&#xff0c;是常事。当然&#xff0c;如何降低过拟合&#xff0c;也是在面试过程中&#xff0c;经常被面试官问到的问题&#xff08;没啥可问的&#xff0c;就只能这样问了&#xff09;。以下是我们会常考…

Pytorch CIFAR10图像分类 SENet篇

Pytorch CIFAR10图像分类 SENet篇 文章目录 Pytorch CIFAR10图像分类 SENet篇4. 定义网络(SENet)SE BlockSE模块的应用summary查看网络测试和定义网络5. 定义损失函数和优化器6. 训练及可视化(增加TensorBoard可视化)开始训练训练曲线可视化损失函数曲线准确率曲线学习率曲…

IOC源码解析

目录 主要从3方面进行解析 Bean与BeanDefinition 容器初始化主要做的事情(主要脉络) BeanFactory ApplicationContext 模板方法模式 Resource、ResourceLoader、容器之间的关系 BeanDefinitionReader BeanDefinition的注册 小结 主要从3方面进行解析 解析配置定位与注…

深度学习12—VGG19实现

目录 VGG19实现 1.为数据打标签的generate_txt.py 2.对图像进行预处理的data_process.py 3.VGG19的网络构建代码net_VGG19.py 4.训练得到pth模型参数文件的get_pth_file.py 5.预测代码predict.py 6.预测VGG16与VGG19结果对比 VGG19实现 1.为数据打标签的generate_txt.p…