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

目录
  • 一、使用#定义参数
    • 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. 运行结果

一、使用#定义参数

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
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. 添加测试方法

// 测试根据名字模糊查询
    @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. 运行结果

 #和$的区别:

#表示sql模板的占位符,$表示将字符串拼接到sql模板中。#可以防止sql注入,一般能用#就不用$。${}内部的参数名必须写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模糊查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus 如何判断参数是否为空并作为查询条件

    目录 判断参数是否为空并作为查询条件 只需要在eq条件构造器中只需要添加一句判断即可 StringUtils.isNullOrEmpty()方法作用是 附上isNullOrEmpty()源码 ---[拓展]--- 查询时某些字段为null的问题 判断参数是否为空并作为查询条件 @Override     public Page<DemandEntity> selectByDepartmentDisplay(DemandEntity demandEntity) {         EntityW

  • Mybatis如何通过出入Map参数作为条件进行查询

    目录 通过出入Map参数作为条件进行查询 Mybatis查询传递Map参数 使用场景 传参 持久层 生成sql 查询结果 通过出入Map参数作为条件进行查询 映射文件中查询语句部分: <!--通过map进行条件查询--> <select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">     select * from Products where pro

  • MyBatis动态sql查询及多参数查询方式

    目录 MyBatis动态sql 动态sql处理简单的多参数查询 动态sql处理更新功能 动态sql扩展 动态sql处理集合参数 foreach标签处理数组类型参数 foreach标签处理List类型参数 foreach标签处理Map类型参数 分页功能 基于MySql的分页查询 MyBatis动态sql 动态sql处理简单的多参数查询 常用标签 标签 说明 if 条件判断,与java中的if语句类似 where 为sql语句动态添加where关键字 choose 条件判断,这是一个组合标签,需要与

  • 详解MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路. 原生写法 框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填. JDBC 中实现主键回填其实非常容易,主要是在构造 Prepar

  • Mybatis批量插入并返回主键id的方法

    目录 场景 错误 分析原因 排查问题 场景 在做商城的时候,sku表进行了拆分,sku的基本信息以及sku的库存表.因为库存会经常的变动,会导致行锁. 这里就是新增的时候,因为在新增商品的时候,会有多条sku的数据进行批量的插入,那么有批量插入sku基本信息以及批量插入sku的库存信息. 其中,就需要批量插入sku的基本信息的时候,返回主键id,这就能够在sku批量插入库存信息的时候能够插入skuId: 错误 nested exception is org.apache.ibatis.execu

  • MyBatis+MySQL 返回插入的主键ID的方法

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into us

  • Mybatis insert方法主键回填和自定义操作

    在数据库插入的时候,有很多属性需要我们自己处理,如主键自增字段. MYSQL中主键根据一定规则生成后,需要我们在插入后去主动获取,以便后面的操作,Mybatis为我们提供了处理的方法. 主键回填 keyProperty:指定哪个字段是主键 useGeneratedKeys:这个主键是否使用数据库内置生成策略 我们可以在XML文件中进行如下配置: <insert id="insertUser" parameterType="user" useGeneratedK

  • Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行. <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.3.1</version> </dependency> 1.MySQL <

  • MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="

  • spring boot整合mybatis利用Mysql实现主键UUID的方法

    前言 本文主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现 基础项目的pom.xml部分代码如下 <properties> <java.version>1.8</java.version> </properties> <!-- Inherit defaults from Spring Boot --> <parent&

  • 利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    第一步: 在Mybatis Mapper文件中添加属性"useGeneratedKeys"和"keyProperty",其中keyProperty是Java对象的属性名! <insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id"> insert into spares

  • sql中设置联合主键的具体方法

    复制代码 代码如下: ALTER TABLE 表名字 ADD CONSTRAINT pk_表名字 PRIMARY KEY( SNumber, SDate ); SNumber SDate 必须不能为空字段

  • 解决Mybatis查询方法selectById()主键不一致问题

    Mybatis-plus的通用mapper为我们封装了很多方法,我们只需要将interface集成BaseMapper就可以.在BaseMapper中分装了一个方法=>selectById() selectById 这个方法是根据主键id进行查询记录的.返回一条记录.测试如下, 最终调用的是这个方法userDiamondMapper这个接口集成了BaseMapper. 注意这个表的主键就是uid,查询试试 返回结果不如我们预期,打印出的SQL很奇怪,并没有解析正确.猜测是因为无法正确解析出主键.

随机推荐