上次我们了解了Mybatis的一些基本操作,接下来我们继续学习Mybatis更多知识
1.接口式编程
什么是接口式编程?简单来说就是利用接口的形式去编码。为什么要使用接口式编码呢?我们来看以下的案例
messageList = sqlSession.selectList("Message.queryMessageList",message);
让我们分析这行代码,在实际开发中,我们很难避免没有写错"Message.queryMessageList"或者说,我们也有可能会命名相同的命名空间或者相同的id,而参数部分传入的是对象,我们也很难避免不会穿入其他错的值。如果我们犯错了,编译器是不会给我们找出错误,而需要我们在执行的时候才能发现错误。这样会效率低下,这时候就需要利用接口式编程帮我们规避这些错误
创建一个接口
返回的类型和xml中对应,名字和ID相同
package com.mybatis.dao;
import com.mybatis.entity.Message;
import java.util.List;
public interface IMessage {
public List queryMessageList (Message message);
}
修改命名空间,内容为包名.接口的名字
DAO层修改
//messageList = sqlSession.selectList("Message.queryMessageList",message);
IMessage iMessage = sqlSession.getMapper(IMessage.class);//获得代理实例,不需要做强转,后台已经实现
messageList = iMessage.queryMessageList(message);
sqlSession.close();
测试结果:
分析:
1.接口的实例不用我们操心,Mybatis会自己帮我们实现,我们直接调用就好了
2.看起来我们代码还比以前多了,但是以后跟spring集合的话,sqlSession会交给spring托管,这样我们会少了很多代码,增加了开发效率
IMssage.queryMessageList();
MapperProxy.invoke() == sqlSession.selectList()?
IMssage imssage = Proxy.newProxyInstance();
2.分页功能的介绍
说到分页我们先来捋一捋有几项我们值得注意的参数:
- 条件
- 显示多少条
- 一共有多少条
- 当前第几页
- 一共有多少页
创建一个page类
package com.mybatis.util;
/**
* 分页查询的工具类
*/
public class Page {
private int totalNumber;//总条数
private int currentPage;//当前第几页
private int totalPage;//总页数
private int pageNumber = 5;//每页显示多少条
private int start;//从第几条开始取
private int number;//取多少条
public void count(){
//计算总页数
int totalPageTemp = totalNumber / pageNumber;
//是否要增加一页
int plus = (totalNumber % pageNumber == 0) ? 0 : 1;
totalPageTemp = totalPageTemp + plus;
//如果是只有一页,就设为1
if(totalPageTemp <= 0) {
totalPageTemp = 1;
}
//设置总页数
this.totalPage = totalPageTemp;
//设置当前页数
// 总页数小于当前页数,应将当前页数设置为总页数
if(this.totalPage < this.currentPage) {
this.currentPage = this.totalPage;
}
// 当前页数小于1设置为1
if(this.currentPage < 1) {
this.currentPage = 1;
}
//设置limit的数值
this.start = (this.currentPage - 1) * pageNumber;
this.number = pageNumber;
}
public int getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(int totalNumber) {
this.totalNumber = totalNumber;
count();
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
Message.xml
我们可以看到上面queryMessageList需要两个对象的参数,我们可以用Map实现
IMessage
public interface IMessage {
public List queryMessageList (Map parameter);
public int count(Message message);
}
DAO层
public List queryMessageList (Map parameter) {
//获得数据库的sqlsession,通过sqlsess进行数据库的操作
SqlSession sqlSession = DBUtil.getSqlSession();
List messageList;
//调用Message.xml中的queryMessageList查询
//messageList = sqlSession.selectList("Message.queryMessageList",message);
IMessage iMessage = sqlSession.getMapper(IMessage.class);//获得代理实例
messageList = iMessage.queryMessageList(parameter);
sqlSession.close();
return messageList;
}
service层
public class MessageService {
public List getMessageList( Message message, Page page) {
MessageDao md = new MessageDao();
int count = md.count(message);//获得总条数
page.setTotalNumber(count);
Map parameter = new HashMap();
parameter.put("message",message);
parameter.put("page",page);
List list = md.queryMessageList(parameter);
return list;
}
}
servlet层
public class ListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里的“/”表示整个web应用程序
//编码问题,如果不是就会???
request.setCharacterEncoding("UTF-8");
String command = request.getParameter("command");
String description = request.getParameter("description");
String currentPage = request.getParameter("currentPage");
Page page = new Page();
Pattern pattern = Pattern.compile("[0-9]{1,9}");
if(currentPage == null || !pattern.matcher(currentPage).matches()) {
page.setCurrentPage(1);
}else {
page.setCurrentPage(Integer.valueOf(currentPage));
}
System.out.println("currentPage is " + currentPage);
MessageService ms = new MessageService();
Message message = new Message();
message.setCommand(command);
message.setDescription(description);
System.out.println(command + " ------" + description);
request.setAttribute("messageList",ms.getMessageList(message,page));
request.setAttribute("page",page);
request.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
部分jsp代码