-
XML映射文件名称与Mapper接口名称保持一致,并且将XML映射文件与Mapper接口放置在相同包下
-
XML映射文件的namespace属性为Mapper接口权限定名一致
-
XLM映射文件中的sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
配置XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ming.mapper.UserMapper">
<!-- resultType是返回单条值的类型-->
<select id="selectlist" resultType="com.ming.pojo.User">
select * from tb_emp where name like concat('%',#{name},'%') and gender= #{gender}
and entrydate between #{begin} and #{end} order by update_time desc
</select>
</mapper>
前面的框架是在mybatis中文网上复制的
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
然后我们只需要在UserMapper中写如下代码就行
public List<User> selectlist(@Param("name") String name, @Param("gender") short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);
mapper namespace中的对应的是接口中的MapperUser
在Marketplace下载配置MyBatisx插件

动态SQL
<if>
<if>:用于判断条件是否成立,使用test属性进行条件判断,如果为true,则拼接SQL (test里面写对应的变量名)
例如
在xml文件中写如下代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ming.mapper.UserMapper">
<!-- resultType是返回单条值的类型-->
<select id="selectlist" resultType="com.ming.pojo.User">
select *
from tb_emp
where
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender!=0">
and gender = #{gender}
</if>
<if test="begin != null and end!=null">
and entrydate between #{begin} and #{end}
</if>
order by update_time desc
</select>
</mapper>
在UserMapper接口中写如下代码
public List<User> selectlist(@Param("name") String name, @Param("gender") short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);
然后在测试类中写如下代码
@Test
void testList2() {
List<User> list = userMapper.selectlist("张", (short) 0, null, null);
System.out.println(list);
}
让它查询姓张是用户 查询成功

但是让它查询性别为1 的用户时就产生了报错因为多了一个and

我们就需要学习新的关键字<where>
<where>
当我将判断语句包含在where里面的时候 where会自动帮我们判断 如果都为false 则不会生成where 如果有一个true where就会生成 且会将第一个判断语句的and /or 自动去掉
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ming.mapper.UserMapper">
<!-- resultType是返回单条值的类型-->
<select id="selectlist" resultType="com.ming.pojo.User">
select *
from tb_emp
<where>
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender!=0">
and gender = #{gender}
</if>
<if test="begin != null and end!=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
</mapper>
用动态SQL完成动态更新
UserMapper代码
public void update2(User user);
XML代码
<update id="update2">
update tb_emp
set
<if test="username !=null">username=#{username},</if>
<if test="name !=null">name=#{name},</if>
<if test="gender !=null">gender =#{gender},</if>
<if test="imge !=null">image=#{imge},</if>
<if test="job !=null">job=#{job},</if>
<if test="entrydate !=null">entrydate=#{entrydate},</if>
<if test="depId !=null">dept_id=#{depId},</if>
<if test="updateTime !=null">update_time=#{updateTime}</if>
where id = #{id}
</update>
test类的代码
@Test
public void update2() {
User user = new User();
user.setId(18);
user.setUsername("zhangsan01");
user.setName("张三01");
user.setImge("18.jpg");
user.setDepId(2);
userMapper.update(user);

注意 对于if语句里面如果第一句有,的话是会报错的 此时我们需要将代码放在<set>语句里面 可以将第一句最后 的,自动取消
<foreach>遍历
<foreach collection="" item="" separator="," open="(" close=")"> #{id}</foreach>
-- collection要遍历的集合-- item 遍历出来的元素-- separator 分割符-- open 遍历开始前拼接的SQL片段-- close 遍历开始前拼接的SQL片段
例如
UserMapper中的代码
public void deletesome(List<Integer> list);
UserMapper.XML中的代码
<delete id="deletesome">
-- collection要遍历的集合
-- item 遍历出来的元素
-- separator 分割符
-- open 遍历开始前拼接的SQL片段
-- close 遍历开始前拼接的SQL片段
delete from tb_emp where id in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
测试类中的代码
@Test
public void deletesom(){
List<Integer> integers = new ArrayList<>();
userMapper.deletesome(integers);
}
<sql>和<include>
<sql>:定义可重用的SQL片段
<include>:通过属性refid ,指定sql片段
UserMapper类的代码
public void selectall(Integer id);
通过sql的id定义唯一的标签名 然后在include的refid中引用标签名
<sql id="allSelect">
select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp
</sql>
<select id="selectall" resultType="com.ming.pojo.User">
<include refid="allSelect"/>
where id= #{id}
</select>
在测试类中写如下代码
@Test
public void selectall(){
userMapper.selectall(12);
}