easymybatis查询功能

x33g5p2x  于2021-12-28 转载在 其他  
字(7.2k)|赞(0)|评价(0)|浏览(316)

本篇主要讲解easymybatis的查询功能。easymybatis提供丰富的查询方式,满足日常查询所需。

分页查询

方式1

前端传递两个分页参数pageIndex,pageSize

// http://localhost:8080/page1?pageIndex=1&pageSize=10
    @GetMapping("page1")
    public List<TUser> page1(int pageIndex,int pageSize) {
        Query query = new Query().page(pageIndex, pageSize);
        List<TUser> list = dao.find(query);
        return list;
    }

方式2

PageParam里面封装了pageIndex,pageSize参数

// http://localhost:8080/page2?pageIndex=1&pageSize=10
    @GetMapping("page2")
    public List<TUser> page2(PageParam param) {
        Query query = param.toQuery();
        List<TUser> list = dao.find(query);
        return list;
    }

返回结果集和总记录数

方式1和方式2只能查询结果集,通常我们查询还需返回记录总数并返回给前端,easymybatis的处理方式如下:

// http://localhost:8080/page3?pageIndex=1&pageSize=10
    @GetMapping("page3")
    public Map<String,Object> page3(PageParam param) {
        Query query = param.toQuery();
        List<TUser> list = dao.find(query);
        long total = dao.countTotal(query);

        Map<String,Object> result = new HashMap<String, Object>();
        result.put("list", list);
        result.put("total", total);

        return result;
    }

easymybatis提供一种更简洁的方式来处理:

// http://localhost:8080/page4?pageIndex=1&pageSize=10
    @GetMapping("page4")
    public PageInfo<TUser> page4(PageParam param) {
        PageInfo<TUser> result = QueryUtils.query(dao, param);
        return result;
    }

PageInfo里面包含了List,total信息,还包含了一些额外信息,完整数据如下:

{
    "currentPageIndex": 1, // 当前页
    "firstPageIndex": 1, // 首页
    "lastPageIndex": 2, // 尾页
    "list": [ // 结果集 {}, {} ],
    "nextPageIndex": 2, // 下一页
    "pageCount": 2, // 总页数
    "pageIndex": 1, // 当前页
    "pageSize": 10, // 每页记录数
    "prePageIndex": 1, // 上一页
    "start": 0,
    "total": 20 // 总记录数 }

完整代码

@RestController
public class UserSchController {

    @Autowired
    private TUserDao dao;

    // http://localhost:8080/page1?pageIndex=1&pageSize=10
    @GetMapping("page1")
    public List<TUser> page1(int pageIndex,int pageSize) {
        Query query = new Query().page(pageIndex, pageSize);
        List<TUser> list = dao.find(query);
        return list;
    }

    // http://localhost:8080/page2?pageIndex=1&pageSize=10
    @GetMapping("page2")
    public List<TUser> page2(PageParam param) {
        Query query = param.toQuery();
        List<TUser> list = dao.find(query);
        return list;
    }

    // http://localhost:8080/page3?pageIndex=1&pageSize=10
    @GetMapping("page3")
    public Map<String,Object> page3(PageParam param) {
        Query query = param.toQuery();
        List<TUser> list = dao.find(query);
        long total = dao.countTotal(query);

        Map<String,Object> result = new HashMap<String, Object>();
        result.put("list", list);
        result.put("total", total);

        return result;
    }

    // http://localhost:8080/page4?pageIndex=1&pageSize=10
    @GetMapping("page4")
    public PageInfo<TUser> page4(PageParam param) {
        PageInfo<TUser> result = QueryUtils.query(dao, param);
        return result;
    }
}

根据参数字段查询

查询姓名为张三的用户

// http://localhost:8080/sch?username=张三
    @GetMapping("sch")
    public List<TUser> sch(String username) {
        Query query = new Query();
        query.eq("username", username);
        List<TUser> list = dao.find(query);
        return list;
    }

查询姓名为张三并且拥有的钱大于100块

// http://localhost:8080/sch2?username=张三
    @GetMapping("sch2")
    public List<TUser> sch2(String username) {
        Query query = new Query();
        query.eq("username", username).gt("money", 100);
        List<TUser> list = dao.find(query);
        return list;
    }

查询姓名为张三并带分页

// http://localhost:8080/sch3?username=张三&pageIndex=1&pageSize=5
    @GetMapping("sch3")
    public List<TUser> sch3(String username,PageParam param) {
        Query query = param.toQuery();
        query.eq("username", username);
        List<TUser> list = dao.find(query);
        return list;
    }

查询钱最多的前三名

// http://localhost:8080/sch4
    @GetMapping("sch4")
    public List<TUser> sch4() {
        Query query = new Query()
            .orderby("money", Sort.DESC) // 按金额降序
            .page(1, 3);
        List<TUser> list = dao.find(query);
        return list;
    }

将参数放在对象中查询

// http://localhost:8080/sch5?username=张三
    @GetMapping("sch5")
    public List<TUser> sch5(UserParam userParam) {
        Query query = userParam.toQuery();
        query.eq("username", userParam.getUsername());
        List<TUser> list = dao.find(query);
        return list;
    }

UserParam继承PageSortParam类,表示支持分页和排序查询

使用普通bean查询

假设有个User类如下

public class User {
    private Integer id;
    private String userName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

我们将这个类作为查询参数,那么在springmvc中可以这样写:

@GetMapping(path="findUserBean.do")
public List<User> findUser(User user) {
    Query query = Query.buildFromBean(user);
    List<User> list = dao.find(query);
    return list;
}

Query query = Query.buildFromBean(user);这句是将User中的属性转换成对应条件,假设userName的值为”jim”,那么会封装成一个条件where user_name=’jim’

浏览器输入链接:http://localhost:8080/easymybatis-springmvc/findUserBean.do?userName=jim
后台将会执行如下SQL:

SELECT id,user_name FROM user t WHERE t.user_name = ?

?的值为jim

@Condition注解

@Condition注解用来强化查询,有了这个注解可以生成各种查询条件。

@Condition注解有三个属性:

  • joint:表达式之间的连接符,AND|OR,默认AND
  • column:数据库字段名,可选
  • operator:连接符枚举,存放了等于、大于、小于等连接符

如果要查询id大于2的用户只需在get方法上加上一个@Condition注解即可:

@Condition(operator=Operator.gt)
public Integer getId() {
    return this.id;
}

这样,当id有值时,会封装成一个where id>2的条件

  • 需要注意的是,如果不指定column属性,系统会默认取get方法中属性名,然后转换成数据库字段名。如果需要指定数据库字段名的话,可以使用@Condition的column属性。

public Integer getUserName() {
return this.userName;
}

这种情况下会取下划线部分字段,然后转换成数据库字段名。

@Condition(column="username") // 显示指定字段名
public Integer getUserName() {
    return this.userName;
}

使用@Condition可以生产更加灵活的条件查询,比如需要查询日期为2017-12-1~2017-12-10日的记录,我们可以这样写:

@Condition(column="add_date",operator=Operator.ge)
public Date getStartDate() {
    return this.startDate;
}

@Condition(column="add_date",operator=Operator.lt)
public Date getEndDate() {
    return this.endDate;
}

转换成SQL语句:

t.add_date>='2017-12-1' AND t.add_date<'2017-12-10'
IN查询

假设前端页面传来多个值比如checkbox勾选多个id=[1,2],那么我们在User类里面可以用Integer[]或List来接收.

private Integer[] idArr;

public void setIdArr(Integer[] idArr) {this.idArr = idArr;}

@Condition(column="id")
public Integer[] getIdArr() {return this.idArr;}

这样会生成where id IN(1,2)条件。

排序查询

// 根据添加时间倒序

Query query = new Query();
query.addSort("create_time",Sort.DESC);
dao.find(query);

多表关联查询

多表关联查询使用的地方很多,比如需要关联第二张表,获取第二张表的几个字段,然后返回给前端。

easymybatis的用法如下:
假如我们需要关联第二张表,并且获取第二张表里的city,address字段。步骤如下:

  • 在实体类中添加city,address字段,并标记@Transient注解。只要不是主表中的字段都要加上@Transient
@Transient
private String city;
@Transient
private String address;

// getter setter
  • 接下来是查询代码:
Query query = new Query();
// 添加第二张表的字段,跟主表字段一起返回
query.addOtherColumns(
    "t2.city"
    ,"t2.address"
);
// 左连接查询,主表的alias默认为t
query.join("LEFT JOIN user_info t2 ON t.id = t2.user_id"); 
// 添加查询条件
query.eq("t.username", "张三");

List<TUser> list = dao.find(query);

得到的SQL语句:

SELECT t.`id` , t.`username` , t.`state` , t.`isdel` , t.`remark` , t.`add_time` , t.`money` , t.`left_money` , t2.city , t2.address FROM `t_user` t LEFT JOIN user_info t2 ON t.id = t2.user_id WHERE t.username = ? LIMIT ?,?

关联了user_info表之后,还可以筛选user_info的数据,也就是针对user_info表进行查询:

query.eq("t2.city","杭州");

使用@Select查询

@Select注解是mybatis官方提供的一个功能,easymybatis可以理解为是官方的一种扩展,因此同样支持此功能。
在Dao中添加如下代码:

@Select("select * from t_user where id=#{id}")
TUser selectById(@Param("id") int id);

编写测试用例

@Test
public void testSelectById() {
    TUser user = dao.selectById(3);

    System.out.println(user.getUsername());
}

除了@Select之外,还有@Update,@Insert,@Delete,这里就不多做演示了。

相关文章