DAO层接口定义多个入参(Mybatis)

本文将介绍本人接触过的在DAO层定义多个入参的三种方法:

方法一:将入参封装在一个实体类中。
接触mybatis一般都会接触工具generator;大部分人也是从自动生成的sql接口来了解DAO层接口的定义。
观察generator自动生成的代码可以发现在多个入参(多个PrimaryKey)的情况下,会将它们定义为一个实体类,用实体类作为入参。
以类Photo为例,定义Photo表字段为id,name, md5, url;主键为id,name
DROP TABLE IF EXISTSphoto;
CREATE TABLE
photo(
idint(11) NOT NULL,
md5varchar(255) NOT NULL,
namevarchar(255) NOT NULL,
urlvarchar(255) NOT NULL,
PRIMARY KEY (
id,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用工具generator生成时,可以看到id,name定义为PhotoKey类

public class PHOTOKey {
    private Integer id;
    private String name;
//省略set,get,toString方法
}

DAO层接口的查询方法selectByPrimaryKey入参为PhotoKey类:
PHOTO selectByPrimaryKey(PHOTOKey key);
mapping文件中的实现为

 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="com.cn21.yuntu.entity.db.file.PHOTOKey" >
    select 
    <include refid="Base_Column_List" />
    from photo
    where id = #{id,jdbcType=INTEGER}
      and name = #{name,jdbcType=VARCHAR}
  </select>

方法二:将入参封装进map中,使用map作为入参。
Photo selectByIdandName(Map<String,String> map);
mapping文件中的实现为

 <select id="selectByIdandName" resultMap="BaseResultMap" parameterType="Map" >
    select  
    <include refid="Base_Column_List" />
    from photo a
    where a.ID = #{Id,jdbcType=INTEGER} 
    and a.NAME = #{name,jdbcType=VARCHAR} 
  </select>

这个方法用起来容易出错,因为map的封装很难一眼让人了解参数的意义,调用时也容易出现变量名的定义与mapping.xml文件变量名不一致的情况,比如大小写或这下划线的简单错误,不建议使用

方法三:使用@Param定义入参。
在接口入参处,用@Param定义好入参的变量名,单个入参可以不定义,多个入参就必须增加定义。

Photo selectByIdandName(@Param("Id") Integer Id, @Param("name") String name);

mapping文件中的实现为

 <select id="selectByIdandName" resultMap="BaseResultMap" >
    select  
    <include refid="Base_Column_List" />
    from photo a
    where a.ID = #{Id,jdbcType=INTEGER} 
    and a.NAME = # {name,jdbcType=VARCHAR}
  </select>

这个方法相比方法二就比较一目了然 。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值