一个好的好的sql能省很多逻辑代码,最开始的做手中的的代码时,老是习惯的本着面向过程书写代码,一行一行代码的敲,判断来判断去,如果这个成功就执行这个,反之在进行一个新得逻辑,但java这门语言主打的就是面向对象,好多东西封装好了我们用就行了,简单的东西千万别复杂化了,java可以说用到老学到老,你不学,也不用,你就会被时代抛弃,数数大家都会,但是java就好比你要学会加减,在后面你要学乘除,在后面你要学方程等等,你需要知道1+1=2吗?,你不需要!你只需要会套公式用就行了,如果你只停留在数数的层次早晚会被淘汰,让你套个公式(框架)都不会用,那只能给这行说再见了。

下面这段sql,三表联查,非空判断条件查询,resultMap的映射

<resultMap id="PackScannerResult" type="PackScanner" ><id     property="scannerId"       column="scanner_id"        /><result property="scannerCode"     column="scanner_code"      /><result property="status"       column="status"         /><result property="createTime"   column="create_time"    /><result property="updateTime"   column="update_time"    /><result property="remark"       column="remark"         /><association property="packPosition" javaType="PackPosition"><id property="positionId" column="position_id"/><result property="positionName" column="position_name" /></association></resultMap><sql id="selectPackScanner">select s.scanner_id, s.scanner_code, s.update_time, s.create_time,s.del_flag, s.status, s.remark,pc.position_namefrom pack_scanner s</sql><select id="selectScannerList" parameterType="PackScanner" resultMap="PackScannerResult"><include refid="selectPackScanner"/>LEFT JOIN pack_position_scanner pa ON s.`scanner_id`=pa.`scanner_id`LEFT JOIN pack_position pc ON pa.`position_id`= pc.`position_id`where s.del_flag = '0'<if test="scannerCode != null and scannerCode != ''">AND s.scanner_code like concat('%', #{scannerCode}, '%')</if><if test="status != null and status != ''">AND s.status = #{status}</if><if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->and date_format(s.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')</if><if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->and date_format(s.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')</if><if test="packPosition.positionName != null and packPosition.positionName != ''">and position_name LIKE concat('%', #{packPosition.positionName}, '%')</if></select>

(1)左外连接,LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL,ON 为条件查询条件。

SELECT s.StudentId,s.StudentName,sc.ClassName
FROM student s
LEFT JOIN student_class_code scc
ON s.StudentId = scc.StudentID
LEFT JOIN student_class sc
ON scc.ClassId= sc.ClassId

通过上图得知我们通过两次左外连接拿到了C表的全部数据,你在有一张表仍然可以在拼接条件进行查询,注意如果左边关联的右表对应仪表不存在右边置空,右外连接和隐式内连接大差不差

(2)配置resultMap标签,映射不同的字段和属性名,如果你查询的结果对象中有一个非基本类型(集合或者对象集合),这时你就需要用到resultMap标签

<!-- 查询的所有数据 -->
<!-- resultMap最终还是要将结果对象上,type映射指定到这个对象上 -->
<resultMap id="PackScannerResult" type="PackScanner" ><!-- 定义普通属性 --><id     property="scannerId"       column="scanner_id"        /><result property="scannerCode"     column="scanner_code"      /><result property="status"       column="status"         /><result property="createTime"   column="create_time"    /><result property="updateTime"   column="update_time"    /><result property="remark"       column="remark"         /><!-- association :对象属性标签,他里面包括普通属性 --><!-- property:PackScanner对象里面的PackPosition对象属性名 --><!-- javaType:属性类型 --><association property="packPosition" javaType="PackPosition"><!-- property:主键在pojo中的属性名 --><!-- column:主键在数据库中的列名 --两者一一对应映射 --><id property="positionId" column="position_id"/><result property="positionName" column="position_name" /></association>
</resultMap><sql id="selectPackScanner">select s.scanner_id, s.scanner_code, s.update_time, s.create_time,s.del_flag, s.status, s.remark,pc.position_namefrom pack_scanner s</sql><!-- resultMap=必须对应resultMap标签的id的值 --><select id="selectScannerList" parameterType="PackScanner" resultMap="PackScannerResult"><include refid="selectPackScanner"/>LEFT JOIN pack_position_scanner pa ON s.`scanner_id`=pa.`scanner_id`LEFT JOIN pack_position pc ON pa.`position_id`= pc.`position_id`where s.del_flag = '0'</select>

工作心得:mysql之手写sql相关推荐

  1. 精读《手写 SQL 编译器 - 文法介绍》

    1 引言 文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语.英语上. 2 精读 我们将一块语法规则称为 产生式,使用 "Left → Right" 表示任意产生 ...

  2. 用了MybatisPlus后,我很久没有手写sql了

    (一)前言 最早写JDBC的时候,要手动配连接信息,要一条条手写sql语句.后来Mybatis出现了,不需要再手动配置连接信息,sql语句也和代码隔离开来,但是还免不了写Sql.接着出现了Mybati ...

  3. 71.精读《手写 SQL 编译器 - 错误提示》

    1 引言 编译器除了生成语法树之外,还要在输入出现错误时给出恰当的提示. 比如当用户输入 select (name,这是个未完成的 SQL 语句,我们的目标是提示出这个语句未完成,并给出后续的建议:  ...

  4. 精读《手写 SQL 编译器 - 错误提示》

    1 引言 编译器除了生成语法树之外,还要在输入出现错误时给出恰当的提示. 比如当用户输入 select (name,这是个未完成的 SQL 语句,我们的目标是提示出这个语句未完成,并给出后续的建议: ...

  5. 精读《手写 SQL 编译器 - 回溯》

    摘要: 1 引言 上回 精读<手写 SQL 编译器 - 语法分析> 说到了如何利用 Js 函数实现语法分析时,留下了一个回溯问题,也就是存档.读档问题. 我们把语法分析树当作一个迷宫,有直 ...

  6. 精读《手写 SQL 编译器 - 性能优化之缓存》

    1 引言 重回 "手写 SQL 编辑器" 系列.这次介绍如何利用缓存优化编译器执行性能. 可以利用 Frist 集 与 Match 节点缓存 这两种方式优化. 本文会用到一些图做解 ...

  7. 手写sql语句面试题

    手写sql语句面试题 一.数据表 二.简单查询 1.查询姓名中带"猴"的学生名单 三.汇总分析 1.查询选了课程的学生人数 2.查询各科成绩最高和最低的分, 以如下的形式显示:课程 ...

  8. mysql事务手写笔记_兴奋了!阿里技术官手写“MySQL笔记”,传授你年薪百万级干货...

    前言 MySQL重要吗?重要!为什么重要?因为它在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的.My ...

  9. mysql笔记手写_MySQL 笔记(一)

    VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串.其中M代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串 ...

最新文章

  1. centos6重启网络命令_虚拟机-linux系统中图形界面和命令行界面切换
  2. 【知乎热议】如何看待swin transformer成为ICCV2021的 best paper?
  3. 合成孔径雷达技术——概述
  4. QT的QStandardItemEditorCreator类的使用
  5. java文件名大小_java 比较指定文件夹内.txt文件名的大小
  6. 基于spring boot 的ssm项目的简单配置
  7. 嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
  8. Castor xsd生成java_java – Castor可以处理从基础XSD导入的多个XSD生成类吗?
  9. UnityEngine.UI.dll is in timestamps but is not known in assetdatabase
  10. MySQL sleep函数使用详解
  11. brew 无法安装iterm2_MAC 安装OhMyZsh问题记录
  12. 使用python+机器学习方法进行情感分析(详细步骤)
  13. Pytorch——保存训练好的模型参数
  14. jmeter常用功能
  15. python学习day35 并发编程 操作系统 进程概念
  16. 从运行原理及使用场景看Apache和Nginx
  17. matlab 距平,[转载]基于Matlab软件进行EOF分解、回归趋势分析,并
  18. 监考噩梦!!!(线上考试)
  19. 短线交易秘诀---大小价格区间,开盘价,价格爆炸点
  20. Viddy排名App Store免费应用第二,力压InstagramDraw Sth

热门文章

  1. 报复性汉语6级试卷 ,我笑抽了!老外瞪眼了!
  2. Ubuntu20.04突然无法打开蓝牙
  3. CSS3 Transitions, Transforms和Animation使用简介与应用展示
  4. 供应商评估:关键标准以及如何执行
  5. uniapp开发小程序map上添加搜索框
  6. 大数据时代,准备好了吗?
  7. 经典文献阅读之--OV2SLAM(高速视觉slam)
  8. XChat-GNOME:用于 GNOME 桌面的 IRC 谈天软件
  9. 基于Python语言使用RabbitMQ消息队列(三)
  10. VSCODE+PLANTUML