动态sql
有时,我们需要对一下参数进行选择性的使用,如果这时创建多个接口会导致代码较为繁琐,使用动态sql来让不必要的内容不拼接进入sql语句就可以解决这种问题.
<if>标签
在添加用户时,用户可以设置昵称,密码以及年龄.
XML
<insert id="insert">
insert into userinfo(username,password,age) values(#{username},#{password},#{age})
</insert>
如果用户不想设置年龄,可以使用if标签去除age的插入.
XML
<insert id="insert">
insert into userinfo(
username,password
<if test="age != null">
,age
</if>
) values(
#{username},#{password}
<if test="age != null">
,#{age}
</if>)
</insert>
if标签的test属性中放入Java对象的属性,当age不存在时,if的内容,age或,#{age}也不会拼接进sql中,从而打到选择性插入的效果.
java
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("ceshi");
userInfo.setPassword("123456");
//不输入age
//userInfo.setAge(18);
mapper.insert(userInfo);
}

成功插入.
<trim>标签
之前的插⼊用户功能,只是有⼀个age字段可能是选填项,如果有多个字段,⼀般考虑使⽤标签结
合标签,对多个字段都采取动态⽣成的⽅式.trim标签包含以下属性:
prefix:表⽰整个语句块,以prefix的值作为前缀
suffix:表⽰整个语句块,以suffix的值作为后缀
prefixOverrides:表⽰整个语句块要去除掉的前缀
suffixOverrides:表⽰整个语句块要去除掉的后缀
选择性插入多个属性的用户:
XML
<insert id="insert">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
username,password,
<if test="age != null">
age,
</if>
<if test="gender != null">
gender,
</if>
<if test="phone != null">
phone,
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
#{username},#{password},
<if test="age != null">
#{age},
</if>
<if test="gender != null">
#{gender},
</if>
<if test="phone != null">
#{phone},
</if>
</trim>
</insert>
java
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("ceshi");
userInfo.setPassword("123456");
//不输入age
//userInfo.setAge(18);
userInfo.setGender(1);
//不输入电话号码
//userInfo.setPhone("123555");
mapper.insert(userInfo);
}

插入成功.
trim会基于prefix配置,开始部分加上 ( ,基于suffix配置,结束部分加上 ) ,多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于suffixOverrides配置去掉最后⼀个 ,
<where>标签
where标签会在标签位置生成一个where,并且去除标签内部最开始的and.
XML
<select id="selectByIdAndName" resultType="com.springboot.mybatis.model.UserInfo">
select * from userinfo
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</where>
</select>

<set>标签
set标签会在标签位置生成一个set,并删除内容的最后一个逗号.
XML
<update id="updateById">
update userinfo
<set>
<if test="id != null">
age = 98,
</if>
</set>
<where>
<if test="id != null">
and id = #{id}
</if>
</where>
</update>


更新成功.
<foreach>标签
对集合进⾏遍历时可以使⽤foreach标签.标签有这些属性:
collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象
item:遍历时的每⼀个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
根据用户id列表,删除多个用户:
XML
<delete id="deleteById">
delete from userinfo where
id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
</delete>


删除成功.
<include>标签与<sql>标签
include标签与sql标签所做的事类似函数,在某处声明一些内容,然后根据片段名进行使用.
先使用sql标签定义可重用的sql片段,id属性来定义片段名.
再使用include标签进行复用,使用refid属性来指定片段.
XML
<sql id="test">
select * from userinfo
</sql>
<select id="selectAll" resultType="com.springboot.mybatis.model.UserInfo">
<include refid="test"></include>
</select>

留言板练习
之前的留言板练习,没有后台数据库,所有留言都存留在内存中,当服务器重启,留言就会消失.结合mybatis内容对留言板练习进行重做.
后端代码对Message进行重写,添加与数据库的交互.
java
@RestController
@RequestMapping("/message")
public class Message {
@Autowired
MessageService messageService;
@RequestMapping("/getList")
public List<MessageInfo> getList() {
return messageService.getList();
}
@RequestMapping("/publish")
public boolean publish(MessageInfo messageInfo) {
System.out.println(messageInfo);
if(!StringUtils.hasLength(messageInfo.getFrom())
|| !StringUtils.hasLength(messageInfo.getTo())
|| !StringUtils.hasLength(messageInfo.getMessage())) {
//其中一个为空
return false;
}
messageService.insertMessage(messageInfo);
return true;
}
}
java
@Service
public class MessageService {
@Autowired
private MassageInfoMapper mapper;
public List<MessageInfo> getList() {
return mapper.selectAll();
}
public void insertMessage(MessageInfo messageInfo) {
mapper.insertMessage(messageInfo);
}
}
java
@Mapper
public interface MassageInfoMapper {
@Select("select * from messageinfo")
List<MessageInfo> selectAll();
@Insert("insert into messageinfo(`from`,`to`,message) values(#{from},#{to},#{message})")
Integer insertMessage(MessageInfo messageInfo);
}
运行展示:
可正常留言.



重启服务器并再次访问页面,观察留言是否存留.


留言存在