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

2023-09-14 15:22:33

一、模糊查询

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属性中
}

更多推荐

瑞芯微:基于RK3568的ocr识别

光学字符识别(OpticalCharacterRecognition,OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。OCR的应用场景卡片证件识别类:大陆、港澳台身份证、通行证、护照识别,卡类识别,车辆类驾驶证识别、行驶证识别,执照识类识别,企

浅谈GPGPU任务调度-1

文章目录前言1.Stream的概念1.文献1的工作2.Hyper-Q的改进前言转自GPUandComputing公众号在先前的文章中《近距离看GPU计算(2)》我们介绍了GPUSM单元以ThreadBlock为单位的调度方法,这些的Block属于同一个kernel任务,当然处于相同的进程上下文(CUDAContext)

什么是BDD测试(行为驱动开发测试)?

1、什么是BDD测试?BDD(BehaviorDrivenDevelopment)测试,即行为驱动开发测试,是一种基于用户行为和需求的软件测试方法。通过将测试用例编写为自然语言脚本,BDD测试可以促进业务需求、开发和测试团队之间的沟通和协作,从而提高代码的可读性、可维护性和可重复性。BDD测试的优点在于,它能够将开发、

微信小程序与idea后端如何进行数据交互

交互使用的其实就是调用的req.get('url')方法进行路径访问,你要先保证自己的springboot项目已经成功运行了:如下:如何交互的?微信小程序:如下为index.js页面在onLoad()事件中调用方法Project.findAllCities()要在当前js页面中先引入project.js别名Projec

Java——》线程的打断(停止正在运行的线程)

推荐链接:总结——》【Java】总结——》【Mysql】总结——》【Redis】总结——》【Kafka】总结——》【Spring】总结——》【SpringBoot】总结——》【MyBatis、MyBatis-Plus】总结——》【Linux】总结——》【MongoDB】总结——》【Elasticsearch】Java—

Linux下git安装及使用

Linux下Git使用1.git的安装sudoaptinstallgit安装完,使用git--version查看git版本2.配置gitgitconfig--globaluser.name"YourName“##配置用户gitconfig--globaluser.emailemail@example.com##配置邮箱

vuex实现简易购物车加购效果

目录一、加购效果动图二、前提条件三、开始操作四、解决vuex刷新数据丢失问题五、最终效果一、加购效果动图二、前提条件创建了vue项目,安装了vuex三、开始操作目录结构如下:main.js文件中引入store:importVuefrom'vue'importAppfrom'./App.vue'importstorefr

服务器的维护是如何操作

服务器的维护是如何操作服务器可以说是不可或缺的资源,因为现在网络技术发达,我们的生活也都离不开网络的存在,我们想要获取的业务、资料等大多是通过网络进行,所以想要顺应潮流并获得发展,肯定需要服务器来将企业的相关信息与产品等发布到网络中,供客户选择。那应该如何维护好服务器呢?硬件维护1、增加内存和硬盘容量的工作。增加内存是

linux 杂乱汇总

SO_LINGER作用设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。利用此选项,可以将此缺省行为设置为以下两种a.立即关闭该连接,通过发送RST分组(而不是用正常的FIN|ACK|FIN|ACK四个

一文搞懂并查集

一文搞懂并查集1背景意义2原理讲解3路径压缩4代码模板1背景意义首先要知道并查集可以解决什么问题呢?并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。并查集主要有两个功能:将两个元素添加到一个集合中;判断两个元素在不在同一个集合。接下来围绕并查集的这两个功能来展

JWT 安全及案例实战

文章目录一、JWT(jsonwebtoken)安全1.Cookie(放在浏览器)2.Session(放在服务器)3.Token4.JWT(jsonwebtoken)4.1头部4.1.1alg4.1.2typ4.2payload4.3签名4.4通信流程5.防御措施二、漏洞实例(webgoat)1.第四关2.第五关3.第七

热文推荐