mybatis3中@SelectProvider传递参数方式


Posted in Java/Android onAugust 04, 2021

mybatis3 @SelectProvider传递参数

一、通常情况下我喜欢使用实体或者vo去传参数

这样在Provide的方法中可以直接通过#{param}(param为你实体中的字段)来获取你要的参数。

二、使用map传参数

在超过一个参数的情况下,@SelectProvide方法必须接受Map<String, Object>做为参数,

如果参数使用了@Param注解,那么参数在Map中以@Param的值为key,如下例中的userId;

如果参数没有使用@Param注解,那么参数在Map中以参数的顺序为key,如下例中的password:

UserMapper.java:

@SelectProvider(type = SqlProvider.class, method = "selectUserCheck")
@ResultMap("userMap")
public User getUserCheck(@Param("userId") long userId, String password);

SqlProvider.java:

public String selectUserCheck(Map<String, Object> para) {
         return "select * from user where userId=" + para.get("userId") + " and password=' " + para.get("1") + "'";
     }

@SelectProvider,@Select和xml用法的一点理解

1.@Select

同@select功能类似的还有@insert,@delete,@update,对应于数据库语句的CRUD。使用@select很方便,不用写配置文件,一般是写在mapper的interface类中,用法如下:

public interface AdmainMapper{
@Select("SELECT * FROM userinfo WHERE username = #{username} AND password = #{password}")
     @Results(value = {    //@Result这项可以不写
             @Result(id = true, column = "id", property = "id"),
             @Result(column = "username", property = "username"),
             @Result(column = "password", property = "password") })
     public Admin selectAdmin(@Param("username") String username,
                              @Param("password") String password);//参数可以是一个对象,sql语句会自动匹配
}

使用注解的方式很简单但是不是很灵活,对于动态条件查询是无法实现的,这时,我们可以使用xml注解的方式。

2.xml方式

public interface AdminMapper {
public List<Admin> getAdminByConditions(@Param("username")String username,
                                             @Param("password")String password,
                                             @Param("start")int start,
                                             @Param("limit")int limit);//参数可以直接传入一个类,在xml中可以自动匹配
}

注解的方式和xml的方式可以写在同一个类中,就如上所示,这两个方法可以在同一个类中。这里写上@Param,在xml中就不用使用parameterType属性了。

<?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.xxx. ... .AdminMapper">
    <!-- 指定字段映射 -->
<resultMap type="com. ... .Student" id="studentResultMap"> //下面方法返回结果存放类型通过id识别
   <id property="id"  column="id"  />
   <result property="name" column="name"  />
   <result property="age" column="age"  />
   <result property="classId" column="classId"  />
</resultMap>
<sql id="Base_Column_List">  //使用这种方法可以使重复使用的字段通过id直接调用即可,很方便
   id, name ,age,classId
</sql>
<!-- 若不需要自动返回主键,将useGeneratedKeys="true" keyProperty="id"去掉即可 -->
 
<select id="getAdminByConditions" parameterType="com. ... .StudentVo"  resultMap="studentResultMap">
   <![CDATA[ SELECT ]]>      //此id要和mapper中的方法名对应
   <include refid="Base_Column_List" />
   <![CDATA[ FROM student WHERE 1=1]]>
   <if test="id != null"><![CDATA[ AND id = #{id} ]]></if>
   <if test="name != null"><![CDATA[ AND name  like CONCAT('%',#{name},'%') ]]></if>
   <if test="age != null"><![CDATA[ AND age = #{age} ]]></if>
   <![CDATA[ ORDER BY id  DESC  limit  #{startRow} , #{pageSize} ]]>
</select>
</mapper>

xml的文件名最好与mapper的名字对应下来。

此外我们还需要对配置文件进行配置,这里我就不多说,大家自行百度

3.@SelectProvider方式

我觉得这种方式集成了前两种方法的优点,用法如下:

public interface AdmainMapper{
@SelectProvider(type = SqlBuilder.class, method = "queryList")//指定所用sql语句
@ResultMap("student")
       List<student> getList(@Param("start") int start,
                                @Param("pageSize") int pageSize,
                                @Param("apIds") String apIds,
                                @Param("model") String model);
 
}
public class SqlBuilder {//与type对应         
       public String queryList(@Param("start") int start, @Param("pageSize") int pageSize, //于method对应
                                @Param("apIds") String apIds, @Param("model") String model) {
 
              String sql = " SELECT ap.* FROM ap WHERE ap.id NOT in ( SELECT apid FROM ap_activity_mapping WHERE del = 0 ";
              if (StringUtils.isNotEmpty(apIds)) {
                      sql += " and apid not in (" + apIds + ") ";
              }
              sql += " ) ";
              if (StringUtils.isNotEmpty(model)) {
                      sql += " and model = '" + model + "'";
              }
              sql += " GROUP BY ap.id limit " + start + "," + pageSize;
 
              return sql;
 
       }//返回类型必须是String
}

用这种方法要注意的是不要重载,此外还接受Map<String, Object>作为参数。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
使用feign服务调用添加Header参数
Jun 23 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
SpringBoot 拦截器妙用你真的了解吗
Jul 01 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Apr 08 Java/Android
Java设计模式之代理模式
Apr 22 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
Java中的Kafka为什么性能这么快及4大核心详析
Sep 23 Java/Android
浅谈Java父子类加载顺序
Aug 04 #Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 #Java/Android
Java后台生成图片的完整步骤
Aug 04 #Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 #Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Log4j.properties配置及其使用
Aug 02 #Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
编写Js代码要注意的几条规则
2010/09/10 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
Python中类型检查的详细介绍
2017/02/13 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
Django 开发环境配置过程详解
2019/07/18 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
医药销售自荐书
2014/05/29 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
罗马假日观后感
2015/06/08 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
反邪教教育心得体会
2016/01/15 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
Python实现学生管理系统(面向对象版)
2021/06/24 Python
JavaScript ES6的函数拓展
2022/01/18 Javascript
sql server 累计求和实现代码
2022/02/28 SQL Server