一、实现只有一个列但多行的查询结果,实现只有一个列且只有一行的查询结果。
实现代码
查找姓名,并返回一个字符串集合
<select id="getEmpNames" resultType="STRING">
select ename from emp
</select>
查找入职日期,并返回一个日期集合
<select id="getEmpHiredates" resultType="java.util.Date">
select hiredate from emp
</select>
运行截图
二、使用新定义TO对象接收多列查询结果,使用Map集合接收多列查询结果
实现代码
查找姓名,日期并存入新定义的EnameAndYear对象
<select id="getEnameAndHiredateYear" resultType="EnameAndYear">
SELECT ename,YEAR(hiredate) AS YEAR FROM emp
</select>
EnameAndYear对象类
public class EnameAndYear {
private String ename;
private Integer year;
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
@Override
public String toString() {
return "EnameAndYear{" +
"ename='" + ename + '\'' +
", year=" + year +
'}';
}
}
查询姓名,工资和津贴的总和,返回一个map集合,注意如果工资和津贴有一个为null的情况下需要使用ifnull()函数
<select id="getEnameAndToal" resultType="MAP">
SELECT ename,sal+IFNULL(comm,0) AS total FROM emp
</select>
运行截图
三、在查询中使用一个列作为查询条件结果封装为实体类
实现代码
查询薪水大于传入参数的所有信息
<select id="queryEmpBySal" resultType="Emp" parameterType="FLOAT">
select * from emp where sal > #{sal}
</select>
查询名字含有参数的所有信息
<select id="queryEmpByEnameLike" resultType="Emp" parameterType="STRING">
select * from emp where ename like #{n}
</select>
运行截图
四、在查询中用新定义TO对象作为参数实现多条件查询,在查询中使用Map集合作为参数实现多列条件查询
实现代码
将查询条件封装成JobAndSal对象查询工作为job,且薪水大于sal的所有信息,返回一个emp数组
<select id="queryByJobAndSal" resultType="Emp" parameterType="JobAndSal">
select * from emp where job = #{job} and sal>#{sal}
</select>
JobAndSal实现类
public class JobAndSal {
private String job;
private Float sal;
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Float getSal() {
return sal;
}
public void setSal(Float sal) {
this.sal = sal;
}
}
将查询条件封装为map查询名字含有n,且入职日期大于date的所有信息返回值为emp集合
<select id="queryByEnameLikeAndHiredate" resultType="Emp" parameterType="MAP">
<!-- 要保证调用方法时传入的map里 一定有 n date 两个key -->
select * from emp where ename like #{n} and hiredate>#{date}
</select>
运行截图
五、实现一次包含 连接 聚合分组 的查询(可以再包含子查询)
实现代码
通过两个有外键约束的表进行查询,查询每个部门的部门名和平均薪资,返回值为map集合
<select id="queryDnameAndAvgSal" resultType="Map">
SELECT dname,AVG(sal) AS avgsal FROM emp e,dept d WHERE e.deptno = d.deptno GROUP BY dname HAVING AVG(sal)>5000
</select>
运行截图
六、使用实体类作为查询条件实现动态查询,有设置属性的添加为查询条件
实现代码
传入一个emp对象作为参数,通过emp中包含的属性进行动态查询,如果没有设置该属性则不会动态生成有关此属性的查询语句(if标签为不满足test里的条件则不生成,where标签会结合if自动生成where...条件语句)
<select id="queryEmpByEmpDynamic" parameterType="Emp" resultType="Emp">
select * from emp
<where>
<if test="empno != null">
and empno = #{empno}
</if>
<if test="ename != null">
and ename like #{ename}
</if>
<if test="job != null">
and job = #{job}
</if>
<if test="mgr != null and mgr != 0">
and mgr = #{mgr}
</if>
<if test="sal != null and sal > 0">
and sal > #{sal}
</if>
</where>
</select>
(choose语句会优先判断前一个 when中的test是否成立,如果成立则以第一个when中的条件进行查询,如不成立则使用otherwise中的条件进行查询)
<select id="queryEmpByJobOrMgr" parameterType="Emp" resultType="Emp">
select * from emp
<where>
<choose>
<when test="job!=null">
and job = #{job}
</when>
<otherwise>
and mgr = #{mgr}
</otherwise>
</choose>
</where>
</select>
运行截图
七、使用${} 实现 排序查询,排序列与升降序方式可变
实现代码
#{} 是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的
set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。
${}使用在orderby 后,表示查询列约束以及 asc(升序排列) 或者desc(降序排列)
#{}使用范围比${}更大,一般能使用#{}的地方${}也能使用
<select id="queryEmpUseOrderBy" resultType="Emp" parameterType="MAP">
select * from emp order by ${column_name} ${type}
</select>
运行截图
八、实现一次limit分页查询
实现代码
传入包含key=“begin”,key=“length”的map作为参数分页查询emp表的信息,mysql中的列是从0开始,故要查询第一排数据可以写成select * from emp limit 0,1
<select id="queryEmpFromTo" resultType="Emp" parameterType="MAP">
select * from emp limit #{begin},#{length}
</select>
运行截图
九、实现列名与属性名不对等的resultMap配置,并在查询中实现
实现代码
ID标签写入数据库中主键所包含的列名,类型,java类中的类型 result标签写入数据库与接收类不一致的列名,如一致可以不写。
<resultMap id="EmpMap" type="Emp">
<id property="empno" column="empno" javaType="java.lang.Integer" jdbcType="INTEGER"></id>
<result property="empname" column="ename" javaType="java.lang.String" jdbcType="VARCHAR"></result>
<result property="empjob" column="job" javaType="java.lang.String" jdbcType="VARCHAR"></result>
<result property="hiredate" column="hiredate" javaType="java.util.Date" jdbcType="DATE"></result>
</resultMap>
查询emp表所有信息
<select id="queryAllEmp" resultMap="EmpMap">
select * from emp
</select>
从下图可以看出我定义的类属性名和数据库的字段名不能一一对应,通过resultmap配置后可以进行查询