注:文章引用部分 mybatis传递参数总结文章内容

一、单个参数

1、基本数据类型

(1)直接使用

    List<ChargeRuleDO> tests(long id);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id}
</select>

#{}中的参数名与方法中的参数名不一定一致,仅起到占位符作用

(2)使用注解 (最为直接不易出错)

    List<ChargeRuleDO> tests(@Param("aid") long bid);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{aid}
</select>

#{}中的参数名与方法中的@Param()里的参数名一致

2、复杂数据类型(这里主要是指Java实体类)

(1)直接使用

List<ChargeRuleDO> tests(TestQO testQO);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id} and t.rule_type=#{ruleType}
</select>

#{}中的参数名与方法中的参数的属性名一致

(2)使用注解

List<ChargeRuleDO> tests(@Param("atestQO") TestQO btestQO);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{atestQO.id} and t.rule_type=#{atestQO.ruleType}
</select>

#{}中的参数名与方法中的@Param()里的参数对应的属性名一致,而且必须写成"#{atestQO.id}“的格式,不能简写成”#{id}".

二、多个参数

1、基本数据类型

(1)直接使用

List<ChargeRuleDO> tests(long id,String ruleType);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
  select * from t_charge_rule t where t.id = #{0} and t.rule_type=#{1}
</select>

这里改用#{index},其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。直接写参数名字或者其他进行占位会报Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]这样的错误

(2)使用注解

    List<ChargeRuleDO> tests(@Param("id") long id,@Param("ruleType") String ruleType);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id} and t.rule_type=#{ruleType}
</select>

#{}中的参数名与方法中的@Param()里的参数名一致

2、复杂数据类型

(1)直接使用

尝试了两种取参数的方法都不行

(2)使用注解

    List<ChargeRuleDO> tests(@Param("testQO")TestQO testQO,@Param("testQO2")TestQO2 testQO2);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{testQO.id} and t.rule_type=#{testQO.ruleType} and t.user_id=#{testQO2.uesrId}
</select>

#{}中的参数名与方法中的@Param()里的参数对应的属性名一致,而且必须写成"#{testQO.id}“的格式,不能简写成”#{id}".

3、基本数据类型与复杂数据类型混合使用

因为在多参数的情况下,复杂数据类型不能直接使用,所以这里主要尝试基本数据类型直接使用并且复杂数据类型使用注解这一种情况

    List<ChargeRuleDO> tests(long id,String ruleType,@Param("testQO2")TestQO2 testQO2);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
  select * from t_charge_rule t where t.id = #{0} and t.rule_type=#{1} and t.user_id=#{testQO2.uesrId}
</select>

4、List参数

List<ChargeRuleDO> tests(List<long> list);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>

四、if test=" "传值

在mybatis if test语句中,是使用#{}还是${} 或是其他?结论是两者都不可以在test中使用

小提一下:

#{}表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。

程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。

#{}接收pojo数据,可以使用OGNL解析出pojo的属性值

表示sql的拼接,通过{}
表示sql的拼接,通过表示sql的拼接,通过{}接收参数,将参数的内容不加任何修饰拼接在sql中。

${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值

缺点:不能防止sql注入。

1、 String类型单个参数传递,使用_parameter

    public List<Long> listAuthTeachersByTeacherName(String teacherName);
<select id="listAuthTeachersByTeacherName" parameterType="string" resultType="long">
select uid from auth_teacher where status = 20
<if test="_parameter != null and _parameter != ''">
and real_name like concat('%',#{_parameter},'%')
</if>
order by apply_last_date asc
</select>

注意:这里的参数获取只能使用"_parameter",而不能使用teacherName,否则总是抛出There is no getter for property named ‘teacherName’ in 'class java.lang.String’的异常信息。

2、多值使用注解

  public List<Course> querybyNameandTime(@Param("start")String start,@Param("end") String end, @Param("coursename") String coursename, @Param("fuzzquery") String fuzzquery);
<select id="querybyNameandTime" resultMap="ListCourseMapper">
select * from course
<where>
<if test="start != null and start !=''">
and date(course_starttime) between #{start} and #{end}
</if>
<choose>
<when test="coursename != null and coursename !='' and fuzzquery != null">
and course_name like '%' #{coursename} '%'
</when>
<when test="coursename!= null and coursename !='' and fuzzquery == null ">
and course_name = #{coursename}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>

3、pojo可以直接使用属性

<select id="ListByChose"    resultMap="StudentMapper">
SELECT * FROM student
<where>
<choose>
<when test=" name != null and name !=''">
and sname like '%' #{name} '%'
</when>
<when test=" age != null and age !='' and age > 0">
and age > #{age}
</when>
<when test=" score != null and score !='' and score > 0">
and score > #{score}
</when>
<otherwise>
1==2
</otherwise>
</choose>
</where>
</select>

4、数组和list

数组

<select id="ListByForeachArray"  resultMap="StudentMapper" >
SELECT * FROM student
<where>
<if test="array.length > 0">
and id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>

list


<select id="ListByForeachList" resultMap="StudentMapper" >
SELECT * FROM student
<where>
<if test="list.size > 0">
and id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>

mybatis传参总结的更多相关文章

  1. 问题小记(MyBatis传参出现的小问题)

    问题一:在MyBatis中注解@Param和ParameterType不能一起用,会报错Parameter 'XXX' not found. Available parameters are [1, ...

  2. Mybatis传参方式

    Mybatis传多个参数(三种解决方案) 据我目前接触到的传多个参数的方案有三种. 第一种方案  DAO层的函数方法 ? 1 Public User selectUser(String name,St ...

  3. mybatis传参的几种方式

    1,@Param @参考文章 @Select("select s_id id,s_name name,class_id classid from student where  s_name= ...

  4. Java Mybatis 传参方式

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  5. mybatis 传参是 list<string> 的注意事项

    <!--付款 批量 修改账单状态--><update id="editbillpayALL" parameterType="java.util.List ...

  6. mybatis传参问题总结

    一. 传入单个参数 当传入的是单个参数时,方法中的参数名和sql语句中参数名一致即可 List<User> getUser(int id); <select id="get ...

  7. php sql 类似 mybatis 传参

    PHP sql 处理上,没有类似于 java mybatis 的工具,导致进行一些sql 处理时,会有诸多不便, 楼主抽时间写了一个 php 类似 mybatis 的sql 工具,省去了拼装sql 的 ...

  8. Mybatis传参- 被逗号分割的字符串

    String ids = "1,2,3,4,5,6",如ids作为参数传递,查询list返回.mybatis用foreach处理并返回. SELECT * FROM yp_popu ...

  9. mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。

    <if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...

随机推荐

  1. linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结

    sudo rm -rf /var/lib/dpkg/lock sudo rm -rf /var/cache/apt/archives/lock

  2. ppp点对点协议

    直接链接两个信令点的一组链路称作什么? PPP点到点连接: 点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法.PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协 ...

  3. sql 2005 win7 64 数据引擎

    有个箭头,下拉,选择服务器名(就是本机的名称),如果没有就选择浏览更多,看能搜索出不还没的话就手动输入localhost

  4. Coolite Toolkit介绍

    Coolite Toolkit非常棒的控件   Coolite Toolkit介绍 Coolite Toolkit 是一个支持ASP.NET AJAX的Web控件. Coolite Toolkit是基 ...

  5. 通过绑定ip地址可以暂时解决抢占ip问题

    以前设置的路由器密码都忘记了 admin重复,在工作上遇到了 一个去除str左右两边的空格换行符回车等 trim

  6. 打印二叉树中距离根节点为k的所有节点

    package tree; public class Printnodesatkdistancefromroot { /** * Given a root of a tree, and an inte ...

  7. [Swift]Array(数组)扩展

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. react hooks 全面转换攻略(一) react本篇之useState,useEffect

    useState 经典案例: import { useState } from 'react'; function Example() { const [count, setCount] = useS ...

  9. 【杂文】C++头文件加速

    [杂文]C++头文件加速 骚年,冲钱送开挂哦,可以助你超神于OI战场 如果你发现你的暴力超时了的话,可以尝试用一下头文件加速,说不定就过了呢! #pragma once//只编译一次 #pragma ...

  10. 题解报告:hdu 2588 GCD(欧拉函数)

    Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written ...