`
8366
  • 浏览: 808968 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

数据库分页一个比较好的写法

    博客分类:
  • code
阅读更多

 

 

  数据库分页无非就是根据条件先查出

 

  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

分享到:
评论

相关推荐

    数据库分页3种写法

    根据提供的文件信息,我们可以将其中涉及的数据库分页方法总结为以下三种,并分别对每种方法进行详细解析。 ### 第一种方法:TOP 和 NOT IN 的组合 这种方法通过使用 `TOP` 和 `NOT IN` 来实现分页查询。具体实现...

    Oracle的SQL分页实践

    这里,`ROW_NUMBER() OVER (ORDER BY some_column)`会根据指定的排序列生成一个行号,然后通过`BETWEEN`来选择特定范围的行。 然而,即使使用ROW_NUMBER(),在大表中执行这样的查询仍然可能较慢,因为Oracle必须为...

    C#后台分页及数据库脚本常用的几种分页写法

    ### C#后台分页及数据库脚本常用的几种分页写法 #### 分页技术概述 在Web开发中,为了提高用户体验以及服务器性能,通常会采用分页技术来展示大量数据。分页技术不仅可以减少单次请求的数据量,降低服务器压力,还...

    分页代码,实现分页的两种写法

    - **Use Bean**:声明了一个名为`cn`的Bean实例,用于连接数据库。 #### JavaScript支持 - **弹窗函数**:定义了一个`newwin(url)`函数,用于打开新窗口。 - **跳转函数**:定义了一个`submit10()`函数,用于...

    jsp+Servlet+JavaBean分页的两种写法

    Servlet使用Java Persistence API (JPA) 或者 JDBC 连接到数据库,执行SQL查询,通常是一个带有LIMIT和OFFSET子句的SELECT语句,LIMIT用于指定每页的记录数,OFFSET用于跳过前几条记录,达到分页效果。 3. **...

    JAVA JAP分页写法大全

    这个压缩包文件名"JAVA JAP分页写法大全"暗示了它可能包含各种不同的分页实现示例,这对于初学者来说是一个极好的学习资源。下面我们将详细探讨Java中常见的分页方法。 首先,我们要理解分页的基本概念。在处理大量...

    asp最快的分页写法

    标题提到的"asp最快的分页写法",意味着这是一种优化过的分页实现,它在处理大数据集时表现出更好的性能。接下来,我们将深入探讨ASP分页的关键知识点,并结合提供的文件名来解析这个快速分页方法可能的实现方式。 ...

    sql分页查询几种写法

    `ROW_NUMBER()`函数是SQL Server 2005及以上版本引入的,它可以在结果集中生成一个唯一的行号。这种方法通常被认为是性能较好的分页方式,但只适用于较新版本的SQL Server。例如: ```sql SELECT * FROM ( ...

    php原生数据库分页的代码实例

    PHP原生数据库分页的代码实例主要涉及以下几个知识点: 1. PHP与MySQL数据库的连接:代码中首先通过mysql_connect()函数连接MySQL数据库,需要提供数据库的地址、账号和密码。连接成功后,使用mysql_select_db()...

    分页代码Oracle

    为了实现分页,我们需要一个嵌套查询: ```sql SELECT * FROM ( SELECT t.*, ROWNUM AS row_num FROM your_table t ) WHERE row_num BETWEEN (currentPage - 1) * pageSize + 1 AND currentPage * pageSize ``` ...

    SSH分页技术详解与实例

    7. **实际项目中的适应性**:在实际项目中,可能需要根据数据库类型和具体需求调整分页SQL的写法,例如Oracle支持ROWNUM,而MySQL则可以使用LIMIT和OFFSET。 **优化技巧**: 1. **缓存**:对于不经常变动的数据,...

    Oracle分页查询(很不错的介绍)

    Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以帮助用户高效地获取数据集的一部分,而不是一次性加载所有结果。本篇文章将详细介绍Oracle中的分页查询,并提供一种常用的分页查询语句格式和一...

    Oracle的分页查询语句 Oracle分页的存储过程

    首先,Oracle的分页查询语句通常遵循一个标准格式,如下所示: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( SELECT * FROM TABLE_NAME ) A WHERE ROWNUM ) WHERE RN &gt;= 21 ``` 在这个例子中,最内层...

    oracle分页操作

    总的来说,Oracle的分页查询是一个涉及查询优化、连接策略和伪列运用的复杂话题。正确使用分页可以显著提高查询性能,减少资源消耗,为用户提供更好的体验。理解这些原理和技巧,对优化数据库查询性能至关重要。

    sqlserver分页的两种写法分别介绍

    **一、传统的分页写法** 在SQL Server 2005之前,或者不支持窗口函数的版本中,一种常用的分页方法是通过子查询和`NOT IN`或`NOT EXISTS`来实现。以下是一个使用存储过程的例子: ```sql CREATE PROC p_paged1 @...

    MyBatis通过 JDBC连接 PostgreSQL数据库 最小例子

    在本文中,我们将深入探讨如何使用MyBatis框架通过JDBC连接PostgreSQL数据库,构建一个最小的示例项目。MyBatis是一个轻量级的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接嵌入到Java代码中,提供...

    oracle的伪列与分页

    在Oracle数据库中,伪列(Pseudocolumn)并非真正意义上的列,而是一种特殊的数据库对象,它看起来像表中的一个列,但实际上并不存储数据。Oracle提供了一些内置的伪列供用户使用,如`ROWID`和`ROWNUM`等,这些伪列...

    基于java web学生管理系统数据库mysql基本没有css样式,很基础的写法

    这是一个基于Java Web技术的学生管理系统,该系统以MySQL作为数据库存储学生信息,并且具有基本的数据操作功能,如列表展示、分页、增删改查。由于描述中提到“基本没有CSS样式”,因此我们可以推断,这个项目更侧重...

Global site tag (gtag.js) - Google Analytics