Mybatis动态sql实现CRUD操作

1.select查询

select查询也可以使用之前的机制在配置文件中直接编写sql,但是select语句的where字句中需要拼接哪些查询字段是根据

传入的值决定的,此时可以通过Mybatis提供的标签实现判断,动态的去拼接select语句,而不是按照每次传入的条件参数

不同而去分情况写一堆的sql

在拼接的过程中Mybatis标签会根据传入值是否为空,自动去掉多余的and

    <select id="selc01" resultType="cn.cn.wyy.domain.User">
        select * from user
        <where>
            <if test="id!=0">id = #{id}</if>
            <if test="name!=null">and name = #{name}</if>
            <if test="age!=0">and age = #{age}</if>
        </where>
    </select>

测试类

    @Test
    public void test02(){
        //User user = new User(3,"ccc",25);
        //User user = new User(3,null,25);
        //User user = new User(0,null,25);
        User user = new User();
        List<User> list = session.selectList("cn.cn.wyy.mapper.UserMapper.selc01",user);
        System.out.println(list);
    }

2.insert插入

insert插入也可以使用之前的机制在配置文件中直接编写sql,但是insert语句的参数和值的列表,需要拼接哪些字段是根据传入的值决定,此时可以通过Mybatis提供的标签来实现判断,动态的拼接insert语句

在拼接的过程中Mybatis标签会根据传入值是否为空,自动去掉多余的逗号

trim标签的使用 

以下是trim标签中涉及到的属性:

属性描述
prefix给sql语句拼接的前缀
suffix给sql语句拼接的后缀
prefixOverrides去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

下面使用几个例子中左括号开头,左括开头(prefix),右括号结尾(suffix)

    <insert id="insert01">
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            id,
            <if test="name!=null">name,</if>
            <if test="age!=0">age,</if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            null,
            <if test="name!=null">#{name},</if>
            <if test="age!=0">#{age},</if>
        </trim>
    </insert>

测试代码

    @Test
    public void test03(){
        //User user = new User(0,"xxx",99);
        //User user = new User(0,"zzz",0);
        User user = new User(0,null,0);
        session.insert("cn.cn.tedu.mapper.UserMapper.insert01",user);
        session.commit();
    }

3.update修改

update修改可以使用原始的机制在配置文件中直接编写sql,但是update语句的set语句中,需要拼接哪些字段。是根据传入的值决定的,此时通过Mybatis提供的标签来实现判断,动态的拼接update语句。

update set有多个字段, 后面的逗号都需要添加,Mybatis的set标签会自动去除
如果age设置为0,那么下面的语句就会默认age传入的值为空,从而去掉该字段,不用在拼接它。

但是非要传入age的值为0,因为语句条件都是自己写的,可以将age类型由int 换为Integer那么传入为null才无效,可以传入0,也可以不用动态标签,单独写一个不带标签的sql

    <update id="update01">
        update user
        <set>
            <if test="name!=null">name=#{name},</if>
            <if test="age!=0">age=#{age},</if>
        </set>
        where id = #{id};
    </update>
    @Test
    public void test01() throws IOException {
        //3.调用Sql
        //User user = new User(3,"xxx",88);
        //User user = new User(3,"ccc",0);
        User user = new User(3,null,25);
        session.update("cn.cn.wyy.mapper.UserMapper.update01",user);
        session.commit();
    }

4.deleta删除

delete删除可以使用原始的机制在配置文件中直接编写sql,但是delete语句的删除条件,需要拼接哪些字段。是根据传入的值决定的,此时通过Mybatis提供的标签来实现判断,动态的拼接delete语句。

对于下面配置语句:

collection中是集合对象的名称

item:i变量相当于for循环中的i

open:以左括号开始

close:以右括号结束

separator:通过逗号分隔

  <delete id="del02">
        delete from user where id in
        <foreach collection="list" item="i" open="(" close=")" separator=",">
            #{i}
        </foreach>
    </delete>

    <delete id="del01">
        delete from user
        <where>
            <if test="id!=0">id = #{id}</if>
            <if test="name!=null">and name = #{name}</if>
            <if test="age!=0">and age = #{age}</if>
        </where>
    </delete>
    /**
     * 删除
     */
    @Test
    public void test05(){
        List list = Arrays.asList(2,3,5);
        session.delete("cn.cn.wyy.mapper.UserMapper.del02",list);
        session.commit();
    }

    /**
     * 删除
     */
    @Test
    public void test04(){
        //User user = new User(12,null,0);
        //User user = new User(11,"zzz",0);
        User user = new User(10,"xxx",99);
        session.delete("cn.cn.wyy.mapper.UserMapper.del01",user);
        session.commit();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值