• mybatis传参总结


    注:文章引用部分 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中。
    ${}也可以接收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>
    
  • 相关阅读:
    浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立
    用Python解析XMind
    Flask写web时cookie的处理
    一篇文章看懂Facebook和新浪微博的智能FEED
    改进网易云音乐的“音乐社交”构想
    移动端爬虫工具与方法介绍
    用供应链管理思路降低教培产品成本
    【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)
    网易严选的wkwebview测试之路
    linux多进程之间的文件锁
  • 原文地址:https://www.cnblogs.com/sunqiangstyle/p/10312299.html
Copyright © 2020-2023  润新知