李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
04.MyBatis特殊SQL执行
Leefs
2022-12-07 PM
1251℃
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
47
NLP
4
标签云
Sentinel
Docker
容器深入研究
Spring
Hbase
Linux
散列
SQL练习题
Azkaban
JavaSE
Git
队列
RSA加解密
Java
Filter
DataX
Hadoop
DataWarehouse
NIO
Quartz
栈
查找
Redis
Spark SQL
二叉树
锁
Elastisearch
Python
gorm
Elasticsearch
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭