本篇主要讲解easymybatis的查询功能。easymybatis提供丰富的查询方式,满足日常查询所需。
前端传递两个分页参数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;
}
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;
}
// 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类,表示支持分页和排序查询
假设有个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注解有三个属性:
如果要查询id大于2的用户只需在get方法上加上一个@Condition注解即可:
@Condition(operator=Operator.gt)
public Integer getId() {
return this.id;
}
这样,当id有值时,会封装成一个where id>2的条件
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'
假设前端页面传来多个值比如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字段。步骤如下:
@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注解是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,这里就不多做演示了。