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,这里就不多做演示了。