夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
Java基础之MyBatis传参问题

    作为初次在项目中使用MyBatis数据持久性框架,记录一下在开发过程中遇到的问题。


一、MyBatis传参问题


    MyBatis传参分为以下几种方式:

    1、使用java基本类型

         实例:Mapper.xml文件 

    <delete id="deleteFieldConfigbydtconfig" parameterType="java.lang.String" >    
      delete from BASE_FIELDCONFIG where DT_CONFIG_ID=#{dtconfigid} 
    </delete>

         实例:Mapper接口

      Integer deleteFieldConfigbydtconfig(String dtconfigid)

         在xml文件中使用#接受参数,会默认添加'';如果参数是int类型,可以使用${}赋值参数,这样就不会添加'';我最开始使用的时候看到上面的代码,就会联想到如果参多个参数就应该以下方式:

        实例:Mapper.xml文件    

    <delete id="deleteFieldConfigbydtconfig" parameterType="java.lang.String" >
       delete from BASE_FIELDCONFIG where DT_CONFIG_ID=#{dtconfigid} and mark=#{mark} 
    </delete>

        实例:Mapper接口            

       Integer deleteFieldConfigbydtconfig(String dtconfigid,String mark)

        如果以上面这种方式,程序就会抛异常,多个参数,可以用索引的方式和数据注解的方式传参,实例如下:

        (1)索引的方式

        实例:Mapper.xml文件

        <delete id="deleteFieldConfigbydtconfig">    
           delete from BASE_FIELDCONFIG where DT_CONFIG_ID=#{0} and mark=#{1} 
        </delete>

        (2)数据注解的方式

        实例:Mapper.xml文件

      <delete id="deleteFieldConfigbydtconfig">
         delete from BASE_FIELDCONFIG where DT_CONFIG_ID=#{dtconfigid} and mark=#{mark} 
      </delete>

        实例:Mapper接口

         Integer deleteFieldConfigbydtconfig(@Param("dtconfigid")String dtconfigid,@Param("mark")String mark)

        注:单个参数在xml文件中需要设置参数类型:parameterType    



2、使用java实例对象

      实例:java实体                           

public class Person{
  private Integer id;
  private String sex;
  private String name;
  private Integer age;
  .....省略
}

    实例:Mapper接口

Person selectPerson(Person person);

    实例:Mapper.xml文件

<select id="selectPerson" parameterType="com.test.entity.Person" resultType="com.test.entity.Person">
  select name,age from person where name=#{name}
</select>

    使用java实例对象作为参数,需注意xml文件中属性parameterType 和 resultType



3、使用Map对象

      使用Map对象作为参数和使用java实体对象类似,唯一注意的地方就是在Mapper.xml文件中属性parameterType="Map"

      实例:生成一个Map对象

Map<String,String> map=new HasMap<String,String>();  
map.put("age","21");  
map.put("sex","女");

      实例:Mapper接口

List<Person> selectPerson(Map<String,String>);

      实例:Mapper.xml文件

<select id="selectPerson" parameterType="Map" resultType="com.test.entity.Person">
  select name,age from person where age=#{age} and sex=#{sex}
</select>


二、MyBatis返回Map对象


        在MyBatis返回一个Map对象,并指定表中主键为Map的Key值,实现方式如下:

        实例:Mapper接口

@MapKey("validatecode")
Map<String, Object> getAllInfo();

        其中@MapKey("validatecode")注解是用来指定Map的Key是哪个字段。

        实例:Mapper.xml文件

<select id="getAllInfo"  resultType="com.test.entity.SysValidation">
      select validatecode,validatename,validatevalue,description from SYS_VALIDATION 
</select>

        在实例中返回的类型SysValidation实体,也就是Map的Value值。


       在开发中有时候需要给MyBatis传完整的sql,并返回一个List<Map<String,String>>对象,实现方式如下:

        实例:Mapper接口

List<Map<String,Object>> querySingleList(String strsql);

        实例:Mapper.xml文件

<select id="querySingleList" parameterType="String" resultType="java.util.Map">  
    ${value}  
</select>

        需要注意的地方是在接收参数的地方变成${value},另外返回一个List<Map<String,Object>>对象,需要把resultType="java.util.Map";

        

        在Mybatis中使用foreach循环,业务场景在Mytatis中传一个List集合参数批量删除数据,需要用到foreach,实现方式如下:

        实例:Mapper接口

  Integer deleteBatchByKey(List<String> keys);

        实例:Mapper.xml接口

<delete id="deleteBatchByKey" parameterType="java.util.List">
    delete from testUser where userid in
    <foreach collection="list" item = "keyvalue" open="(" separator="," close=")">
    #{keyvalue}  
    </foreach>
</delete>

        在上面代码中由于参数是List集合,所以collection="list";如果参数是数组,则collection="array";如果参数是自定义Map对象,则对应的collection="Map对象的Key";



        以上是目前在开发中使用Mybatis所遇到的一些问题,后需有其他问题再做补存记录。



作者:持之以恒

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

4

支持

0

反对

posted @2018-1-6  拜读(1290)

评论列表

评论内容:



喜欢请打赏

支付宝 微信

请放心支付