Mybatis应用场景之动态传参、两字段查询、用户存在性的判断

目录

一、动态传参

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();
    @Override
    public 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 ? "用户不存在" : "用户存在");
    }

3、代码测试

猜你喜欢

转载自blog.csdn.net/weixin_47382783/article/details/133973018