前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填

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

作者头像
会洗碗的CV工程师
发布2023-03-26 10:21:20
4420
发布2023-03-26 10:21:20
举报
文章被收录于专栏:LongJava学习资料LongJava学习资料

目录

一、使用#定义参数

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. 持久层接口添加根据名字内容模糊查询方法

代码语言:javascript
复制
// 根据名字内容模糊查询
    List<User> findByNameLike(String username);

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

代码语言:javascript
复制
<!-- 使用#定义参数 -->
    <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

String

string

Byte

byte

Long

long

Short

short

Interger

int / interger

Double

double

Float

float

Boolean

boolean

Date

date

BigDecimal

decimal / bigdecimal

Object

object

Map

map

HashMap

hashmap

List

list

ArrayList

arraylist

Collection

collection

Iterator

iterator

3. 添加测试方法

代码语言:javascript
复制
// 测试根据名字模糊查询
    @Test
    public void testFindByNameLike(){
        String like = "%l%";
        List<User> list = userMapper.findByNameLike(like);

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

4. 运行结果

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

二、使用$定义参数

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

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

代码语言:javascript
复制
<!-- 使用$定义参数 -->
    <select id="findByNameLike" resultType="com.mybatisstudy.pojo.User" parameterType="string">
        select * from user where username like '%${value}%'
    </select>

2. 修改测试方法

代码语言:javascript
复制
// 测试根据名字模糊查询
    @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映射文件更改标签内容

代码语言:javascript
复制
<!-- 使用<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. 持久层接口添加查询所有用户个数方法

代码语言:javascript
复制
// 查询用户总数
    int findCount();

2. UserMapper.xml添加标签

代码语言:javascript
复制
<!-- 聚合查询 -->
    <select id="findCount" resultType="int">
        select count(id) from user
    </select>

3. 添加测试方法

代码语言:javascript
复制
// 测试聚合查询方法
    @Test
    public void testFindCount(){
        System.out.println(userMapper.findCount());
    }

4. 运行结果

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

五、主键回填

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

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

代码语言:javascript
复制
// 主键回填-新增用户
    void add2(User user);

2. UserMapper.xml添加标签

代码语言:javascript
复制
<!-- 主键回填 -->
    <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. 添加测试方法

代码语言:javascript
复制
// 测试主键回填功能
    @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,本篇文章到此为止了,感谢小伙伴的浏览,顺便点击下面投一下票囖,看看您是否有学到了呢 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、使用#定义参数
    • 1. 持久层接口添加根据名字内容模糊查询方法
      • 2. UserMapper.xml映射文件添加标签
        • 3. 添加测试方法
          • 4. 运行结果
          • 二、使用$定义参数
            • 1. UserMapper.xml映射文件更改标签内容
              • 2. 修改测试方法
                • 3. 运行结果
                • 三、使用<bind>标签定义参数
                  • 1. UserMapper.xml映射文件更改标签内容
                    • 2. 运行结果
                    • 四、聚合查询
                      • 1. 持久层接口添加查询所有用户个数方法
                        • 2. UserMapper.xml添加标签
                          • 3. 添加测试方法
                            • 4. 运行结果
                            • 五、主键回填
                              • 1. 持久层接口添加新增用户方法
                                • 2. UserMapper.xml添加标签
                                  • 3. 添加测试方法
                                    • 4. 运行结果
                                    相关产品与服务
                                    数据库
                                    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档