mybatis动态sql、if、set、choose...when...otherwise、trim代替set、模糊查询、自定义映射关系、一对多,多对一、多表联查

if 判定标签:

<select id="queryUser" resultType="User">
        select * from t_user /*where 1 = 1  恒等式效率较低*/
        /*
            if 判定标签
                test 属性中: 定义判定条件
                     可以直接根据@Param() 中定义的参数名匹配方法的实参
        */
        /*判断用户名是否不为null并且也不为空串 */
        /*
        where:
            如果标签where标签对中存在条件,拼接一个where关键字
            如果标签对中没有条件,就不拼接where关键字
            如果存在条件,会帮你把第一个条件前面的and关键字去掉
        */

        <where>
            <if test="username!=null  and username!=''">
                and  username = #{username}
            </if>

            <if test="password!=null  and password!=0">
                and password = #{password}
            </if>
        </where>
    </select>

set标签:

<!--修改-->
    <!--
        set标签
            1.如果存在条件,就拼接set关键字
            2.如果不存在条件,就不拼接set关键字
            3.如果存在条件,帮你删除最后一个条件的,

    -->
    <update id="updateUser">
            update t_user
                <set>
                    id = #{id}
                    <if test="username != '' and username != null">
                        username = #{username},
                    </if>
                    <if test="password != 0 and password != null">
                        password = #{password},
                    </if>
                </set>
                where id = #{id}
    </update>

choose...when...otherwise:

<update id="updateUser2">
        update t_user
        <set>
            <choose>  <!--switch-->
                <when test="username != '' and username != null"> <!--case-->
                    username = #{username},
                </when>
                <when test="password != 0 and password != null">
                    password = #{password},
                </when>
                <otherwise>  <!--default-->
                    id = #{id}
                </otherwise>
            </choose>
        </set>

        where id = #{id}
    </update>

trim代替set:

<update id="updateUser3">
        update t_user
        <trim prefix="set" suffixOverrides=",">
            <choose>  <!--switch-->
                <when test="username != '' and username != null"> <!--case-->
                    username = #{username},
                </when>
                <when test="password != 0 and password != null">
                    password = #{password},
                </when>
                <otherwise>  <!--default-->
                    id = #{id}
                </otherwise>
            </choose>
        </trim>

        where id = #{id}
    </update>

模糊查询:

<!--根据用户名模糊查询用户信息-->
    <select id="queryUserByNameLike" parameterType="string" resultType="user">
      <!--select * from t_user where username like  '%'|| #{str} ||'%'-->
        <bind name="str" value="'%' + str + '%'" />
        select * from t_user where username like  #{str}
    </select>

自定义映射关系:

<!--自定义映射关系-->
    <resultMap id="myResultMap" type="Emp">
        <!--主键字段-->
        <id column="empno" property="no"></id>
        <!--非主键字段-->
        <result column="ename" property="name"></result>
    </resultMap>

    <select id="queryAll" resultType="emp" resultMap="myResultMap">
       <!-- select  empno no,ename name,job,mgr,sal,comm,hiredate,deptno from emp-->
        select  empno,ename,job,mgr,sal,comm,hiredate,deptno from emp
    </select>
/*
        查询用户信息
            查询所有得到用户信息
            根据用户名查询
            根据用户密码
            根据用户名和用户密码同时查询用户信息
     */
    public List<User> queryUser(@Param("username") String username,@Param("password") Integer password);

    /*
        修改数据根据id修改用户数据
            根据id修改用户名
            修改用密码
            修改用户名和用户密码
     */
    int updateUser(@Param("id")Integer id,@Param("username")  String username,@Param("password") Integer password);

    /*
        修改数据
            根据id修改用户数据
            如果存在用户名就根据修改用户名
            用户名不存在,就修改用户密码
            两个都不存在就不修改
     */
    int updateUser2(@Param("id")Integer id,@Param("username")  String username,@Param("password") Integer password);
    int updateUser3(@Param("id")Integer id,@Param("username")  String username,@Param("password") Integer password);

    // 根据用户名模糊查询用户信息
    public List<User> queryUserByNameLike(@Param("str") String str);

 多表联查:

关系映射查询
    多表联查: 1) 中间类  2) resultMap
        一对一|多对一  : 查询所有的学生信息以及所在的班级信息
            代码: 一端类中存在另一个类型的成员  学生类中存在班级类型的成员  |  员工类型中存在部门类型的成员  多的一方存在一的一方的成员
            resultMap
        一对多 : 查询所有的班级以及班级中的学生信息
            代码: 在一的一方存在多的一方的List集合  班级类中存在一个成员List<学生>
            resultMap
private Dept dept;
public Dept getDept() {
    return dept;
}
public void setDept(Dept dept) {
    this.dept = dept;
}

 

<!--自定义映射关系 : resultMap手动映射  所有的属性与字段都需要手动设置关联关系-->
    <resultMap id="myResultMap" type="Emp">
        <!--主键字段-->
        <id column="empno" property="empno"/>
        <!--非主键字段-->
        <result column="ename" property="ename"/>
        <result column="job" property="job"/>
        <result column="sal" property="sal"/>
        <result column="comm" property="comm"/>
        <result column="mgr" property="mgr"/>
        <result column="hiredate" property="hiredate"/>
        <result column="deptno" property="deptno"/>
        <!--属性为自定义引用数据类型的关联设置-->
        <association property="dept" javaType="Dept">
            <id column="deptno" property="deptno"/>
            <result column="dname" property="dname"/>
            <result column="loc" property="loc"/>
        </association>
    </resultMap>

 

<select id="queryAll" resultType="emp" resultMap="myResultMap">
        select  empno,ename,job,mgr,sal,comm,hiredate,emp.deptno,dname,loc from emp left join dept on emp.deptno = dept.deptno
</select>

 

热门文章

暂无图片
编程学习 ·

论怂

从心为怂&#xff0c;世人的误解 老祖宗还是有智慧的&#xff0c;这不是个肯定句。这是个判断语句&#xff0c;if you want to follow your heart,you should be 怂
暂无图片
编程学习 ·

面试总结

面试总结 1.面试以项目为开始展开&#xff0c;不断深入&#xff0c;从项目的背景一直介绍到项目用到的技术原理。会不断的问为什么 2.考察底层原理 3.语言表达能力很重要&#xff0c;需要把原理背景说清楚 下面是题目&#xff0c;欢迎大家把想到的答案写在评论区一起讨论 题目&…
暂无图片
编程学习 ·

Windows安装redis

Windows安装redis 可以到https://github.com/microsoftarchive/redis/releases下载最新的windows版本 双击 redis-server 就会安装默认配置启动redis服务 这样就说明在windows下启动redis成功了&#xff0c;端口号是6379
暂无图片
编程学习 ·

Victor CMS 未授权sql注入(CVE-2020-29280)漏洞复现

0X00简介 The Victor CMS v1.0版本存在安全漏洞&#xff0c;该漏洞源于通过search.php页面上的“search”参数造成的。 0X01影响范围 The Victor CMS v1.0 0X02漏洞复现 在search.php中search参数未经过滤就直接和sql语句拼接导致sql注入漏洞 1.访问首页点击搜索框&#x…
暂无图片
编程学习 ·

从根本上把握防护DDoS的核心要素,不怕DDoS攻击防不住

随着互联网技术的广泛应用和飞速发展&#xff0c;DDoS流量攻击案件频发&#xff0c;网站防护DDoS变得越来越重要&#xff0c;只有采取有效的网站安全防护措施&#xff0c;才能够更好的防御黑客的攻击。 近日&#xff0c;公安部的微信公众号发布了一则重要提醒&#xff1a;你常…
暂无图片
编程学习 ·

211本,字节视频1面凉凉,三天后,却收到了美团offer?

写在开头 2020年的开端&#xff0c;似乎并不那么幸运&#xff0c;新冠肺炎的出现&#xff0c;对我们的生活、工作和学习都造成了非常大的影响&#xff0c;很多公司延期返工了&#xff0c;原本的金三银四似乎也不会如往年那般热闹&#xff0c;但这并不意味着我们就什么都不去做…
暂无图片
编程学习 ·

12.13补课周

记录2leetcode 104 递归 非递归的栈的还不会写 思路 利用DFS,深度递归&#xff1b;总深度为左石子树最大深度加1; 空树深度为0&#xff61; 代码 // An highlighted block /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode l…
暂无图片
编程学习 ·

程序猿小白艰辛学习的第三天

变量的三大组成部分 变量名&#xff1a;用来找值 赋值符号&#xff1a;将变量值的内存地址绑定给变量名 变量值&#xff1a;记录的事物的状态&#xff0c;也就是我们存储的数据 引用 print&#xff08;变量名&#xff09;运行会显示出变量值 变量名 变量名的命名应该遵循见名…
暂无图片
编程学习 ·

2020-12-17

显示如下问题&#xff1a;、Android studio No Debuggable Processes 解决方法&#xff1a;选中 Run->Debug 重新Debug编译运行就可以了。
暂无图片
编程学习 ·

大数据与云计算

大数据与云计算什么是云计算&#xff1f;云计算包含哪些关键技术&#xff1f;云计算有哪些特点&#xff1f;IaaS、PaaS、SaaS是什么&#xff1f;基础设施即服务IaaSIaaS的特点平台即服务PaaSPaaS的特点PaaS的作用软件即服务SaaSSaaS的特性云计算的基础设施和功能云计算的基础设…
暂无图片
编程学习 ·

TinyML-TVM是如何驯服Tiny的(下)

TinyML-TVM是如何驯服Tiny的&#xff08;下&#xff09; Lazy Execution 实际上&#xff0c;随着通信开销开始占主导地位&#xff0c;一旦用户请求&#xff0c;就执行算子的开销变得非常昂贵。可以通过延迟评估直到用户需要调用的结果来提高系统的吞吐量。 从实现的角度来看&a…
暂无图片
编程学习 ·

航次总结2020年7月

航次结束了快2个月&#xff0c;一直没有时间写本航次的总结&#xff0c;主要原因是自己承担的任务要验收&#xff0c;费了好大的劲&#xff0c;才将数据处理成验收单位所需要的&#xff0c;所幸现在应该是没有问题了&#xff0c;符合专项的要求了。航次期间&#xff0c;由于还有…
暂无图片
编程学习 ·

png是什么格式?

png是一种采用无损压缩算法的位图格式。PNG格式有8位、24位、32位三种形式&#xff0c;其中8位PNG支持两种不同的透明形式&#xff0c;24位PNG不支持透明&#xff0c;32位PNG在24位基础上增加了8位透明通道&#xff0c;因此可展现256级透明程度。 png是一种采用无损压缩算法的位…
暂无图片
编程学习 ·

aop 的使用

aop有两种方式&#xff0c;一个是注解&#xff0c;另外一个是配置xml 1、注解的方式&#xff1a; a、和xml一样&#xff0c;首先得有个配置&#xff0c;如果是springboot&#xff0c;写个配置类&#xff1a; Configuration EnableAspectJAutoProxy ComponentScan("xxx.…
暂无图片
编程学习 ·

python制作命令行工具——fire

一、快速介绍 来一波官方介绍。 Python Fire是一个库&#xff0c;用于从任何Python对象自动生成命令行接口。是用python创建CLI的一种简单方法。是开发和调试Python代码的一个有用工具。Python Fire帮助探索现有代码或将其他人的代码转换为CLI。使得Bash和Python之间的转换更…