目录
一、动态传参
1、场景描述
2、实现过程
3、代码测试
二、两字段查询
1、场景描述
2、实现过程
3、代码测试
4、注意点
三、用户存在性的判断
1、场景描述
2、实现过程
3、代码测试
在进行数据库查询的时候,需要动态传入参数,例如:表名、列名或者字段值。举个例子:在学生表中查找名字为Tom的用户的数据记录有几条,或者年龄等于23的用户有几个,这时候就需要动态传参。
(1)如果动态传入表名、列名,sql里的属有变量取值都改成${xxxx},而不是#{xxx}
(2)Mpper文件
Student testDym(Map map);
(3)Service层
void testDym();
@Override
public void testDym() {
Map map = new HashMap<>();
map.put("tableName", "t_student");
map.put("colVal", "'" + "Tom" + "'");
map.put("column", "name");
System.out.println(orgMapper.testDym(map));
map.put("column", "name");
map.put("column", "age");
map.put("colVal", "45");
System.out.println(orgMapper.testDym(map));
}
(4)Controller层
@GetMapping("/testDym")
public R testDym(){
orgService.testDym();
return R.ok();
}
说明:数据库中存在name等于Tom的用户,但是不存在age=45的用户,因此结果为null。
在使用MyBatis查询数据库时,有时候对于数据表,仅需要查询两列数据,一列做map的key,一列作为map的value,然后将查询出的结果以map的形式返回。
(1)这里假设要查询姓名和地址,那么就可以将name作为key、address作为value定义一个Map,然后在查询语句中使用即可。
(2)Mapper文件
List
(3)Controller文件
Service层代码就不展示了,和Mapper层一样,这里直接展示Controller层的代码。
@GetMapping("/two")
public R getTwoParam(){
List
关于这里的查询,还有一点需要注意的是,有的人会在Mapper接口中这样写:
这种方式值只适合一条记录的封装,但是不适合多条记录。例如:如果通过select name, address from t_student where age = 25,查询出来的Student只有一条记录,那么这里就是对的,也能得到结果,但是如果有多个Student,就会报错,如下图:
因此,在多条记录的情况下,需要写成在前面使用的那种方式,即:
List
有时候在业务场景中,我们需要进行唯一性判断,例如:用户登录的时候,我们要判断这个用户在用户表中是否存在,所以就不需要写select * from t_user where id = ?。因为这样的话,如果对于一个数据量特别大的数据表,其效率会比较慢,那么应该用什么方式呢?请看下面。
(1)在xml文件中定义sql。
(2)Mapper文件
Integer stuExist(int id);
(3)Controller层
@GetMapping("/isExist/{id}")
public R isExist(@PathVariable Integer id){
Integer val = orgService.stuExist(id);
return R.ok().data("message", val == null ? "用户不存在" : "用户存在");
}