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