零SQL实现CRUD你还没学会?这最后一次啦-SQL查询

书接上篇零SQL实现CRUD你还没学会?这最后一次啦-SQL查询

模糊查询-like/notLike跟likeLeft/likeRight

用法:模糊查询,sql:

        like: where 列 like  "%值%"

        notLike:where 列 like  "%值%"

        likeLeft:where lie like "%值"

        likeRight:where lie like "值%"

需求:查询名字中含有 “ye” 字样的员工信息   like 

需求:查询名字中不含有 “ye” 字样的员工信息   notLikie

需求:查询名字中以 “ye” 字样结尾员工信息   likeLeft

需求:查询名字中以 “ye” 字样开头员工信息   likeRight

@Test
public void testQuery6() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    wrapper.like("name", "ye");  // like "%ye%"
    //wrapper.notLike("name", "ye");  // not like "%ye%"
    //wrapper.likeLeft("name", "ye");  // like "%ye"
    //wrapper.likeRight("name", "ye");  // like "fei%"
    List<Employee> list = employeeMapper.selectList(wrapper);
}

执行后SQL

 SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE (name LIKE ?)

-- "%ye%"  -- like
-- "%ye"   -- likeLeft
-- "ye%"   -- likeRight

逻辑运算符-and

用法:逻辑与, sql: where 条件1 and 条件2

需求:查询年龄介于18~30岁的员工信息

@Test
public void testQuery8() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    //多个条件默认使用and
    wrapper.ge("age", 18).le("age", 30);
    List<Employee> list = employeeMapper.selectList(wrapper);
}

执行后SQL

SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE (age >= ? AND age <= ?)

逻辑运算符-or

用法:逻辑或, sql: where 条件1 or 条件2

需求:查询年龄小于18或大于30岁的员工信息

@Test
public void testQuery8() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    //多个条件使用or
    wrapper.lt("age", 18)
            .or()
            .gt("age", 30);
    List<Employee> list = employeeMapper.selectList(wrapper);
}

执行后SQL

SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE (age < ? OR age > ?)

多个条件连接默认使用and拼接,如果是or操作需要明确调用or方法。

逻辑条件嵌套

需求:查询名字带有"ye"字样,或者年龄介于18~30岁的员工信息

@Test
public void testQuery10() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    wrapper.like("name", "ye")
            .or(wr -> wr.le("age", 30).ge("age", 18));
    List<Employee> list = employeeMapper.selectList(wrapper);
}

 执行后SQL

SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE (name LIKE ? OR (age <= ? AND age >= ?))

需求:查询名字带有"ye"字样,并且年龄小于18或大于30岁的员工信息

@Test
public void testQuery11() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    wrapper.like("name", "ye")
            .and(wr -> wr.lt("age", 18).or().gt("age", 30));
    List<Employee> list = employeeMapper.selectList(wrapper);
}

执行后SQL

SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE (name LIKE ? AND (age < ? OR age > ?))

分组查询-group by 跟 having

用法:分组查询, sql: group  by 列   having  条件

需求:查询每个部门员工个数

@Test
public void testQuery12() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    wrapper.select("dept_id", "count(id) count");
    wrapper.groupBy("dept_id");
    List<Map<String, Object>> mapList = employeeMapper.selectMaps(wrapper);
    mapList.forEach(System.out::println);
}

 执行后SQL

SELECT dept_id,count(id) count FROM employee GROUP BY dept_id

需求:查询每个部门员工个数,筛选出个数大于3的部门

@Test
public void testQuery13() {
    QueryWrapper<Employee> wrapper = new QueryWrapper<>();
    wrapper.select("dept_id", "count(id) count");
    wrapper.groupBy("dept_id");
    //wrapper.having("count > 3");
    wrapper.having("count > {0}", 3);
    List<Map<String, Object>> mapList = employeeMapper.selectMaps(wrapper);
    mapList.forEach(System.out::println);
}

 执行后SQL

-- count > 3
SELECT dept_id,count(id) count FROM employee GROUP BY dept_id HAVING count > 3

-- count > {0}
SELECT dept_id,count(id) count FROM employee GROUP BY dept_id HAVING count > ?

自定义SQL

上面的wrapper查询,针对简单sql场景非常简便,但是如果业务相对复杂,需要要求更灵活的SQL时(比如多表关联查询,动态sql等),wrapper有点力不从心了,此时可以使用自定义sql方式。这种方式不是啥新鲜货,其实就是还原之前的Mybatis的XxxxMapper.xml写法。

Mapper接口

public interface EmployeeMapper extends BaseMapper<Employee> {
    List<Employee> listByXmlSingle();  //自定义方法
}

Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.wolfcode.mp.mapper.EmployeeMapper" >

    <resultMap id="BaseResultMap" type="cn.wolfcode.mp.domain.Employee" >
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="age" jdbcType="INTEGER" property="age" />
        <result column="admin" jdbcType="BIT" property="admin" />
        <result column="dept_id" property="deptId" />
    </resultMap>


    <select id="listByXmlSingle" resultMap="BaseResultMap">
        select id, name, password, email, age, admin, dept_id
        from employee
    </select>

</mapper>

到这,本篇就结束啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪飞yes

我对钱没兴趣~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值