前言
花了一点时间整理了SQL的一些查询操作,包括分组查询、排序查询、case函数、自连接、内连接、外连接等,结合Mybatis完成了一个个的案例。
一、建立数据库
该数据库包含五张表,每张表都有多个字段,博主已经上传了数据库的相关资源。在正式开始前,博主需要交代几点。在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认地先将查询完成后返回的值放入一个HashMap中(如果返回的值不止一条,就会放入一个包含HashMap的list集合中)。指定与不指定的区别在于,如果你指定了返回类型,mybatis将会根据返回类型的实体类来从HashMap中获取值并set到这个实体类中。如果不指定就默认返回HashMap(List>)。在查询时,你是否遇到查询表中的某些字段,会显示该表的所有信息?如何输出特定字段呢?大概有三种方法:
1、创建一些自己要用到的实体类,类中写自己要输出的字段,对应好即可
2、如果嫌写实体类麻烦,也可以不写,不写实体类系统就会自动创建HashMap来为你封装数据,我们就直接拿到这个map就可以了,可以用List>这种通用对象来接收Mybatis的查询结果。这种方法可以偷懒,我就是用这种方法偷的懒,但在博主实践的过程中,字段为null的时候好像不会输出,所以不是很推荐。这种不用写实体类的SQL操作,适用于字段和表名都是程序运行时产生的,实际上很多灵活性和扩展性要求比较高的应用,表的结构不能够确定,甚至连表名字都不确定,所以SQL语句和实体类映射字段不能被写死。
3、Mybatis plus提供了条件构造器,其中的queryWrapper可以实现查找指定字段。
二、案例实战
注:因为mysql不区分字段大小写,所以字段名往往会带下划线,如果要将数据库字段名与实体类对应上就需要在mybatis配置文件中开启驼峰命名
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
1、查询工资在10000到20000之间的员工名、工资以及奖金,并按工资从高到低排序
List<Map<Object, Object>> querySalary();
<select id="querySalary" resultType="map"> select first_name, salary, commission_pct from myemployees.employees where salary between 10000 and 20000 order by salary desc </select>
结果: 从结果就可以看出来用List>的弊端了,没有奖金的员工不显示出他的奖金率。
2、 查询员工号为176的员工的姓名和部门号和年薪
Map<Object, Object> queryByID(@Param("id") int employee_id);
<select id="queryByID" resultType="map"> SELECT CONCAT(first_name,last_name) 姓名, department_id 部门号, salary * 12 * (1 + IFNULL(commission_pct, 0)) 年薪 FROM myemployees.employees WHERE employee_id = #{id}; </select>
结果:
3、查询没有奖金,且工资小于18000员工的salary,first_name,并按工资从高到低排序
注:Mybatis中使用小于号需要用转义字符,"<","<"
<select id="queryNoPct" resultType="map"> select first_name 名字,salary 薪水 from myemployees.employees where commission_pct is null and salary <18000 order by salary desc </select>
结果:
4、案例如下:/*现公司出台一个政策,即要给员工的工资进行一个评级,评级状况如下:
* 工资大于20000的,评级为A级别
* 工资大于15000的,评级为B级别
* 工资大于10000的,评级为C级别
* 工资小于10000的,均评级为D级别
* 要求:输出员工的姓名,工资和工资评级状况,按工资高到低输出
* */
<select id="queryByRank" resultType="map"> select CONCAT(first_name,' ',last_name) 姓名,salary 工资, CASE when salary>20000 then 'A级别' when salary>15000 then 'B级别' when salary>10000 then 'C级别' else 'D级别' end as 工资级别 from myemployees.employees order by salary desc </select>
结果: 107条记录还是挺多的哈,截不全请见谅!