动态SQL 模糊查询 联表查询

news/2024/12/23 4:08:04/

1. 正文

  • 1. set标签 和 foreach标签 trim标签 sql片段
  • 2. mybatis映射文件处理特殊字符.
  • 3. mybatis完成模糊查询。
  • 4. 联表查询

2. 动态sql
2.1 set标签
这个配合if标签一起用,一般用在修改语句。如果传递的参数值为null,那么应该不修改该列的值。

<!--set:可以帮我们生成关键字 set 并且可以去除最后一个逗号-->


    <update id="update">
          update account
          <set>
             <if test="name!=null and name!=''">
                name=#{name},
             </if>
             <if test="money!=null">
                money=#{money},
             </if>
             <if test="isdeleted!=null">
                 isdeleted=#{isdeleted},
             </if>
             <if test="created!=null">
                  created=#{created},
             </if>
             <if test="updated!=null">
                  updated=#{updated},
             </if>
          </set>
          where id=#{id}
    </update>


2.2 foreach标签
循环标签.

查询:

<!-- select * from account where id in(2,3,5,7,0)
        如果你使用的为数组array  如果你使用的为集合 那么就用list
        collection:类型
        item:数组中每个元素赋值的变量名
        open: 以谁开始
        close:以谁结束
        separator:分割符
    -->
    <select id="findByIds" resultType="com.zjh.entity.Account">
        select * from account where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
             #{id}
        </foreach>
    </select>
删除:

 <delete id="batchDelete">
        <foreach collection="array" item="id" open="delete from account where  id in(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
添加:

insert into account(name,isdeleted) values('ldh',0),('ldh2',0),('ldh4',0)
    <insert id="saveBatch">
        insert into account(name,isdeleted) values
        <foreach collection="list" item="acc" separator=",">
            (#{acc.name},#{acc.isdeleted})
        </foreach>
    </insert>

2.3 sql片段
在执行查询语句时不建议大家使用select *, 建议大家把查询的列写出。 

3. mybatis映射文件处理特殊字符.

 <!--
       第一种:转义标签 &nbsp; &lt;  
       第二种: <![CDATA[sql]]>
    -->
    <select id="findByMaxMin" resultType="com.zjh.entity.Account">
           <![CDATA[select * from account where id >#{min} and id <#{max}]]>
    </select>

4. mybatis完成模糊查询。
select * from 表名 where 列名 like '%a%' 

(1)使用字符串函数 完成拼接 concat

<select id="findByLike" resultType="com.zjh.entity.Account">
   select * from account where name like concat('%',#{name},'%')
</select>

(2) 使用${} 

<select id="findByLike" resultType="com.zjh.entity.Account">
   select * from account where name like '%${name}%'
</select>

通过观察: 发现使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement. 

总结:

动态sql标签: if where (choose when otherwise) set foreach sql 处理特殊字符: <![CDATA[sql]]> 转义符 模糊查询: concat('',#{},'')   ${}

5. 联表查询
多对一 : 从多的一方来查询一的一方。

班级表:

|1-n

学生表:

根据学生id查询学生信息并携带班级信息。

select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1

实体类:

package com.zjh.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: jh
 * @create: 2022/6/2
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private Integer classId;

    private Clazz clazz;//学生所属的班级
}
//如何把联表查询体现到实体类上。
package com.zjh.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: jh
 * @create: 2022/6/2
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
    private Integer cid;
    private String cname;

}

xml:

<resultMap id="baseMap" type="com.zjh.entity.Student">
            <id column="stu_id" property="id"/>
            <result column="stu_name" property="name"/>
            <result column="stu_age" property="age"/>
            <result column="sex" property="sex"/>
            <result column="class_id" property="classId"/>
            <!--association: 表示一的一方
                 property: 它表示属性名
                 javaType: 该属性名对应的数据类型
            -->
            <association property="clazz" javaType="com.zjh.entity.Clazz">
                <id column="cid" property="cid"/>
                <result column="cname" property="cname"/>
            </association>
    </resultMap>
    <select id="findStudentById" resultMap="baseMap">
         select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}
    </select>

上面你要是绝的没有懂,那么这里可以使用的一个笨的方式: 但是不推荐。

返回类型就用map封装

//根据学生编号查询学员信息以及班级信息
 public Map findById(Integer id);


 
 
<!--key:value-->
    <select id="findById" resultType="java.util.Map">
        select <include refid="aa"/> from tb_stu s join tb_class c on s.class_id=c.id where s.id=#{id}
    </select>
 


http://www.ppmy.cn/news/5239.html

相关文章

华为云APIArts:API全生命周期一体化解决方案,帮助您端到端呵护您的API

摘要&#xff1a;华为云API Arts是API设计、API开发、API测试、API托管、API运维、API变现一体化协作平台&#xff0c;通过维护API各开发阶段数据高度一致&#xff0c;支持开发者高效实现API全流程一站式体验。 伴随数字化浪潮的到来&#xff0c;应用编程接口(API)已经成为一个…

时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00

如果说电子游戏是第九艺术&#xff0c;那么&#xff0c;编程技术则配得上第十艺术的雅称。艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受&#xff0c;而Matz的Ruby语言则正是这样一件艺术品。 无论是语法还是理念&#xff0c;都让Ruby开发者感受到款待&#xff0…

【Django】第二课 银行账户管理系统开发

概念 本文在上一篇文章基础之前进行构建和完善 账户信息的分页显示 用户通过点击首页的“查询账户”&#xff0c;进入账户信息查询页面 则点击该按钮触发点击事件&#xff0c;向django服务器发出请求 接着我们在urls.py中需要定义与该地址进行匹配的地址&#xff0c;并匹配后…

【Python机器学习】神经网络中常用激活函数、损失函数、优化方法(图文解释 附源码)

下面以经典的分类任务&#xff1a;MNIST手写数字识别&#xff0c;采用全连接层神经网络 MNIST数据集是一个手写体的数字图片集&#xff0c;它包含有训练集和测试集&#xff0c;由250个人手写的数字构成。训练集包含60000个样本&#xff0c;测试集包含10000个样本。每个样本包括…

iOS的启动优化

应用的启动优化 当我们参与到大型应用的时候 会遇到一些启动时间过长的情况 这时候就需要使用到相关的操作。 总结来说&#xff0c;main()方法调用前&#xff0c;启动过程大体分为如下步骤&#xff1a; 先是LLVM把项目翻译成IR文件然后到backend LLVM clang pre-main main …

基础背包问题--0 1背包与完全背包

&#x1f389;&#x1f389;&#x1f389;写在前面&#xff1a; 博主主页&#xff1a;&#x1f339;&#x1f339;&#x1f339;戳一戳&#xff0c;欢迎大佬指点&#xff01; 目标梦想&#xff1a;进大厂&#xff0c;立志成为一个牛掰的Java程序猿&#xff0c;虽然现在还是一个…

Nature Communications:人类丘脑的基因结构及其与十种常见大脑疾病的重叠

丘脑是位于大脑中心的重要交流中枢&#xff0c;由不同的核组成&#xff0c;对意识和高级皮层功能至关重要。丘脑结构和功能的改变涉及到常见的大脑疾病的发病机制&#xff0c;但丘脑的遗传结构仍然很大程度上未知。在这里&#xff0c;使用来自30114个个体的大脑扫描和基因型数据…

Fabric.js 修改画布交互方式到底有什么用?

本文简介 点赞 关注 收藏 学会了 fabric.js 为我们提供了很多厉害的方法。今天要搞明白的一个东西是 canvas.interactive 。 官方文档对 canvas.interactive 的解释是&#xff1a; Indicates that canvas is interactive. This property should not be changed. canvas.in…