XML映射文件

  1. XML映射文件名称与Mapper接口名称保持一致,并且将XML映射文件与Mapper接口放置在相同包下

  2. XML映射文件的namespace属性为Mapper接口权限定名一致

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

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值