数据库分页无非就是根据条件先查出
1.有多少条符合条件的记录
2.根据起始位置查出需要的记录
ssh 集成的环境中使用 JdbcDaoSupport 完成分页,以下的一种写法比较优雅 :
一个dao的代码片段
package cn.com.xinli.tdm.dao.impl.cust;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.transaction.annotation.Transactional;
import cn.com.xinli.tdm.core.Page;
import cn.com.xinli.tdm.dao.cust.IXxCustDao;
import cn.com.xinli.tdm.repository.cust.Cust;
@Transactional(rollbackFor = Exception.class)
public class XxCustDao extends JdbcDaoSupport implements IXxCustDao {
private StringBuffer cond=new StringBuffer();
private Collection<Object> para=new ArrayList<Object>();
public List<Cust> list(Page page) {
String sql ="SELECT * FROM(SELECT A.*,ROWNUM RN FROM("
+ "select * from xx_cust where 1=1"+cond.toString()+" order by display_order"
+ ") A WHERE ROWNUM<="+page.getEnd()+")WHERE RN>="+page.getStart();
System.out.println("sql:"+sql);
return (List<Cust>)getJdbcTemplate().query(sql,para.toArray(),new CustRowMapper());
}
public int listCount(Page page) {
String sql = "select count(1) from xx_cust where 1=1"+cond.toString();
return getJdbcTemplate().queryForInt(sql,para.toArray());
}
public boolean repeat(Cust cust) {
String sql = "select count(1) from xx_cust where login_name=?";
return getJdbcTemplate().queryForInt(sql,new Object[]{cust.getLoginName()})>0;
}
public void add(Cust cust) {
cust.setCustId(null);
String sql = "insert into xx_cust(cust_name,login_name,cust_type,email,sex,address,office_tel,person_tel,if_linkman,display_order,if_use,idcard,passport_type,passport_nbr,duty,is_legal) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
getJdbcTemplate().update(sql,new CustPstmtSetter(cust));
Integer id=getJdbcTemplate().queryForInt("select max(cust_id) from xx_cust");
String sqlRole="insert into xx_cust_to_organrize(organization_id,cust_id) values(?,?)";
getJdbcTemplate().update(sqlRole,new Object[]{cust.getOrgId(),id});
}
public void edit(Cust cust) {
String sql = "update xx_cust set cust_name=?,login_name=?,cust_type=?,email=?,sex=?,address=?,office_tel=?,person_tel=?,if_linkman=?,display_order=?,if_use=?,idcard=?,passport_type=?,passport_nbr=?,duty=?,is_legal=? where cust_id=?";
getJdbcTemplate().update(sql,new CustPstmtSetter(cust));
}
public void del(Cust cust) {
String dd="delete from xx_cust_to_organrize where cust_id=?";
getJdbcTemplate().update(dd,new Object[]{cust.getCustId()});
String sql = "delete from xx_cust where cust_id=?";
getJdbcTemplate().update(sql,new Object[]{cust.getCustId()});
}
public Cust view(Cust cust) {
String sql = "select * from xx_cust where cust_id=?";
return (Cust) getJdbcTemplate().queryForObject(sql,
new Object[] {cust.getCustId()},
new CustRowMapper());
}
public void make(Page page){
Cust cust=(Cust)page.getConditions();
cond.delete(0,cond.length());
para.clear();
if(cust.getCustType()!=null && !"".equals(cust.getCustType())){
cond.append(" and cust_type=?");
para.add(cust.getCustType());
}
if(cust.getOrgId()!=null && cust.getOrgId()>0){
cond.append(" and cust_id in(select cust_id from xx_cust_to_organrize where organization_id=?)");
para.add(cust.getOrgId());
}
if(cust.getLoginName()!=null && !"".equals(cust.getLoginName())){
cond.append(" and login_name=?");
para.add(cust.getLoginName());
}
if(cust.getIdcard()!=null && !"".equals(cust.getIdcard())){
cond.append(" and idcard=?");
para.add(cust.getIdcard());
}
if(cust.getCustName()!=null && !"".equals(cust.getCustName())){
cond.append(" and cust_name like ?");
para.add("%"+cust.getCustName()+"%");
}
if(cust.getPersonTel()!=null && !"".equals(cust.getPersonTel())){
cond.append(" and person_tel=?");
para.add(cust.getPersonTel());
}
if(cust.getOfficeTel()!=null && !"".equals(cust.getOfficeTel())){
cond.append(" and OFFICE_TEL=?");
para.add(cust.getOfficeTel());
}
if(cust.getPassPortNumber()!=null && !"".equals(cust.getPassPortNumber())){
cond.append(" and PASSPORT_NBR=?");
para.add(cust.getPassPortNumber());
}
}
private class CustRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int index) throws SQLException {
Cust cust = new Cust();
cust.setCustName(rs.getString("cust_name"));
cust.setLoginName(rs.getString("login_name"));
cust.setCustType(rs.getString("cust_type"));
cust.setEmail(rs.getString("email"));
cust.setSex(rs.getString("sex"));
cust.setAddress(rs.getString("address"));
cust.setOfficeTel(rs.getString("office_tel"));
cust.setPersonTel(rs.getString("person_tel"));
cust.setIfLinkMan(rs.getString("if_linkman"));
cust.setPwAvail(rs.getDate("pw_avail"));
cust.setDisplayOrder(rs.getInt("display_order"));
cust.setIfUse(rs.getString("if_use"));
cust.setPassPortType(rs.getString("passport_type"));
cust.setPassPortNumber(rs.getString("passport_nbr"));
cust.setDuty(rs.getString("duty"));
cust.setIsLegal(rs.getString("is_legal"));
cust.setIdcard(rs.getString("idcard"));
cust.setCustId(rs.getLong("cust_id"));
return cust;
}
}
private class CustPstmtSetter implements PreparedStatementSetter {
Cust cust;
public CustPstmtSetter(Cust cust) {
this.cust=cust;
}
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1,cust.getCustName());
ps.setString(2,cust.getLoginName());
ps.setString(3,cust.getCustType());
ps.setString(4,cust.getEmail());
ps.setString(5,cust.getSex());
ps.setString(6,cust.getAddress());
ps.setString(7,cust.getOfficeTel());
ps.setString(8,cust.getPersonTel());
ps.setString(9,cust.getIfLinkMan());
ps.setInt(10,cust.getDisplayOrder());
ps.setString(11,cust.getIfUse());
ps.setString(12,cust.getIdcard());
ps.setString(13,cust.getPassPortType());
ps.setString(14,cust.getPassPortNumber());
ps.setString(15,cust.getDuty());
ps.setString(16,cust.getIsLegal());
if(cust.getCustId()!=null)
ps.setLong(17,cust.getCustId());
}
}
}
备注:
1.在拼sql 的时候使用了 where 1=1 这个永远成立子查询,这样是为了让后面的 条件有规律和蒸汽
2.使用了 ArrayList 的toArray 方法 把一个list转化为一个 数组
import java.util.ArrayList;
import java.util.Collection;
public class TestToArray
{
public static void main(String[] args)
{
Collection<Object> list=new ArrayList<Object>();
list.add("aa");
list.add("bb");
list.add("cc");
Object [] arr=list.toArray();
for(Object str:arr)
{
System.out.println("str:"+str);
}
}
}
打印:
str:aa
str:bb
str:cc
分享到:
相关推荐
根据提供的文件信息,我们可以将其中涉及的数据库分页方法总结为以下三种,并分别对每种方法进行详细解析。 ### 第一种方法:TOP 和 NOT IN 的组合 这种方法通过使用 `TOP` 和 `NOT IN` 来实现分页查询。具体实现...
这里,`ROW_NUMBER() OVER (ORDER BY some_column)`会根据指定的排序列生成一个行号,然后通过`BETWEEN`来选择特定范围的行。 然而,即使使用ROW_NUMBER(),在大表中执行这样的查询仍然可能较慢,因为Oracle必须为...
### C#后台分页及数据库脚本常用的几种分页写法 #### 分页技术概述 在Web开发中,为了提高用户体验以及服务器性能,通常会采用分页技术来展示大量数据。分页技术不仅可以减少单次请求的数据量,降低服务器压力,还...
- **Use Bean**:声明了一个名为`cn`的Bean实例,用于连接数据库。 #### JavaScript支持 - **弹窗函数**:定义了一个`newwin(url)`函数,用于打开新窗口。 - **跳转函数**:定义了一个`submit10()`函数,用于...
Servlet使用Java Persistence API (JPA) 或者 JDBC 连接到数据库,执行SQL查询,通常是一个带有LIMIT和OFFSET子句的SELECT语句,LIMIT用于指定每页的记录数,OFFSET用于跳过前几条记录,达到分页效果。 3. **...
这个压缩包文件名"JAVA JAP分页写法大全"暗示了它可能包含各种不同的分页实现示例,这对于初学者来说是一个极好的学习资源。下面我们将详细探讨Java中常见的分页方法。 首先,我们要理解分页的基本概念。在处理大量...
标题提到的"asp最快的分页写法",意味着这是一种优化过的分页实现,它在处理大数据集时表现出更好的性能。接下来,我们将深入探讨ASP分页的关键知识点,并结合提供的文件名来解析这个快速分页方法可能的实现方式。 ...
`ROW_NUMBER()`函数是SQL Server 2005及以上版本引入的,它可以在结果集中生成一个唯一的行号。这种方法通常被认为是性能较好的分页方式,但只适用于较新版本的SQL Server。例如: ```sql SELECT * FROM ( ...
PHP原生数据库分页的代码实例主要涉及以下几个知识点: 1. PHP与MySQL数据库的连接:代码中首先通过mysql_connect()函数连接MySQL数据库,需要提供数据库的地址、账号和密码。连接成功后,使用mysql_select_db()...
为了实现分页,我们需要一个嵌套查询: ```sql SELECT * FROM ( SELECT t.*, ROWNUM AS row_num FROM your_table t ) WHERE row_num BETWEEN (currentPage - 1) * pageSize + 1 AND currentPage * pageSize ``` ...
7. **实际项目中的适应性**:在实际项目中,可能需要根据数据库类型和具体需求调整分页SQL的写法,例如Oracle支持ROWNUM,而MySQL则可以使用LIMIT和OFFSET。 **优化技巧**: 1. **缓存**:对于不经常变动的数据,...
Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以帮助用户高效地获取数据集的一部分,而不是一次性加载所有结果。本篇文章将详细介绍Oracle中的分页查询,并提供一种常用的分页查询语句格式和一...
首先,Oracle的分页查询语句通常遵循一个标准格式,如下所示: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( SELECT * FROM TABLE_NAME ) A WHERE ROWNUM ) WHERE RN >= 21 ``` 在这个例子中,最内层...
总的来说,Oracle的分页查询是一个涉及查询优化、连接策略和伪列运用的复杂话题。正确使用分页可以显著提高查询性能,减少资源消耗,为用户提供更好的体验。理解这些原理和技巧,对优化数据库查询性能至关重要。
**一、传统的分页写法** 在SQL Server 2005之前,或者不支持窗口函数的版本中,一种常用的分页方法是通过子查询和`NOT IN`或`NOT EXISTS`来实现。以下是一个使用存储过程的例子: ```sql CREATE PROC p_paged1 @...
在本文中,我们将深入探讨如何使用MyBatis框架通过JDBC连接PostgreSQL数据库,构建一个最小的示例项目。MyBatis是一个轻量级的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接嵌入到Java代码中,提供...
在Oracle数据库中,伪列(Pseudocolumn)并非真正意义上的列,而是一种特殊的数据库对象,它看起来像表中的一个列,但实际上并不存储数据。Oracle提供了一些内置的伪列供用户使用,如`ROWID`和`ROWNUM`等,这些伪列...
这是一个基于Java Web技术的学生管理系统,该系统以MySQL作为数据库存储学生信息,并且具有基本的数据操作功能,如列表展示、分页、增删改查。由于描述中提到“基本没有CSS样式”,因此我们可以推断,这个项目更侧重...
Oracle数据库在处理大数据量时,分页查询是一个重要的性能优化策略,它可以帮助用户按需获取数据,而不是一次性加载整个结果集,从而降低网络传输负担和内存消耗。本篇将深入探讨Oracle分页查询的实现机制、效率差异...