mybatis-plus 自定义SQL,XML形式,传参的几种方式

前提说明

在使用 mybatis-plus 进行操作数据库,有一部分比较复杂的操作需要写SQL语句,这样就会涉及到传参数。下面记载一下我遇到的几种传参数情况。如果有更好的可以留言,继续完善。

所涉及文件

自定义SQL涉及到两种类型的文件:###Mapper.java###Mapper.xml 。这两种文件都是mybatis-plus自动生成的。
例如下面的例子:

  1. TGrouponMapper.java文件的内容
public interface TGrouponMapper extends BaseMapper<TGroupon> {
    /**
     * @description: 获取用户参加的团购信息
     * @author: haojg
     * @date: 2020/6/18 19:48
     * @return:
     */
    IPage<TGroupon> selectUserJoinGroupon(Page<?> page, @Param("userId") Long userId);
}

  1. TGrouponMapper.xml文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hddata.xpt.db.mapper.TGrouponMapper">
    <select id="selectUserJoinGroupon"  resultType="TGroupon">
        SELECT g.*, ref.join_status, ref.join_name, ref.join_phone, ref.user_id as join_user_id
        FROM t_groupon g, t_groupon_user_ref ref
        WHERE g.id = ref.groupon_id
        AND g.is_delete != 1
        AND ref.user_id = #{userId}
        ORDER BY g.create_time desc
    </select>
</mapper>

传参类型说明

1.Java代码中使用QueryWrapper动态拼装SQL

Java代码中使用QueryWrapper动态拼装SQL后,最后在马Mapper.xml文件中使用。这种情况适用于where条件比较复杂,分支比较多的情况,更多情况自己品味吧。直接上代码如下:

  1. Mapper.java文件内容:
public interface TIdentityDocumentInfoMapper extends BaseMapper<TIdentityDocumentInfo> {
    /**
     * @Description: 根据身份证和医院患者Id获取系统患者Id等信息
     * @Author: Haojg on 2019/8/7 23:37
     * @return:
     */
    List<TIdentityDocumentInfo> getPatientByIdAndPat(@Param(Constants.WRAPPER) QueryWrapper<TIdentityDocumentInfo> wrapper);

}
  1. Mapper.xml文件内容: ew.sqlSegment 是固定的写法,请注意。

    <select id="getPatientByIdAndPat"  resultType="TIdentityDocumentInfo">
        SELECT t1.*, t3.*
        FROM t_medical_card_info t1, t_identity_document_info t3
          WHERE t1.identity_document_id = t3.identity_document_id
          AND ${ew.sqlSegment}
    </select>

  1. 调用接口方法:
    这里通过Java直接拼接where语句。

        QueryWrapper<TIdentityDocumentInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("t3.id", IdCard);
        queryWrapper.eq("t1.hospital_id", hosId);
        List<TIdentityDocumentInfo> queryList = tIdentityDocumentInfoMapper.getPatientByIdAndPat(queryWrapper);

2.简单类型参数(如String,Long,Integer等),适用于固定且确定的参数

这种情况直接上代码。

  1. Mapper.java文件内容,通过 @Param 进行参数设置。
IPage<TGroupon> selectUserJoinGroupon(Page<?> page, @Param("userId") Long userId);
  1. Mapper.xml文件内容:直接使用参数 userId
<select id="selectUserJoinGroupon"  resultType="TGroupon">
        SELECT g.*, ref.join_status, ref.join_name, ref.join_phone, ref.user_id as join_user_id
        FROM t_groupon g, t_groupon_user_ref ref
        WHERE g.id = ref.groupon_id
        AND g.is_delete != 1
        AND ref.join_status != 0
        AND ref.user_id = #{userId}
        ORDER BY g.create_time desc
    </select>

3.参数传入类型为Class类,或mybatis-plus生成的 entity类

  1. Mapper.java文件内容: **HoRefunds ** 是数据库中表映射成的entity类
    int updateRefundOk(@Param("subTable") String subTable, @Param("hoRefunds") HoRefunds hoRefunds);
  1. Mapper.xml文件内容中, 如下面的代码中: hoRefunds.refundResponse , hoRefunds 是 entity类, refundResponse 是字段名称。
    <update id="updateRefundOk">
      update ho_refunds_${subTable} set
        refund_request = #{hoRefunds.refundRequest},
        refund_response = #{hoRefunds.refundResponse},
        err_code = #{hoRefunds.errCode},
        err_code_des = #{hoRefunds.errCodeDes}
      where id = #{hoRefunds.id}
    </update>

4.参数传入类型为Map类型的数据

当entity类不满足情况的时候,可以使用Map类型的数据,具体例子如下。

  1. Mapper.java文件内容: paramsMap 为Map类型
public int getPushHistoryIsExsit(Map<String, Object> paramsMap);
  1. Mapper.xml文件内容中,
    01,标明传入参数的类型 ** parameterType=“java.util.Map” **
    02,直接使用传入参数中的Key, 如:step , cardId, notifyType
    <select id="getPushHistoryIsExsit" parameterType="java.util.Map" resultType="int">
        select count(t1.id) from hcustom_his_push t1
        inner join hcustom_notify_config t2
        on t1.notify_config_id = t2.id
        and t2.notify_steps = #{step} and t2.notify_type = #{notifyType} and t1.medical_card_id = #{cardId}
    </select>

  1. 调用实例
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("cardId", cardId);
        paramsMap.put("step", step);
        paramsMap.put("notifyType", notifyType);
		int pushCount = hcustomHisPushMapper.getPushHistoryIsExsit(paramsMap);

我目前就使用了这么多,如果大家还有更多用法,欢迎交流!!!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Mybatis-plus提供了多种自定义SQL方式,以下是其中几种常用的方式: 1. 使用@Select注解或者Mapper.xml文件中的<select>标签编写自定义SQL语句。 2. 使用@Update、@Insert、@Delete注解或者Mapper.xml文件中的<update>、<insert>、<delete>标签编写自定义SQL语句。 3. 使用Wrapper对象构建查询条件,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 4. 使用SqlHelper类提供的方法构建SQL语句,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 5. 使用自定义SQL解析器,将自定义SQL语句解析成Mybatis-plus可识别的SQL语句,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 以上是常用的几种自定义SQL方式,具体使用哪种方式取决于具体的业务需求和个人习惯。 ### 回答2: Mybatis-plus 是一个基于 Mybatis 的增强工具,它提供了一系列解决方案,使得 Mybatis 的使用变得更加简单和高效。其中,自定义 SQLMybatis-plus 的一个重要特性,它提供了一种自由扩展 SQL方式,使得开发者可以通过自己的实现来满足各种灵活的需求。 要使用自定义 SQL,首先需要在 Mapper 接口中定义方法,并用 @Select 注解标注该方法。在注解中,我们可以书写 SQL 语句,如: ``` @Select("select * from user where name = #{name}") User findUserByName(@Param("name") String name); ``` 这里的 @Select 注解告诉了 Mybatis-plus,这是一个查询方法,所使用的 SQL 是 select * from user where name = #{name}。其中,#{name} 是一个占位符,Mybatis-plus 会自动将方法参数中的 name 值替换到该占位符中。 除了 @Select,Mybatis-plus 还提供了一些其他的注解,如 @Insert、@Update、@Delete 等,它们分别表示插入、更新、删除操作。类似于 @Select,这些注解也可以用自定义 SQL,声明方式都类似。 在定义完自定义 SQL 方法之后,我们就可以在业务方法中调用这些方法来实现对数据库的操作了,如: ``` User user = userMapper.findUserByName("Tom"); ``` 最后需要注意的是,虽然自定义 SQL 可以满足我们的各种需求,但是它们本身也存在一些缺点。比如它们可能会使代码可读性变低,也会存在 SQL 注入等安全问题。因此,在使用自定义 SQL 的时候,需要谨慎考虑,遵循安全和可读性原则来编写。 ### 回答3: MyBatis-Plus 是一个基于 MyBatis 的增强工具,在其基础上,提供了更加强大和便捷的操作。在使用 MyBatis-Plus 进行数据库操作时,很多情况下需要编写自定义SQL 语句来满足特定的需求,因此,学习如何自定义 SQL 语句是非常必要的。 MyBatis-Plus 支持多种方式自定义 SQL,以下分别介绍: 1. @Select 注解 @Select 注解可以在方法上加入 SQL 语句,执行时会使用该 SQL 语句进行查询。例如: @Select("select * from user where id = #{id}") User selectById(Long id); 2. XML 映射文件 在 MyBatis-Plus 配置文件中,可以配置 XML 映射文件的位置和名称,然后在 XML 文件中书写 SQL 语句,例如: <select id="selectById" resultType="com.example.model.User"> select * from user where id = #{id} </select> 3. 自定义接口 自定义接口是将 SQL 语句封装在方法中最为常用的方式,只需定义一个接口并继承 MyBatis-Plus 提供的 BaseMapper 接口,然后在接口中定义方法即可。例如: public interface UserMapper extends BaseMapper<User> { @Select("select * from user where username = #{username}") User selectByUsername(String username); } 4. 自定义 SQL 语句构建器 MyBatis-Plus 提供了 LambdaQueryWrapper 和 QueryWrapper 等构建器来方便编写 SQL 语句,若这些构建器无法满足我们的需求,可以自定义 SQL 语句构建器。例如: public class CustomWrapper<T> extends AbstractWrapper<T, CustomWrapper<T>> { public CustomWrapper() { super(); } public CustomWrapper(T entity) { super.setEntity(entity); } public CustomWrapper(T entity, String... columns) { super.setEntity(entity); super.select(columns); } public CustomWrapper<T> myMethod(String field, Object value) { super.eq(field, value); return this; } } 以上就是 MyBatis-Plus 自定义 SQL几种方式,选择哪种方式取决于个人需求和习惯。无论是哪种方式,都需要注意 SQL 注入的风险,保证 SQL 语句的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值