通过mybatis将接口与数据库之间联系起来。用的时候还是踩了一些坑的。记录一下供自己以后翻翻看看。
一、@Param("")
注意,这里引入的@Param("")需要引入的包是ibatis的包,而不是spring的。
1、输入普通的单个参数
通过在Dao接口中的方法中对输入的参数设置@Param("item")的方式可以指定在数据库中使用"item"来获取该字段的值:
具体用法:
(a)Dao中的接口方法定义如下:
void addItem(@Param("itemId") Integer itemId, @Param("item") String inputItem);
(b)数据库xml文件定义如下:
<insert id="addItem">
INSERT INTO tbl_item (itemId, item) VALUES (#{itemId}, #{item})
</insert>
注意,SQL是按照比如@Param("item")里面的item来识别的,而不是接口方法中定义的临时变量名称。
2、输入Map集合
通过输入Map的方式,可以将多个数据通过键值对的方式传到xml文件中。具体用法:
2.1、使用@Param("")
(a)在调用接口之前,将需要向数据库中传递的参数数据添加到map中:
Map<String, Object> filter = new HashMap<String, Object>;
filter.put("name", "lina");
filter.put("gender", "female");
filter.put("age", 24);
(b)、Dao接口中定义方法:、
List<HeroInfo> queryHeroByFilter(@Param("filter") Map<String, Object> filter);
(c)、xml文件中定义查询SQL语句:
<select id="queryHeroByFilter" resultType="com.xss.model.HeroInfo">
SELECT name, gender, age, height, weight, bust, waist, hipline, status
FROM tbl_hero_info
WHERE name=#{filter.name}
<if test="gender != null">
AND gender=#{filter.gender}
</if>
<if test="age != null">
AND age=#{filter.age}
</if>
</select>
2.2、不用@Param("")的方式
(a)、同2.1的(a)
(b)、Dao接口中定义的方法:
List<HeroInfo> queryHeroByFilter(Map<String, Object> filter);
(c)、xml文件中SQL定义:
<select id="queryHeroByFilter" resultType="com.xss.model.HeroInfo">
SELECT name, gender, age, height, weight, bust, waist, hipline, status
FROM tbl_hero_info
WHERE name=#{name}
<if test="gender != null">
AND gender=#{gender}
</if>
<if test="age != null">
AND age=#{age}
</if>
</select>
总结:两种方式要么使用第一种,要么使用第二种,不能混用。特别是,Dao接口中的方法中添加了@Param("filter"),而在SQL中没用,这就会导致调用失败,抛出反射异常。
3、输入的是List
如果需要向后台批量插入数据,而输入的是类,则可以如下方式定义接口方法及SQL语句。
3.1、使用@Param("")
(a)、定义Dao接口中的方法:
void addHeroInfo(@Param("heroList") List<HeroInfo> heroInfoList);
(b)xml文件中SQL写法:
<insert id="addHeroInfo">
INSERT INTO tbl_hero_info (name, gender, age, height, weight, bust, waist, hipline, status)
<foreach collection="heroList" item="item" separator=",">
(#{item.name}, #{item.gender}, #{item.age}, #{item.height}, #{item.weight}, #{item.bust],
#{item.waist}, #{item.hipline}, #{item.status})
</foreach>
</insert>
需要注意的是:
添加了@Param("heroList")之后,在SQL中也必须在collection中填写"heroList"才能匹配,否则会报反射异常。
添加的value中,输入参数格式为例如#{item.name}而不是直接#{name},其中,item.name与item="item"中定义的名字匹配。
separator=","表示一条语句执行完毕之后添加的分隔符号,这里是批量insert,因此每条记录执行insert之后,需要加的是逗号分隔。
3.2、不使用@Param("")
(a)、定义接口方法:
void addHeroInfo(List<HeroInfo> heroInfoList);
(b)、xml中SQL语句:
<insert id="addHeroInfo">
INSERT INTO tbl_hero_info (name, gender, age, height, weight, bust, waist, hipline, status)
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.gender}, #{item.age}, #{item.height}, #{item.weight}, #{item.bust],
#{item.waist}, #{item.hipline}, #{item.status})
</foreach>
</insert>
这里的collection默认是list,具体为啥还有待研究。。。