在进行动态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>
在这段代码中使用了封装,从而使用封装起来的代码的引用的方法
这个则是使用,将封装的代码插入
<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。