• mybatis动态SQL


    if(如果test中的条件满足,则在sql中拼装if之中的条件)

    trim自定义sql拼装规则。包括

    加前缀 prefix,

    加后缀suffix
    去掉前缀
    prefixOverrides,
    去掉后缀suffixOverrides
    <select id="getBloggerByDynamicSQL" resultType="com.yunqing.mybatis.bean.Blogger">
            SELECT * FROM t_blogger
            <!--自定义sql,相当于字符串前缀(没有的话)加一个where,后缀(有的话)去掉一个and-->
            <trim prefix="where" suffixOverrides="and">
                <if test="id!=null">
                    WHERE id=#{id} AND
                </if>
                <if test="username!=null and username!=''">
                    username=#{username} AND
                </if>
                <if test="password!=null and password!=''">
                    password=#{password}
                </if>
            </trim>
        </select>

    choose相当于switch case

    when满足条件,补上sql跳出

    都不满足则补上otherwise中的sql

    <select id="getBloggerByChoose" resultType="com.yunqing.mybatis.bean.Blogger">
            SELECT * FROM t_blogger
            <where>
                <choose>
                    <when test="id!=null">
                        id=#{id}
                    </when>
                    <when test="username!=null and username!=''">
                        username=#{username}
                    </when>
                    <when test="password!=null and password!=''">
                        password=#{password}
                    </when>
                    <otherwise>
                        profile LIKE #{profile}
                    </otherwise>
                </choose>
            </where>
        </select>

    set相当于修改信息的set,也可以使用trim自定义

    <update id="updateBlogger">
            UPDATE t_blogger
            <set>
                <if test="username!=null and username!=''">
                    username=#{username},
                </if>
                <if test="password!=null and password!=''">
                    password=#{password}
                </if>
            </set>
            <where>
                id=#{id}
            </where>
        </update>

    自定义写法:

    <update id="updateBlogger">
            UPDATE t_blogger
    <!--相当于给sql字符串前边加上set,后边如果多出,则去掉,-->
    <trim prefix="set" suffixOverrides=","> <if test="username!=null and username!=''"> username=#{username}, </if> <if test="password!=null and password!=''"> password=#{password} </if> </trim> <where> id=#{id} </where> </update>

     foreach:遍历,多用于批量查询,或者批量添加等批量操作

    package com.yunqing.mybatis.dao;
    
    import com.yunqing.mybatis.bean.User;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.List;
    
    public interface UserDynamicSQLMapper {
    
        List<User> getUserByDynamicSQL(User user);
    
        void updateUser(User user);
    
        void addUsers(@Param("users") List<User> users);//批量添加
    
        List<User> getAllByIds(@Param("ids") List<Integer> ids);//根据多id查询
    }
    <!--批量添加
        collection:集合名
        item:集合中子元素命名
        separator:以xx分割<foreach>中的sql
        open:<foreach>中的sql以open中的内容开始
        close:<foreach>中的sql以open中的内容结束
        -->
        <insert id="addUsers">
            INSERT INTO t_user(name,age,dep_id) VALUES
            <foreach collection="users" item="user" separator=",">
                (#{user.name},#{user.age},#{user.dep.id})
            </foreach>
        </insert>
        
        <select id="getAllByIds" resultType="com.yunqing.mybatis.bean.User">
            SELECT * FROM t_user WHERE id IN
            <foreach collection="ids" item="items" separator="," open="(" close=")">
                #{items}
            </foreach>
        </select>

    测试

    @Test
        public void addUsers() throws IOException {
            SqlSession sqlSession = getSqlSessionFactory().openSession(true);
            UserDynamicSQLMapper mapper = sqlSession.getMapper(UserDynamicSQLMapper.class);
            List<User> list = new ArrayList<>();
            list.add(new User(null,"drj",20,new Department(2)));
            list.add(new User(null,"LYF",2,new Department(2)));
            mapper.addUsers(list);
        }
    @Test
        public void getUserByDynamicSQL() throws IOException {
            SqlSession sqlSession = getSqlSessionFactory().openSession();
            UserDynamicSQLMapper mapper = sqlSession.getMapper(UserDynamicSQLMapper.class);
            /*User user = new User(7,"uzi",20,null);
            List<User> userByDynamicSQL = mapper.getUserByDynamicSQL(user);
            for (User u : userByDynamicSQL) {
                System.out.println(u);
            }*/
            List<User> allByIds = mapper.getAllByIds(Arrays.asList(1, 2, 3, 19));
            for (User u : allByIds) {
                System.out.println(u);
            }
        }

     动态sql内置参数有两个:_parameter和_databaseId

    <bind>绑定的运用:

    <select id="getBloggerByParameter" resultType="com.yunqing.mybatis.bean.Blogger">
            SELECT * FROM t_blogger
    <!--给传入的参数绑定模糊查询的%,以便在测试的时候可以直接写要模糊查询的内容不用补%-->
    <bind name="_profile" value="'%'+profile+'%'"/> <where> <if test="_parameter!=null"><!--传入的内置参数--> profile LIKE #{_profile} </if> </where> </select>

    测试:

    @Test
        public void getBloggerByParam() throws IOException {
            SqlSession sqlSession = getSqlSessionFactory().openSession();
            BloggerDynamicSQLMapper mapper = sqlSession.getMapper(BloggerDynamicSQLMapper.class);
            Blogger blogger = new Blogger();
            blogger.setProfile("e");//如果不绑定%%则在此处需要写(“%e%”)
            List<Blogger> bloggerByParameter = mapper.getBloggerByParameter(blogger);
            for (Blogger blo :
                    bloggerByParameter) {
                System.out.println(blo);
            }
        }

    <sql>标签抽取可重用sql片段,在需要引用可重用片段处使用<include>标签引用。

  • 相关阅读:
    java反编译工具
    Eclipse反编译插件: Jodeclipse与JadClipse
    Apk修改利器:ApkToolkit v2.1
    新浪微博2.5.1 for Android 去广告
    java
    第K顺序统计量
    身份证号码
    pop3
    google
    Exception
  • 原文地址:https://www.cnblogs.com/yunqing/p/8259079.html
Copyright © 2020-2023  润新知