以insert标签为例
是mybatis的特性之一,能在xml里边写逻辑判断(if else for循环)
对于非必传参数,如果传了就做xx处理,如果没传,就给默认值。
常用的就5个,掌握这些即可。
作用:判断。例如,注册分为必填项和非必填项,如果有值就拼接上去,如果没值就不拼接。
使用:test里边判断的key是属性,不是数据库中字段,还有{}里边的
int addUser(UserEntity user);
<insert id="addUser2">
insert into userinfo(username,password
<if test="photo!=null and photo!=''">
,photo
if>
)values(#{username},#{password}
<if test="photo!=null and photo!=''">
,#{photo}
if>
)
insert>
@Test
void addUser2(){
String username="liliu";
String password="123456";
UserEntity user=new UserEntity();
user.setUsername(username);
user.setPassword(password);
int result=userMapper.addUser2(user);
System.out.println(result);
}
作用:去除前置空格和结尾空格
使用:有四个属性
prefix:表示整个语句块以prefix值作为前缀
suffix:表示整个语句块,以suffix的值作为后缀
prefixOverrides:表示整个语句块要去除的前缀
suffixOverrides:表示整个语句块要去除的后缀
表示语句必须以(开始,)结束,去除最后的,
<insert id="addUser3">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username!=null and username!=''">
username,
if>
<if test="img!=null and img!=''">
photo,
if>
<if test="pwd!=null and pwd!=''">
password,
if>
trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username!=null and username!=''">
#{username},
if>
<if test="img!=null and img!=''">
#{img},
if>
<if test="pwd!=null and pwd!=''">
#{pwd},
if>
trim>
insert>
@Transactional
@Test
void addUser3() {
String username = "liliu";
String password = "123456";
UserEntity user = new UserEntity();
user.setUsername(username);
user.setPwd(password);
// user.setImg("cat.png");
int result = userMapper.addUser3(user);
System.out.println("添加:" + result);
}
作用:条件查询的时候进行使用
场景:进行列表页的查询,多个非必传参数的处理,解决方案之where标签
用法:会自动去除and前缀,不会自动去除and后缀,有条件自动加上where条件,没有则不加
List<ArticleInfoVO> getListByIdOrTitle(@Param("id") Integer id,
@Param("title") String title);
<select id="getListByIdOrTitle" resultType="com.example.demo.entity.vo.ArticleInfoVO">
select * from articleinfo
<where>
<if test="id!=null and id>0">
id=#{id}
if>
<if test="title!=null and title!=''">
and title like concat('%',#{title},'%')
if>
where>
select>
@Test
void getListByIdOrTitle() {
List<ArticleInfoVO> list = articleMapper.getListByIdOrTitle(1, null);
System.out.println(list.size());
}
作用:进行就修改的时候,去掉最后的逗号,有修改内容就生成set,否则不加
场景:例如修改用户昵称
int updateById(User user);
<update id="updateById" parameterType="org.example.model.User">
update user
<set>
<if test="username != null">
username=#{username},
if>
<if test="password != null">
password=#{password},
if>
<if test="nickname != null">
nickname=#{nickname},
if>
<if test="sex != null">
sex=#{sex},
if>
<if test="birthday != null">
birthday=#{birthday},
if>
<if test="head != null">
head=#{head},
if>
<if test="createTime != null">
create_time=#{createTime},
if>
set>
where id=#{id}
update>
可以在controller层进行控制,必须要有对应的参数不为空,既然来了就必须要改
作用:对集合进行遍历
用法:属性
collection:绑定方法参数的集合
item:遍历时开始的字符串
open:语句块开始的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
加载需要循环的部分上边
场景:批量删除指定id的文章
// 根据文章id集合批量删除文章
int delByIdList(List<Integer> idList);
<delete id="delByIdList">
delete from articleinfo
where id in
<foreach collection="idList" item="aid" open="(" close=")" separator=",">
#{aid}
foreach>
delete>
@Transactional
@Test
void delByIdList() {
List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
int result = articleMapper.delByIdList(idList);
System.out.println("删除条数:" + result);
}
使用场景:数据库表名和实体类中的名字不同,框架不能再自动映射。
需要手动写,自己做映射。映射表和实体类,字段名和属性。(前边是实体类后边是数据库表)
对应的标签resultType改成resultMap
一个xml中可以有多个resultMap
在使用之前需要在springboot项目中添加junit框架
但是一般来说,springboot项目加载后,这个依赖自动就拉去了。
具体使用方法在上边的例子中演示。
开发中只是看一个结果,具体测试会交给测试人员
特点说明: