Mybatis查询语法的使用

发布于:2022-08-08 ⋅ 阅读:(326) ⋅ 点赞:(0)

一、实现只有一个列但多行的查询结果,实现只有一个列且只有一行的查询结果。

 实现代码

查找姓名,并返回一个字符串集合

 <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配置后可以进行查询

 运行截图


网站公告

今日签到

点亮在社区的每一天
去签到