李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
04.MyBatis特殊SQL执行
Leefs
2022-12-07 PM
592℃
0条
[TOC] ### 一、模糊查询 #### 1.1 概述 > 模糊查询使用通配符`%`(可以匹配任意个数字符)或通配符`_`(匹配一个任意字符)将查询信息进行模糊匹配,使用`like`关键字进行匹配查询,通过通配符前置、后置或前后置可以查询与部分信息匹配的数据。 **示例** ```sql +----+--------+ | id | name | +----+--------+ | 1 | JONES | | 2 | SCOTT | | 3 | FORD | +----+--------+ -- 示例一:找出名字中含有O的? select name from emp where name like '%O%'; -- 示例二:找出名字以T结尾的? select name from emp where name like '%T'; -- 示例三:找出名字以K开始的? select name from emp where name like 'K%'; -- 示例四:找出第二个字每是A的? select name from emp where name like '_A%'; ``` **模糊查询的三种方法**: - `'%${查询参数}%'` - 使用`concat`函数进行字符串拼接,`concat('%',#{查询参数},'%')` - `"%"#{查询参数}"%"` #### 1.2 案例 > 需求:查询用户名中包含字符'a'的所有用户信息 + **Mapper接口** ```java /** * 根据用户名模糊查询用户信息 */ List
getUserByLike(@Param("username") String username); ``` + **MyBatis SQL** ```xml
select * from t_user where username like concat('%',#{username},'%')
``` 其他实现方式 ```sql select * from t_user where username like '%${username}%' select * from t_user where username like "%"#{username}"%" ``` + **测试代码** ```java @Test public void testGetUserByLike(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); List
list = mapper.getUserByLike("a"); System.out.println(list); } ``` **运行结果** ``` DEBUG 12-07 10:35:54,439 ==> Preparing: select * from t_user where username like concat('%',?,'%') (BaseJdbcLogger.java:137) DEBUG 12-07 10:35:54,458 ==> Parameters: a(String) (BaseJdbcLogger.java:137) DEBUG 12-07 10:35:54,479 <== Total: 1 (BaseJdbcLogger.java:137) [User{id=1, username='admin', password='123456', age=23, sex='男', email='123@qq.com'}] ``` ### 二、批量删除 #### 2.1 概述 > 在进行批量删除时,使用`where…in`进行条件筛选时,只能使用`${}`进行参数获取,因为使用`#{}`进行参数获取后获取的参数带有单引号`('')`,从而无法删除数据。 **示例** > 目标:删除id为1 2 3的数据,即ids=1,2,3 **方式一** ```sql delete from t_user where id in (${ids}) -- ids带入后变成 delete from t_user where id in (1,2,3) ``` **方式二** ```sql delete from t_user where id in (#{ids}) -- ids带入后变成 delete from t_user where id in ('1,2,3') ``` 方式一id是`1 2 3`;方式二的id是字符串`1,2,3`,因此就会导致删除失败。 **批量删除的正确语法** ```sql delete from t_user where id in (1,2,3) delete from t_user where id in ('1','2','3') ``` #### 2.2 案例 > 需求:批量删除id为3,4,5的用户信息 + **Mapper接口** ```java /** * 批量删除 */ int deleteMore(@Param("ids") String ids); ``` + **MyBatis SQL** ```xml
delete from t_user where id in (${ids})
``` + **测试代码** ```java @Test public void testDeleteMore(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); int result = mapper.deleteMore("3,4,5"); System.out.println(result); } ``` **运行结果** ``` DEBUG 12-07 10:58:20,911 ==> Preparing: delete from t_user where id in (3,4,5) (BaseJdbcLogger.java:137) DEBUG 12-07 10:58:20,932 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-07 10:58:20,994 <== Updates: 3 (BaseJdbcLogger.java:137) 3 ``` > 总结:in只能用`$()`, 因为SQL语句中 `in()` 中 不能有单引号。 ### 三、动态设置表名 #### 3.1 概述 > 动态设置表名是将表名设置为参数进行获取 > > 注意表名作为参数获取只能使用`${}`且不能添加单引号。 > > 不能使用`#{}`的原因是该方法会将表名自动添加单引号。 #### 3.2 案例 > 需求:查询指定表中的数据 + **Mapper接口** ```java /** * 查询指定表中的数据 */ List
getUserByTableName(@Param("tableName") String tableName); ``` + **MyBatis SQL** ```xml
select * from ${tableName}
``` + **测试代码** ```java @Test public void testGetUserByTableName(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); List
list = mapper.getUserByTableName("t_user"); System.out.println(list); } ``` **运行结果** ``` DEBUG 12-07 11:25:33,691 ==> Preparing: select * from t_user (BaseJdbcLogger.java:137) DEBUG 12-07 11:25:33,718 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-07 11:25:33,731 <== Total: 2 (BaseJdbcLogger.java:137) [User{id=1, username='admin', password='123456', age=23, sex='男', email='123@qq.com'}, User{id=2, username='Leefs', password='123', age=22, sex='男', email='123@qq.com'}] ``` 注意:当使用到动态设置表名时要使用`${}`来拼接sql语句,这样sql语句才能正确执行;而使用`#{}`时因为带有引号的原因,sql会报错。 ### 四、添加功能获取自增的主键 #### 4.1 概述 > **功能:获取插入数据自增主键的id,便于后续程序的操作** **在`mapper.xml`中设置两个属性**: - **useGeneratedKeys**:设置使用自增的主键 - **keyProperty**:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中 #### 4.2 案例 > 需求:添加用户信息 + **Mapper接口** ```java /** * 添加用户信息 */ void insertUser(User user); ``` + **MyBatis SQL** ```xml
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
``` + **测试代码** ```java @Test public void testInsertUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); User user = new User(null, "王五", "123", 23, "男", "123@163.com"); mapper.insertUser(user); System.out.println(user); } ``` **运行结果** ``` DEBUG 12-07 11:44:45,813 ==> Preparing: insert into t_user values(null,?,?,?,?,?) (BaseJdbcLogger.java:137) DEBUG 12-07 11:44:45,830 ==> Parameters: 王五(String), 123(String), 23(Integer), 男(String), 123@163.com(String) (BaseJdbcLogger.java:137) DEBUG 12-07 11:44:45,896 <== Updates: 1 (BaseJdbcLogger.java:137) User{id=7, username='王五', password='123', age=23, sex='男', email='123@163.com'} ``` 此处需要注意,添加完成后的User对象中有用户的id,如果单独相获取id返回,直接通过`user.getId()`即可。 *附参考文章链接* *《尚硅谷MyBatis零基础入门教程》*
标签:
MyBatis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2668.html
上一篇
03.MyBatis各种查询功能
下一篇
05.MyBatis自定义映射resultMap
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
FastDFS
BurpSuite
字符串
Flink
ClickHouse
人工智能
数据结构和算法
SpringBoot
Hadoop
Golang基础
数学
高并发
链表
Python
Filter
工具
MyBatis
CentOS
Java阻塞队列
Spark Streaming
Docker
持有对象
MySQL
Scala
JavaWeb
SpringCloudAlibaba
Java工具类
二叉树
Map
并发编程
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞