最近在看hibernate
好吧,虽然很多人都说Mybatis多么轻量级和多么灵活
但是不得不说hibernate封装的良好和它的强大
虽然mabatis的逆向工程也是真的蛮吊
以前没学的时候不是很了解
可能获取大概所有人对与一些比较新奇没有接触过的事务都会有这样的感觉吧
说多了......
今天是翻看了一下以前的一些毕节,回顾一些比较基础的知识
开始自己学的时候,分页查询这块也着实弄不明白来着
不过,果然温故而知新,很多过去不明白的时候,多回顾一下就有不一样的感受了
不多说,上代码....其实真的非常简陋
dao包接口
public interface TBrandDao {
//查询所有品牌
public List<TBrand> queryAll();
//分页和条件查询品牌
public List<TBrand> queryByPage(BrandQuery query);
//根据条件查询总页数
public int queryPage(BrandQuery query);
}
分页的时候需要例如start 和 end这样的一些参数,实在麻烦,所以直接封装了,因为做前端分页的列表的话,肯定会涉及到一些其他的条件查询,可以吧分页信息和其他条件封装一个pojo中,好吧,个人喜好
xmlmapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 映射指向dao接口 -->
<mapper namespace="com.tjzs.sccms.dao.TBrandDao">
<select id="queryAll" resultType="TBrand" >
select * from tbrand
</select>
<sql id="where">
<where>
<if test="bname!=null and bname!=''">
bname=#{bname}
</if>
</where>
</sql>
<select id="queryByPage" parameterType="BrandQuery" resultType="TBrand">
select s.* from
(select rownum rnm,t.* from tbrand t <include refid="where"/>)s where s.rnm >= #{start} and s.rnm<= #{end}
</select>
<select id="queryPage" parameterType="BrandQuery" resultType="int">
select count(1) from tbrand
<include refid="where"/>
</select>
</mapper>
本地测试用的Oracle数据库,破解的,每次可以用三十天,不得不说国人的强大
Oracle中分页的条件查询是要用到rownum这的字段的,跟MySQL有些不一样
MySQL的分页是用limit
然后是service层的接口
/**
* brand 服务层
* @author Administrator
*
*/
public interface BrandService {
public List<TBrand> queryAll();
//分页和条件查询品牌
public List<TBrand> queryByPage(BrandQuery query,int page);
//根据条件查询总页数
public int querypage(BrandQuery query);
}
自然实现类也是少不了的
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
TBrandDao brandDao;
@Override
public List<TBrand> queryAll() {
// TODO Auto-generated method stub
List<TBrand> brandList = brandDao.queryAll();
return brandList;
}
//分页查询
@Override
public List<TBrand> queryByPage(BrandQuery query,int page) {
// TODO Auto-generated method stub
int start=(page-1)*Constants.ROW+1;
int end=page*Constants.ROW;
query.setStart(start);
query.setEnd(end);
System.out.println(start+"----"+end);
List<TBrand> brands = brandDao.queryByPage(query);
return brands;
}
//查询总页数
@Override
public int querypage(BrandQuery query) {
// TODO Auto-generated method stub
int pages=brandDao.queryPage(query);
//如果页面书可以被条数整除 直接返回计算结果 否则+1
if(pages%Constants.ROW==0) {
return pages/Constants.ROW;
}else {
return pages/Constants.ROW+1;
}
}
}
然后是控制层的代码Controlller
/**
* 品牌管理控制层
* @author Administrator
*
*/
@Controller
@RequestMapping("/brand")
public class BrandController {
@Autowired
BrandService BrandService;
//品牌管理
@RequestMapping("/list.do")
public String brandList(Model model,BrandQuery query,String page){
if(page==null||page=="") {
page="1";
}
List<TBrand> brands = BrandService.queryByPage(query, Integer.parseInt(page));
model.addAttribute("brands", brands);
model.addAttribute("currentPage", page);
model.addAttribute("query", query);
model.addAttribute("pages", BrandService.querypage(query));
return "brand/list";
}
将所有的数据加载到model中想前台传递数据
然后在前端的jsp中就可以直接用了
<tbody class="pn-ltbody">
<c:forEach items="${brands }" var="brand">
<tr bgcolor="#ffffff" onmouseout="this.bgColor='#ffffff'" onmouseover="this.bgColor='#eeeeee'">
<td><input type="checkbox" value="${brand.id }" name="ids"/></td>
<td align="center">${brand.id }</td>
<td align="center">${brand.bname }</td>
<td align="center"><img width="40" height="40" src="${brand.logopic }"/></td>
<td align="center">${brand.discribe }</td>
<td align="center">1</td>
<td align="center">shi</td>
<td align="center">
<a class="pn-opt" href="add.html">修改</a> | <a class="pn-opt" onclick="if(!confirm('您确定删除吗?')) {return false;}" href="#">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<div class="page pb15">
<span class="r inb_a page_b">
<!-- [当前页/尾页] -->
[${currentPage }/${pages }]
<!-- 首页 -->
<a href="list.do?bname=${query.bname }">首页</a>
<!-- 上一页,下一页 -->
<c:if test="${currentPage-1>0 }">
<a href="list.do?page=${currentPage-1 }&?bname=${query.bname }">上一页</a>
</c:if>
<c:if test="${currentPage+1<=pages }">
<a href="list.do?page=${currentPage+1 }&?bname=${query.bname }">下一页</a>
</c:if>
<!-- 尾页 -->
<a href="list.do?page=${pages }&?pname=${query.bname }">尾页</a>
</span>
</div>
在前端的列表下面加入分页
丑的一批,但是实用
如果你对前端比较熟悉的话
可以用css再去美化一些页面
然后?高大上的分页功能就出来啦
不过现在项目重大都一些逆向工程
要不就是hibernate hql 或者 criteria之类
自然工具是好用的,但是基础更重要不是吗
毕竟框架总是会更新变化,不过地基总是不会变的