在数据库 mango_example 中创建下面的表
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`content` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `key_uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建与message表对应的POJO类Message
public class Message {
private int id;
private int uid;
private int content;
// 各个属性对应的get与set方法必须加上,这里省略掉了
}
public class MySQLPageMain {
public static void main(String[] args) {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mango_example";
String username = "root"; // 这里请使用您自己的用户名
String password = "root"; // 这里请使用您自己的密码
DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);
Mango mango = Mango.newInstance(ds); // 使用数据源初始化mango
MessageDao dao = mango.create(MessageDao.class);
dao.deleteAll();
int uid = 100;
for (int i = 0; i < 10; i++) {
Message msg = new Message();
msg.setUid(uid);
msg.setContent(i + 1);
dao.insert(msg);
}
int pageNum = 2;
int pageSize = 3;
// 等价于 order by id desc
Sort sort = Sort.by(Direction.DESC, "id");
List<Message> msgs = dao.getMessages(uid, sort);
System.out.println("msgs: " + msgs);
// 等价于 limit pgeNum * pageSize, pageSize
Page page = Page.of(pageNum, pageSize);
msgs = dao.getMessages(uid, page);
System.out.println("msgs: " + msgs);
// 等价于 order by id desc limit pgeNum * pageSize, pageSize
page = Page.of(pageNum, pageSize, Sort.by(Direction.DESC, "id"));
msgs = dao.getMessages(uid, page);
System.out.println("msgs: " + msgs);
}
@DB
interface MessageDao {
@ReturnGeneratedId
@SQL("insert into message(uid, content) values(:uid, :content)")
int insert(Message msg);
@SQL("select id, uid, content from message where uid=:1")
List<Message> getMessages(int uid, Sort sort);
@SQL("select id, uid, content from message where uid=:1")
List<Message> getMessages(int uid, Page page);
@SQL("delete from message")
void deleteAll();
}
}
上面的代码中,我们首先往message表中插入了10条数据,然后进行3次查询操作:
- 排序查询,等价于执行SQL: select id, uid, content from message where uid=:1 order by id
- 分页查询,等价于执行SQL: select id, uid, content from message where uid=:1 limit 6, 3
- 排序+分页查询,等价于执行SQL: select id, uid, content from message where uid=:1 order by id limit 6, 3
注:分页从0开始,pageNum=2表示第3页。
Sort 类用于排序。
// 等价于 order by id asc
Sort.by("id");
// 等价于 order by id desc
Sort.by(Direction.DESC, "id");
// 等价于 order by id asc, name asc
Sort.by("id", "name");
// 等价于 order by id asc, name desc
Sort.by(Order.by("id"), Order.desc("name"));
Page 类用于排序与分页。
// 等价于 limit pageNum * pageSize, pageSize
Page.of(pageNum, pageSize);
// 等价于 order by id desc limit pageNum * pageSize, pageSize
Page.of(pageNum, pageSize, Direction.DESC, "id");
// 等价于 order by id asc, name desc limit pageNum * pageSize, pageSize
Page.of(pageNum, pageSize, Sort.by(Order.by("id"), Order.desc("name")));
PageResult 类用于分页查询时获取数据总量(主要用于实现前端分页显示)
@DB
interface MessageDao {
@SQL("select id, uid, content from message where uid=:1")
List<Message> getMessages(int uid, Page page);
@SQL("select id, uid, content from message where uid=:1")
PageResult<Message> getMessagesWithTotal(int uid, Page page);
}
上面的代码中:
getMessages 方法只返回分页查询到的数据,不包含数据总量。
getMessagesWithTotal 方法返回PageResult对象,PageResult对象的getData方法返回分页查询到的数据,PageResult对象的getTotal方法则返回数据总量。
mango框架的排序与分页目前支持MySQL与Oracle这两个主流数据库,在不进行任何设置时,默认用户使用MySQL数据库。
如需使用Oracle数据库,则需手动调用mango.setPageHandler(new OraclePageHandler ())。
如需使用其他数据库,则需自己实现 PageHandler 接口:
public interface PageHandler {
void handlePage(BoundSql boundSql, Page page);
void handleSort(BoundSql boundSql, Sort sort);
void handleCount(BoundSql boundSql);
}
排序与分页 的所有代码和表结构均可以在 mango-example 中找到。