Mybatis模糊查询——三种定义参数方法和聚合查询主键回填

Posted 会洗碗的CV工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis模糊查询——三种定义参数方法和聚合查询主键回填相关的知识,希望对你有一定的参考价值。

目录

一、使用#定义参数

1. 持久层接口添加根据名字内容模糊查询方法

2. UserMapper.xml映射文件添加标签

3. 添加测试方法

4. 运行结果

二、使用$定义参数

1. UserMapper.xml映射文件更改标签内容

2. 修改测试方法

3. 运行结果

三、使用标签定义参数

1. UserMapper.xml映射文件更改标签内容

2. 运行结果

四、聚合查询

1. 持久层接口添加查询所有用户个数方法

2. UserMapper.xml添加标签

3. 添加测试方法

4. 运行结果

五、主键回填

1. 持久层接口添加新增用户方法

2. UserMapper.xml添加标签

3. 添加测试方法

4. 运行结果


一、使用#定义参数

1. 持久层接口添加根据名字内容模糊查询方法

// 根据名字内容模糊查询
    List<User> findByNameLike(String username);

2. UserMapper.xml映射文件添加标签

<!-- 使用#定义参数 -->
    <select id="findByNameLike" parameterType="string"             
    resultType="com.mybatisstudy.pojo.User">
        select * from user where username like #name
    </select>

        我们看到在映射文件中,parameterType的值为 string 而没有写java.lang.String ,这是为什么呢?参数/返回值类型为基本数据类型/包装类/String等类型时,我们可以写全类名,也可以写别名。

        下表就是一些数据类型对应的别名

数据类型

别名
byte_byte
long_long
short_short
int_int
int_integer
double_double
float_float
boolean_boolean
Stringstring
Bytebyte
Longlong
Shortshort
Intergerint / interger
Doubledouble
Floatfloat
Booleanboolean
Datedate
BigDecimaldecimal / bigdecimal
Objectobject
Mapmap
HashMaphashmap
Listlist
ArrayListarraylist
Collectioncollection
Iteratoriterator

3. 添加测试方法

// 测试根据名字模糊查询
    @Test
    public void testFindByNameLike()
        String like = "%l%";
        List<User> list = userMapper.findByNameLike(like);

        list.forEach(System.out::println);
    

4. 运行结果

OK,这里是成功查询出来了,并且控制台打印日志也和我们的参数一致 

二、使用$定义参数

模糊查询如果不想在调用方法时参数加%,可以使用拼接参数的方式设置Sql:

1. UserMapper.xml映射文件更改标签内容

<!-- 使用$定义参数 -->
    <select id="findByNameLike" resultType="com.mybatisstudy.pojo.User" parameterType="string">
        select * from user where username like '%$value%'
    </select>

2. 修改测试方法

// 测试根据名字模糊查询
    @Test
    public void testFindByNameLike()
        String like = "l";
        List<User> list = userMapper.findByNameLike(like);

        list.forEach(System.out::println);
    

3. 运行结果

 #和$的区别:

  1. #表示sql模板的占位符,$表示将字符串拼接到sql模板中。
  2. #可以防止sql注入,一般能用#就不用$。
  3. $内部的参数名必须写value。

三、使用<bind>标签定义参数

如果使用 # 还不想在调用方法的参数中添加 % ,可以使用 <bind> , <bind> 允许我们在 Sql语句以外创建一个变量,并可以将其绑定到当前的Sql语句中。用法如下:

1. UserMapper.xml映射文件更改标签内容

<!-- 使用<bind>标签定义参数 -->
    <select id="findByNameLike" parameterType="String" resultType="com.mybatisstudy.pojo.User">
        <bind name="likeName" value="'%' + username + '%'"/>
        select * from user where username like #likeName
    </select>

2. 运行结果

四、聚合查询

1. 持久层接口添加查询所有用户个数方法

// 查询用户总数
    int findCount();

2. UserMapper.xml添加标签

<!-- 聚合查询 -->
    <select id="findCount" resultType="int">
        select count(id) from user
    </select>

3. 添加测试方法

// 测试聚合查询方法
    @Test
    public void testFindCount()
        System.out.println(userMapper.findCount());
    

4. 运行结果

  

还是比较可靠的,确实查询出来了用户总数 

五、主键回填

        有时我们需要获取新插入数据的主键值。如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。

1. 持久层接口添加新增用户方法

// 主键回填-新增用户
    void add2(User user);

2. UserMapper.xml添加标签

<!-- 主键回填 -->
    <insert id="add2" parameterType="com.mybatisstudy.pojo.User">
        <!-- keyProperty:主键属性名,keyColumn:主键列名,resultType:主键类型,order:执行时机 -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,sex,address)
        values (#username,#sex,#address)
    </insert>

        SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行。

3. 添加测试方法

// 测试主键回填功能
    @Test
    public void testAdd2()
        User user = new User("Lions","man","Beijing");
        userMapper.add2(user);

        session.commit();
        System.out.println(user.getId());
    

4. 运行结果

        好,控制台是成功显示添加了,用户id为11,那我们看看表里面是否成功添加了 

        确实是成功添加了,ok,本篇文章到此为止了,感谢小伙伴的浏览,顺便点击下面投一下票囖,看看您是否有学到了呢 

以上是关于Mybatis模糊查询——三种定义参数方法和聚合查询主键回填的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis模糊查询MySQL中记录的的常用三种方法

mybatis 模糊查询 like的三种方式

mybatis三种缓存

mybatis参数date怎么模糊查询

用mybatis进行模糊查询总是查不到结果!

Mybatis中模糊查询Mysql的方法