Mybatis增删改查(配置文件版)

准备环境

1、数据库表tb_brand

2、实体类Brand

在这里插入图片描述

3、测试用例

3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java
在这里插入图片描述

4、安装MyBatisX插件

添加插件后,因为在Mapper代理开发时,Mapper接口要和Mapper.xml映射文件放在同一个报下,在如下界面中,可以看到接口名前面和每个接口方法名前都会有一个图标,点击便可以跳转到对应的sql映射文件中,点击接口前的图标会跳转到Mapper.xml中的< select >, < delete >, < insert >, < modify >等标签,点击方法对应的图标,便会跳转到Mapper.xml标签里面的sql语句。同样在接口和映射文件中可以互相进行跳转。

如果在接口中加入方法,但是在映射文件中并没有定义一个statement(< select > 等标签),会爆红提示,通过快捷键alt + shift + enter让mybatis帮忙进行创建

在这里插入图片描述

增删改查

1、查询

1、1 查询所有数据

从 XML 中构建 SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

从 SqlSessionFactory 中获取 SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

利用Mapper代理开发来执行sql

BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectAll();
for(Brand brand : brands) {
System.out.println(brand); //这里执行的是查询tb_brand表的所有信息
}

结果如下,但是有个Problem:

在这里插入图片描述

为什么会出现这种情况?

这是因为在数据库建表的时候,tb_brand表中column字段名和在java的pojo包下创建的实体类Brand的property属性差异造成的!

在这里插入图片描述

在这里插入图片描述

在数据库表中字段column定义如上图,再看在java中对应的实体类的属性property

在这里插入图片描述

可以看到,这两个映射不匹配,所以才会造成上述原因,在传表中数据给实体类中时,找不到匹配属性,所以会显示为null

  • 解决方案(有多种,这里介绍常用灵活的resultMap)

    • 在对tb_brand表的sql映射文件中加入resultMap,格式如下:

      <mapper namespace="com.xyy.mapper.BrandMapper">
       <resultMap id = "brandMap" type="Brand">
           <result column="brand_name" property="brandName"></result>
           <result column="company_name" property="companyName"></result>
           <!--因为只有两个property和tb_brand中的column不对应,所以只写了两个,这里对于映射有两个写法,一个是result标签,就是上面这个,这种是针对于非主键的,对于主键的映射需要通过id,因为实体类中的id属性和表中的id字段对应了,就没必要写,但是也可以写出来,如下图-->     
       </resultMap>
       <!-- selectAll方法,查询所有品牌信息 -->
       <select id="selectAll" resultMap="brandMap">
           select * from tb_brand;
       </select>
       <!-- selectById方法,查询品牌信息,参数为id -->
       <select id="selectById" resultMap="brandMap">
           select * from tb_brand where id = #{id};
       </select>
      </mapper>
      

      在这里插入图片描述

      添加了resultMap标签,里面有id和type,id是该resultMap标签的唯一标识,type则是需要字段和属性映射的实体类

      其次,再将select标签中的resultType删掉,换成resultMap=“其唯一标识”。

      官方文档中给出resultType和resultMap不能同时出现

      在这里插入图片描述

      再次运行,结果如下:

      在这里插入图片描述

      对于这些标签的属性,mybatis – MyBatis 3 | XML 映射器 (p2hp.com)给出了非常详细的介绍,可以参阅。

1、2 查看详情

查询所有是将表中所有记录都给查询出来,而查询详情则是将某一条记录拿出来,将所有column字段展示。
在这里插入图片描述

步骤流程

1、编写接口方法:Mapper接口

​ 1、1 参数:id
​ 1、2 结果: Brand

2、编写SQL语句:SQL映射文件

3、执行方法,测试

<select id="selectById"  resultMap="brandMap">
select * from tb_brand where id = #{id};
</select>

参数占位符

​ 1、#{ } :会将其替换成?,为了防止SQL注入

​ 2、${ }:直接拼sql,会存在SQL注入问题

​ 3、使用时机:

​ 3、1 参数传递的时候:#{ }

​ 3、2表名或者列名不固定的情况下:${ } < 动态sql >

参数类型:parameterType:可以省略

特殊字符处理

​ sql语句是写在xml文件中的,当sql条件中包含’ > ’ 时便会报错,因为这个是xml中标签的打头,为了避免这种情况:

​ 1、可以使用转移字符,例如对于<的转义字符是:<

​ 2、<![CDATA[ 特殊字符就写在这里面 ]]> 这样,特殊字符就会被当做普通文本来进行处理。(idea通过敲CD回车即可打出快捷键) <![CDATA[...]]>

​ 1、

/**
 * @param id
 * @return com.xyy.pojo.Brand
 * @description 根据id查询品牌信息
 */

Brand selectById(int id);

以下是采用#{}的传参方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是采用${}的传参方式,可以看到这是采用拼接,会造成安全隐患

在这里插入图片描述

1、3 条件查询

1、3、1 多条件查询

在这里插入图片描述

给出表中数据,后面三个条件查询都是对这个操作

在这里插入图片描述

步骤

1、编写接口方法:Mapper接口

​ 1、1 参数:所有查询条件
​ 1、2 结果: List< Brand>

2、编写SQL语句:SQL映射文件

3、执行方法,测试

多条件就代表会传入多个参数,以下提供了三中参数处理的方式。

以下三种传参方式以后都会有应用场景,将一一介绍:

在这里插入图片描述

​ 1、散装参数

//假定用户输入的三个数据条件
int status = 1;
String companyName = "华为";
String brandName = "华为";
//处理用户输入的三个条件
companyName = "%" + companyName + "%";
brandName = "%" + brandName + "%";

String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
for(Brand brand : brands) {
 System.out.println(brand);
}

在这里插入图片描述

​ 2、对象参数

//这里是对象参数
Brand brand = new Brand();
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setStatus(status);
List<Brand> brands = brandMapper.selectByCondition(brand);

3、map对象

//这里是Map参数
Map map = new HashMap();
map.put("status", status);
//这里的键的名称"status需要sql映射文件中的参数一致
//值的名称需要和接收的参数一致即可。
//因为这里接收的参数和sql参数命名一致,所以没啥区别
map.put("companyName", companyName);
map.put("brandName", brandName);
List<Brand> brands = brandMapper.selectByCondition(map);

总结:

在这里插入图片描述

1、3、1、1 多条件判断引入动态sql

引入:

​ 上面的多条件查询会存在一些bug,用户不一定会每次都将所有条件都会输入,这样sql参数就可能接收到null值,最终结果就会有问题。

​ 对此,引入动态条件查询(动态sql)

引入 < if test = “条件表达式” > sql片段 < /if >

<!--    多条件查询    -->
<select id="selectByCondition" resultMap="brandMap">
    select *
    from tb_brand
    where
        <if test="status != null">
            status = #{status}
        </if>
        <if test="brandName != null and brandName != '' ">
            and brand_name like #{brandName}
        </if>
        <if test="companyName != null and companyName != '' ">
            and company_name like #{companyName};
        </if>
</select>

1、3、1中的多条件查询可以修改成这样,当用户某个条件没输入字符或者输入为’'时就不会拼接该条件

例如:

在这里插入图片描述

在这里可以看到用多个if条件写法可以解决用户部分条件不输入的查询

但是,这个写法会有一些bug,看上面xml代码中,从第二个if标签开始,里面的sql字段都是and开头的,如果第一个if标签没有拼接,则会造成sql语法错误,如下:

在这里插入图片描述

解决方案如下:

1、恒等式 1 == 1 (在每个if标签中的条件都加上 and, 同时在where后加上 1 == 1,后面所有的if标签都一视同仁,都是在 1==1 后面进行一个拼接)

2、Mybatis当然想到了这中情况,所以提供了新的标签< where >, 用< where > 抱歉提到原sql中where,这样就不用担心and问题了,

 <select id="selectByCondition" resultMap="brandMap">
    select *
    from tb_brand
    <where> 
        <if test="status != null">
            and status = #{status}
        </if>
        <if test="brandName != null and brandName != '' ">
            and brand_name like #{brandName}
        </if>
        <if test="companyName != null and companyName != '' ">
            and company_name like #{companyName};
        </if>
    </where>
</select>

在这里插入图片描述

这里需要注意一点,用< where > 代替了where后,每个if标签中的sql语句除第一个可以不用加and,后面的都需要加上and,< where > 识别去除and的功能,没有添加and的功能,不然会造成sql语法错误

在这里插入图片描述

总结:

在这里插入图片描述

1、3、2 单条件查询

针对于如下业务场景,引入但条件查询,就不能像之前多条件查询,一次可以输入多个条件。这种情况下,一次只能输入一个固定的条件,对该条件进行查询。(类似于switch结构,只执行满足条件的case,这里case可以类比于选择的条件)

在这里插入图片描述

引入choose(when, otherwise)

<!--    单条件查询  -->
<select id="selectByConditionSingle" resultMap="brandMap">
    select *
    from tb_brand
    where
    <choose>
        <when test="status != null">
            status = #{status}
        </when>
        <when test="brandName != null and brandName != '' ">
            brand_name like #{brandName}
        </when>
        <when test="companyName != null and companyName != '' ">
            company_name like #{companyName}
        </when>
        <otherwise>
            1 = 1
        </otherwise>
    </choose>
</select>

在这里插入图片描述

这个otherwise可以用之前的< where > 代替where来识别条件个数,如果没有条件拼接,Mybatis就会去掉where,如下:

在这里插入图片描述

[后续将慢慢完善]

2、添加

3、修改

4、删除

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Activiti开启流程实例

开始绘流程图&#xff0c;首先右击鼠标可以看到一下图标&#xff0c;都有相对应的意思 画好一个简易的流程过后&#xff0c;可以看到xml文件中已经有了 右击生成png格式的图片 图片点击后就是一个视图的效果 将流程文件部署 Test public void testDeploy() {//1.创建流程引擎P…

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…

完全离线使用,效率直接拉满

现在越来越多的人使用OCR软件来提高自己的工作效率&#xff0c;今天给大家推荐一款电脑端的文字识别工具&#xff0c;对比以往的软件来说&#xff0c;功能更加丰富全面。 Umi-OCR 美术、舞蹈、音乐 打开软件之后需要安装一下。 软件主要有截图OCR识别、批量OCR识别、批量文档识…

UITableView实现通讯录效果

// // TableViewIndexViewController.m // study2024 // // Created by figo zhu on 2024/12/22. //#import "TableViewIndexViewController.h" //实现协议UITableViewDelegate,UITableViewDataSource interface TableViewIndexViewController ()<UITableView…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…

贪心算法【Lecode_HOT100】

文章目录 1.买卖股票的最佳时机No.1212.跳跃游戏No.553.跳跃游戏IINo.454.划分字母区间No.763 1.买卖股票的最佳时机No.121 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length 0) {return 0;}// 初始化买入价格为最大值&#xff0c;最大…

【PCIe 总线及设备入门学习专栏 4 -- PCIe四种地址空间介绍】

文章目录 Overview1. 配置空间2. IO 空间3. Memory 空间BAR空间示例 -- 32bit内存地址空间请求BAR空间示例 -- 64bit内存地址空间请求 4. message空间 转自&#xff1a;cpu_arch 芯片架构笔记 2024年08月03日 22:32 上海 Overview PCIe架构定义了4种地址空间&#xff1a;配置…

SAP HCM 成本分配涉及的表

导读 成本分配:在HCM模块在SAP模块中&#xff0c;核心就是成分如何与财务无缝衔接&#xff0c;今天介绍的是关于成本中心在HR模块中涉及的几张表&#xff0c;对精细化管理有相应的帮助。涉及的信息类型有0014、0015、0267等 作者&#xff1a;vivi&#xff0c;来源&#xff1a;o…

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…

rk3568之mpp开发笔记怎么实现mpp编码摄像头实时码流?

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是在rk3568上&#xff0c;通过mpp来进行实时对摄像头imx415采集的码流数据进行编码成h264或者h265,后期文章&#xff0c;会开发测试一下通过rtsp推流出去&#xff0c;然后电脑端拉流&#xff0c;看一下整个环路的延迟多…

Keil5 STM32库函数的工程

库函数来间接的操作寄存器 条件编译&#xff0c;如果你定义了USE_STDPERIPH_DRIVER &#xff08;使用标准外设驱动&#xff09;这个字符串&#xff0c;stm32f10x_conf.h才有效

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

Linux快速入门-Linux的常用命令

Linux的常用命令 1. Linux的终端与工作区1.1 终端概述1.2 切换终端 2. Shell语言解释器2.1 Shell概述 3. 用户登录与身份切换3.1 su 命令3.2 sudo 命令 4. 文件、目录操作命令4.1 pwd 命令4.2 cd 命令4.3 ls 命令4.3.1 ls 指令叠加使用 4.4 mkdir 命令4.5 rmdir 命令4.6 cp 命令…

一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测

一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…

机器学习04-为什么Relu函数

机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

STM32之GPIO输出与输出

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…

动手学深度学习-多层感知机-10预测房价

目录 下载和缓存数据集 Kaggle 访问和读取数据集 数据预处理 训练 K折交叉验证 模型选择 提交Kaggle预测 小结 之前几节我们学习了一些训练深度网络的基本工具和网络正则化的技术&#xff08;如权重衰减、暂退法等&#xff09;。 本节我们将通过Kaggle比赛&#xff0c…

左神算法基础巩固--1

文章目录 时间复杂度常数时间的操作时间复杂度的定义时间复杂度的作用剖析递归行为和递归行为时间复杂度的估算 排序选择排序冒泡排序插入排序归并排序小和问题问题描述解题思路 快速排序荷兰国旗问题问题描述 堆排序堆结构大根堆小根堆 桶排序 二分二分搜索 ^的运用不用额外空…