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();
        query.setPage(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();
        query.setPage(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();
        query.addSort("money", Sort.DESC) // 按金额降序
            .setPage(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 get++UserName++() { 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,这里就不多做演示了。

posted @ 2018-02-12 15:39  tanghc  阅读(786)  评论(0编辑  收藏  举报