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


    目录

    一、动态传参

    1、场景描述

    2、实现过程

     3、代码测试

    二、两字段查询

    1、场景描述

    2、实现过程

    3、代码测试

    4、注意点

    三、用户存在性的判断

    1、场景描述

    2、实现过程

    3、代码测试


    一、动态传参

    1、场景描述

            在进行数据库查询的时候,需要动态传入参数,例如:表名、列名或者字段值。举个例子:在学生表中查找名字为Tom的用户的数据记录有几条,或者年龄等于23的用户有几个,这时候就需要动态传参。

    2、实现过程

    (1)如果动态传入表名、列名,sql里的属有变量取值都改成${xxxx},而不是#{xxx}

    1. <select id="testDym" parameterType="String" resultType="com.example.mplearning.entity.Student">
    2. select * from ${tableName} where ${column} = ${colVal}
    3. select>

    (2)Mpper文件

    Student testDym(Map map);

    (3)Service层

    void testDym();
    1. @Override
    2. public void testDym() {
    3. Map map = new HashMap<>();
    4. map.put("tableName", "t_student");
    5. map.put("colVal", "'" + "Tom" + "'");
    6. map.put("column", "name");
    7. System.out.println(orgMapper.testDym(map));
    8. map.put("column", "name");
    9. map.put("column", "age");
    10. map.put("colVal", "45");
    11. System.out.println(orgMapper.testDym(map));
    12. }

    (4)Controller层

    1. @GetMapping("/testDym")
    2. public R testDym(){
    3. orgService.testDym();
    4. return R.ok();
    5. }

     3、代码测试

            说明:数据库中存在name等于Tom的用户,但是不存在age=45的用户,因此结果为null。 

    二、两字段查询

    1、场景描述

            在使用MyBatis查询数据库时,有时候对于数据表,仅需要查询两列数据,一列做map的key,一列作为map的value,然后将查询出的结果以map的形式返回。

    2、实现过程

    (1)这里假设要查询姓名和地址,那么就可以将name作为key、address作为value定义一个Map,然后在查询语句中使用即可。

    1. <resultMap id="stuMap" type="HashMap">
    2. <result property="key" column="name" javaType="java.lang.String"/>
    3. <result property="value" column="address" javaType="java.lang.String" />
    4. resultMap>
    5. <select id="selectTwoParam" resultMap="stuMap">
    6. select name, address from t_person;
    7. select>

    (2)Mapper文件

    List> selectTwoParam();

    (3)Controller文件

            Service层代码就不展示了,和Mapper层一样,这里直接展示Controller层的代码。

    1. @GetMapping("/two")
    2. public R getTwoParam(){
    3. List> list = orgService.selectTwoParam();
    4. return R.ok().data( "data",list);
    5. }

    3、代码测试

    4、注意点

            关于这里的查询,还有一点需要注意的是,有的人会在Mapper接口中这样写:

            这种方式值只适合一条记录的封装,但是不适合多条记录。例如:如果通过select name, address from t_student where age = 25,查询出来的Student只有一条记录,那么这里就是对的,也能得到结果,但是如果有多个Student,就会报错,如下图:

            因此,在多条记录的情况下,需要写成在前面使用的那种方式,即:

    List> selectTwoParam();

    三、用户存在性的判断

    1、场景描述

            有时候在业务场景中,我们需要进行唯一性判断,例如:用户登录的时候,我们要判断这个用户在用户表中是否存在,所以就不需要写select * from t_user where id = ?。因为这样的话,如果对于一个数据量特别大的数据表,其效率会比较慢,那么应该用什么方式呢?请看下面。

    2、实现过程

    (1)在xml文件中定义sql。

    1. <select id="stuExist" parameterType="int" resultType="Integer">
    2. select 1 from t_student where id = #{id}
    3. select>

    这里还有另外一种写法,可以试试:

    1. <select id="findName" resultType="int" parameterType="String" >
    2. select IFNULL(sum(id),0) from user where name=#{name}
    3. select>

    (2)Mapper文件

        Integer stuExist(int id);

    (3)Controller层

    1. @GetMapping("/isExist/{id}")
    2. public R isExist(@PathVariable Integer id){
    3. Integer val = orgService.stuExist(id);
    4. return R.ok().data("message", val == null ? "用户不存在" : "用户存在");
    5. }

    3、代码测试

  • 相关阅读:
    直接插入排序与希尔排序的详解及对比
    基于ASP.NET大学生校园招聘网站的设计与开发
    QoS(服务质量)学习记录
    STM32点灯大师(点了一颗LED灯,轮询法)
    JS算法与树(二)
    机器学习算法:支持向量机(SVM)
    深入理解Ansible:简化服务器管理和自动化任务的利器
    中国高产水稻促粮食增产 国稻种芯:为碳减排做出重要贡献
    Web APIs简介 Dom
    c++基础:指针
  • 原文地址:https://blog.csdn.net/weixin_47382783/article/details/133973018