mybatis使用错误记录

通过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,具体为啥还有待研究。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值