MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

2023-11-05

一、模糊查询

1.1  like '%${xxx}%' 的方式模糊查询

/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 */
List<User> getUserByLike(@Param("username") String username);
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
	select * from t_user where username like '%${username}%'
</select>

like '%${xxx}%' 本质上是字符串的拼接,在数据库中单引号表示字符串。此处不能使用#{xxx},#{xxx}的本质是占位符赋值,'%#{xxx}%'会被数据库解析为'%?%',即会去查找字段中是否包含?.

1.2  like concat('%',#{xxx},'%') 的方式模糊查询

/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 */
List<User> getUserByLike(@Param("username") String username);
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
	select * from t_user where username like concat('%',#{username},'%')
</select>

#{}的本质就是占位符赋值,再使用concat()函数进行拼接。

1.3  "%"#{xxx}"%" 的方式模糊查询(推荐使用)

/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 */
List<User> getUserByLike(@Param("username") String username);
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
	select * from t_user where username like "%"#{username}"%"
</select>

在数据库中,可以使用双引号进行字符串的拼接,如上:"%"#{username}"%"

  • 其中select * from t_user where username like "%"#{xxx}"%"是最常用的

二、批量删除

只能使用${},如果使用#{},则解析后的sql语句为delete from t_user where id in ('1,2,3'),这样是将1,2,3看做是一个整体,只有id为1,2,3的数据会被删除。正确的语句应该是delete from t_user where id in (1,2,3),或者delete from t_user where id in ('1','2','3')
其中#{xxx}会被解析成 'xxx'.

/**
 * 根据id批量删除
 * @param ids 
 * @return int
 */
int deleteMore(@Param("ids") String ids);
<delete id="deleteMore">
	delete from t_user where id in (${ids})
</delete>
//测试类
@Test
public void deleteMore() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
	SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
	int result = mapper.deleteMore("1,2,3");
	System.out.println(result);
}

三、动态设置表名

  • 只能使用${},因为表名不能加单引号

其中#{xxx}会被解析成 'xxx'.

/**
 * 查询指定表中的数据
 * @param tableName 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 */
List<User> getUserByTable(@Param("tableName") String tableName);
<!--List<User> getUserByTable(@Param("tableName") String tableName);-->
<select id="getUserByTable" resultType="User">
	select * from ${tableName}
</select>

四、添加功能获取自增的主键

使用场景
t_clazz(clazz_id,clazz_name)
t_student(student_id,student_name,clazz_id)
1.添加班级信息
2.获取新添加的班级的id
3.为班级分配学生,即将某学的班级id修改为新添加的班级的id
在mapper.xml中设置两个属性
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
 

/**
 * 添加用户信息
 * @param user 
 */
void insertUser(User user);
<!--void insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
	insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
</insert>
//测试类
@Test
public void insertUser() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
	SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
	User user = new User(null, "ton", "123", 23, "男", "123@321.com");
	mapper.insertUser(user);
	System.out.println(user);
	//输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},自增主键存放到了user的id属性中
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键) 的相关文章

  • Android 上的 setTimeOut() 相当于什么?

    我需要等效的代码setTimeOut call function milliseconds 对于安卓 setTimeOut call function milliseconds 您可能想查看定时任务 http developer andro
  • 如何从 .t​​xt 文件读取数据并将数据放入对象的数组列表中?

    到目前为止 我所写的内容是基于我目前对基本数组的了解 但我只是不明白如何使用数组列表 或如何从文件中读取 到目前为止我所写的内容有效 任何有助于修复我的代码以从文件中读取并使用数组列表的链接或建议将不胜感激 谢谢 public class
  • 在 Jenkins 内运行构建时,我收到“java/lang/OutOfMemoryError”

    2020 02 25 10 11 24 986 0000 id 79 信息hudson model AsyncPeriodicWork lambda doRun 0 开始maven repo cleanup 2020 02 25 10 11
  • 检查行中是否有单调递增的值

    我正在寻找一种方法来检查表中的值是否针对特定的行子集单调递增 该表包含列 id name meas date 和 value 对于具有相同名称的所有行 应按 meas date 对行进行排序 并且需要检查这些排序行的值列是否单调递增 因此
  • 使用SQL显示组内最小计数和最大计数

    Goal 我正在寻找一种方法来计算等于组的最小值或最大值的项目数 我的物品每隔几天就会收到一次 并且每两周输入一次 我需要查看每个 EntryDate 的最小和最大接收日期 以及最小和最大的项目计数 在 MS Access 中使用 SQL
  • 实体框架与oracle数据库的连接

    我使用的是 Entity Framework 6 1 版本和 oracle 11 我是实体框架的新手 任何人都可以建议连接 oracle 的先决条件是什么 任何更改都需要在 web config 中进行 在web config中 默认它是与
  • WSDL 表示中的枚举类型

    WSDL 表示如下
  • sql自连接表删除重复行

    我有下表 USERID LANGUAGEID 1 2 1 7 1 8 2 10 2 3 现在我想为每个用户创建所有可能的语言对 这意味着我希望结果集是 对于用户 1 2 7 7 8 2 8 对于用户 2 10 3 为此 我做了以下查询 SE
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • 更改 MySQL 中的列名称 [重复]

    这个问题在这里已经有答案了 搜索后我不知道我需要在 ALTER TABLE 中做什么genres更改列id to genre id有任何想法吗 alter table genres change id genre id int 10 aut
  • 如何将我的自定义相机应用程序设置为默认应用程序?

    如果我使用以下代码 Intent takePictureIntent new Intent MediaStore ACTION IMAGE CAPTURE startActivityForResult takePictureIntent 1
  • Android:如何以编程方式仅圆化位图的顶角?

    我目前正在使用这段代码 Override public Bitmap transform Bitmap source Bitmap result Bitmap createBitmap source getWidth source getH
  • 存储过程和视图有什么区别?

    我对以下几点感到困惑 存储过程和视图有什么区别 在 SQL Server 中 什么时候应该使用存储过程 什么时候应该使用视图 视图是否允许创建可以传递参数的动态查询 哪一个最快 基于什么原因其中一个比另一个更快 视图或存储过程是否永久分配内
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • 用于将字符串与通配符模式进行匹配的递归函数

    所以我一整天都在试图解决这个作业 只是无法完成 以下函数接受 2 个字符串 第二个 不是第一个 可能包含 的 星号 An 是字符串的替换 空 1个字符或更多 它可以出现 仅在s2中 一次 两次 更多或根本不出现 它不能与另一个相邻 ab c
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 1° 夏令时 Java 和 JS 表现出不同的行为

    假设巴西利亚 GMT 0300 夏令时于 21 10 2012 00 00 00 此时时钟应提前一小时 Java new Date 2012 1900 9 21 0 0 0 Sun Oct 21 01 00 00 BRST 2012 Chr
  • SQL 中 NOT 和 != 运算符有什么区别?

    有什么区别NOT and SQL 中的运算符 我无法理解其中的区别 我猜他们是一样的 NOT negates以下条件 因此它可以与各种运算符一起使用 is the 非标准替代品 https stackoverflow com a 10650
  • Spring JMS开始根据请求监听jms队列

    Spring提供 JMSListener用于监听来自特定队列的消息的注释 还有一个替代方案实施JmsListenerConfigurer http docs spring io spring docs current spring fram

随机推荐

  • 初学者pandas安装三天,遇到的各种错误给大家分享一下

    第一步 直接安装报了超时错误 直接用pip install pandas 大概率会出现超时错误 第二步 采用国内镜像服务器安装pip3 install i https pypi tuna tsinghua edu cn simple pan
  • 键盘录入、顺序结构、选择结构(if、switch)

    键盘录入 为了让程序数据更符合开发的数据 更加灵活一些 使用键盘录入数据 键盘录入格式 package com briup day5 包 import java util Scanner 导包 用于键盘录入 public class A p
  • mysql多字段排序

    数据库可以对多个字段进行排序 优先级顺序按照书写顺序 说明 对于多字段排序是这个样子的 初始数据如下 观察c1字段中相同的数据 观察上图 对于单一字段来说 可以进行排序 如下图 再增加一个字段c2 进行多字段排序 c1为升序 c2为降序 由
  • 抖音作品想要上热门得有条件和前提

    眼下 短视频正处于风口浪尖 无论是企业知名度曝光 品牌推广 亦或是产品变现 效果都十分令人眼红 想要跟上时代的发展 短视频这块大蛋糕 很有必要为自己分出一块 以时下很火的短视频平台 抖音为例 时至今日已上线4年 人人都知道玩转这个平台 发视
  • QT qDebug打印

    QT 命令行窗口16进制显示 QString Str qDebug lt lt Str sprintf result d 0x 02x n j tmp qDebug 16进制显示可以使用0x 02x
  • PyCharm中无法调包,报错ModuleNotFoundError: No module named ‘numpy‘

    PyCharm中无法调用numpy 报错ModuleNotFoundError No module named numpy 之后将解释器修改为 重新运行 成功
  • 超级黑科技代码!Python打造电脑人脸屏幕解锁神器附带接头暗号

    前言 让我的电脑认识我 我的电脑只有认识我 才配称之为我的电脑 今天 我们用Python实现高大上的人脸识别技术 Python里 简单的人脸识别有很多种方法可以实现 依赖于python胶水语言的特性 我们通过调用包可以快速准确的达成这一目的
  • Docker学习(四)——docker portainer可视化面板

    Docker学习 四 docker portainer可视化面板 1 什么是portainer 2 下载镜像 可省略 3 运行portainer容器 4 根据映射的主机端口 通过localhost 9000进行访问 4 1 设置密码 4 2
  • Kettle的下载安装教程和使用简介(内含第一个kettle转换案例)

    本文首先介绍Kettle工具的安装及基本概念 然后通过一个案例实操介绍Kettle工具的使用 本文重要的内容如下 Kettle的安装 1 Java的安装 登录Java的官网后 进入到下载页面 http www oracle com tech
  • 设置JVM选项-ElasticSearch

    设置JVM的方法 在ElasticSearch中设置JVM选项有两种方法 一种是通过jvm options 另一种是通过环境变量ES JAVA OPTS jvm options jvm options是优选选择的方法 通过tar或者zip安
  • 函数式和面向对象编程有什么区别?

    函数式编程 Functional Programming 和 面向对象编程 Object Oriented Programming 是两个主流的编程范式 他们有各自独特的闪光点 比如函数式编程的数据不可变 惰性求值 面向对象编程的继承 多态
  • python 数据类型及转换

    常见的数据类型 使用 type 内置类可以查看变量所对应的类型 int 整数 十进制 二进制 使用0b开始表示 八进制 使用 0o 开始 十六进制 使用 0x 开始 float 浮点数 complex 复数 str 字符串 就是一段普通的文
  • 竞赛题-6258. 数组中最长的方波

    题目 给你一个整数数组 nums 如果 nums 的子序列满足下述条件 则认为该子序列是一个 方波 子序列的长度至少为 2 并且 将子序列从小到大排序 之后 除第一个元素外 每个元素都是前一个元素的 平方 返回 nums 中 最长方波 的长
  • gcc -Wall详解

    当GCC在编译过程中检查出错误的话 它就会中止编译 但检测到警告时却能继续编译生成可执行程序 因为警告只是针对程序结构的诊断信息 它不能说明程序一定有错误 而是存在风险 或者可能存在错误 虽然GCC提供了非常丰富的警告 但前提是你已经启用了
  • j2ee_XML建模

    1 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 ConfigModel ActionModel ForwardModel 2 利用d
  • ifconfig、ip addr、ip route用法总结

    最近使用haproxy keepalived 负载均衡 发现虚拟IP有问题 配置文件里配的VIP是 4 143 但是执行 ip a 发现还有一个虚拟IP 4 134 应该是以前配置文件keepalived conf里设置过VIP 4 134
  • 做大模型时代的应用层创业!

    Datawhale创业 方向 大模型 合作伙伴 Datawhale 亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generat
  • python写路径时候的问题————转载ningqingzy的文章

    作为笔记总结学习 如有侵权 立马删除 总结有三种方法 更换为绝对路径的写法 func1 C Users renyc 显式声明字符串不用转义 加r func1 r C Users renyc 使用Linux的路径 func1 C Users
  • 数仓 - hive ,身份证和手机号 匹配 - 正则方式

    数仓 hive 身份证和手机号 匹配 正则方式 身份证 内容校验 身份证号字段 regexp 1 9 0 9 14 1 9 0 9 16 0 9xX 长度校验 and length trim 身份证号字段 15 or length trim
  • MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

    一 模糊查询 1 1 like xxx 的方式模糊查询 根据用户名进行模糊查询 param username return java util List