mybatis中的动态sql拼接

在进行动态sql之前,先说一个在实际开发中用户的id一般都是无序的,比如使用UUID的随机生成,下面写一个。

public class UUIDGenerate {
   
    public static String getIdByUUID(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
}

众所周知我们在开发中会遇到一种拼接的问题,比如搜索框这种,用户选择不用的标签进行查询等等,我们经常碰到的问题就是and、‘,’等问题,and是再select语句中假如用户没有选择第一个,后面的自然是and X=
#{X},这样sql语句会报错,我们就必须考虑这样的情况进行排除去掉其中的and,在以前的开发中会很麻烦,但是在mybatis中很方便。
先看pojo

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Blog {
    private String id;
    private String title;
    private String author;
    private Date createTime;//注意一下这里的属性名和数据库的字段名不一样
    private Integer views;

}

这里说一下关于mybatis中驼峰命名的开启

public interface BlogMapper {

    int addBook(Blog blog);

    List<Blog> queryBlogByIf(Map map);

    List<Blog> queryBlogByChoose(Map map);

    int updateBlogBySet(Map map);

    List<Blog> queryBlogByForEach(Map map);
}

解决那个where中的and问题

   
    <sql id="if-title-author">

        <if test="title!=null">
            and title=#{title}
        if>
        <if test="author!=null">
            and author=#{author}
        if>
    sql>
    
    <select id="queryBlogByIf" parameterType="map" resultType="blog">
        select * from blog
        <where>

        <include refid="if-title-author">include>
        where>

    select>

在这段代码中使用了封装,从而使用封装起来的代码的引用的方法
这个是用于将封装的代码装起来,一般就是那些个if标签
这个则是使用,将封装的代码插入

    <select id="queryBlogByChoose" parameterType="map" resultType="blog">

        select * from blog
        <where>
            <choose>
                <when test="id!=null">
                    id=#{id}
                when>
                <when test="title!=null">
                    and title=#{title}
                when>
                <when test="author!=null">
                    and author=#{author}
                when>
                <otherwise>
                    and views=#{views}
                otherwise>

            choose>


        where>

    select>

这个里面使用了choose、when、otherwise标签,这个就是想当于switch、case、default的方法,只会执行一个

  <update id="updateBlogBySet" parameterType="map">
    update blog
    <set>
        <if test="title!=null">
            title=#{title},
        if>
        <if test="author!=null">
            author=#{author},
        if>
        <if test="views!=null">
            views=#{views}
        if>
    set>
        where id=#{id};
    update>

update语句中则是使用的标签,用于处理后面的逗号问题
当然以上的实现的对于逗号的处理方法,我们还可以使用一个标签来进行处理


    <insert id="addBook" parameterType="blog">

insert into blog

<trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="id!=null">
        id,
    if>
    <if test="title!=null">
        title,
    if>
    <if test="author!=null">
        author,
    if>
    <if test="createTime!=null">
        create_time,
    if>
    <if test="views!=null">
        views
    if>
trim>

        <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
            <if test="id!=null">
                #{id},
            if>
            <if test="title!=null">
                #{title},
            if>
            <if test="author!=null">
                #{author},
            if>
            <if test="createTime!=null">
                #{createTime},
            if>
            <if test="views!=null">
                #{views}
            if>
        trim>


    insert>

最后一个标签就是遍历的标签

 <select id="queryBlogByForEach" parameterType="map" resultType="blog">
        select * from blog
        <where>
            <foreach collection="ids" item="id" open="and (" close=")" separator="or">

                id=#{id}
            foreach>

        where>
    select>

它实现的就是类似于这种查询

select * from student where 1=1 and (id=1 or id=2 or id=3);
这样的一种查询方法是用来按照自己的需求来进行查询
为什么加上1=1,就是为了保证在后面为null或者出问题时不会报错,会得到所有的结果

而在mybatis中的标签是自带1=1这种含义的,所以不用考虑,只用考虑后面的那几个


从这个标签中我们可以看出,我们需要给这个其一个list叫做ids,其中的每一个哦我们呢叫做item(这个和jsp中的遍历很像),open是以什么开始,close是以什么结束,要注意的地方是open里面那个and和(千万别连起来,中间是由空格的!!!
最后那个separator就是说这几个之间用什么隔开,我们用的是or。

你可能感兴趣的:(mybatis)