-
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); }