`

JAVA_JDBC面向对象分页(初步设计一之mysql)

    博客分类:
  • JAVA
阅读更多

看了很多网上的分页写法,有兴趣的可以直接去看看hibernate的源码,里面的写法还是值得参考,先理清思路:

1.要想分页,就要获取分页所需信息,这里用一个类PageInfo表示:

哪个对象,真正面向对象分页就要配置实体和数据库的映射关系,通过解析配置文件加上java的反射技术就ok了。

有时间会慢慢补充完整。

以下是各种数据库的分页语句:

以@开头的都是自定义变量,到后面都会被替换成具体的内容,这样写看起清晰点(个人见解),初步设计如下:
@PAGE_SIZE表示每页显示多少条
@CURRENT_PAGE 当前要查看的页数
@TABLE_NAME 表名
@PKEY 主键
@criterions 条件集合
@orders 排序集合

sqk2k5分页语句:

 

分页结果集语句:
SELECT TOP(@PAGE_SIZE) * FROM @TABLE_NAME WHERE @PKEY NOT IN 
(SELECT TOP(@PAGE_SIZE*(@CURRENT_PAGE-1)) @PKEY FROM @TABLE_NAME WHERE 1=1 @CONDITIONS @ORDERS) @CONDITIONS @ORDERS

统计语句:
SELECT COUNT(*) FROM @TABLE_NAME WHERE 1=1 @CONDITIONS

 

mysql分页语句:

分页结果集语句:
SELECT * FROM @TABLE_NAME WHERE 1=1 @CONDITIONS @ORDERS LIMIT @FIRST_INDEX,@PAGE_SIZE 
统计语句:
SELECT COUNT(*) FROM @TABLE_NAME WHERE 1=1 @CONDITIONS 

  

 oracle分页语句:

 

 以下以mysql做实验,太细节的东西就不必追究了,主要是核心思想的实现:

测试准备:

1.数据库paginationdb,表student_;

2.数据库脚本:

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for student_
-- ----------------------------
DROP TABLE IF EXISTS `student_`;
CREATE TABLE `student_` (
  `id_` int(11) NOT NULL auto_increment,
  `name_` varchar(20) default NULL,
  `sex_` varchar(20) default NULL,
  `age_` int(11) default NULL,
  `grade_` varchar(60) default NULL,
  `class_` varchar(60) default NULL,
  PRIMARY KEY  (`id_`)
) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `student_` VALUES ('1', 'student1', '男', '11', '一年级', '二班');
INSERT INTO `student_` VALUES ('2', 'student2', '男', '12', '一年级', '二班');
INSERT INTO `student_` VALUES ('3', 'student3', '男', '13', '一年级', '二班');
INSERT INTO `student_` VALUES ('4', 'student4', '女', '14', '一年级', '二班');
INSERT INTO `student_` VALUES ('5', 'student5', '女', '15', '一年级', '二班');
INSERT INTO `student_` VALUES ('6', 'student6', '男', '16', '二年级', '一班');
INSERT INTO `student_` VALUES ('7', 'student7', '男', '17', '二年级', '一班');
INSERT INTO `student_` VALUES ('8', 'student8', '女', '18', '一年级', '一班');
INSERT INTO `student_` VALUES ('9', 'story1', '男', '19', '一年级', '二班');
INSERT INTO `student_` VALUES ('10', 'story2', '女', '11', '一年级', '一班');
INSERT INTO `student_` VALUES ('11', 'story3', '男', '12', '二年级', '一班');
INSERT INTO `student_` VALUES ('12', 'story4', '女', '13', '一年级', '二班');
INSERT INTO `student_` VALUES ('13', 'story5', '男', '14', '一年级', '一班');
INSERT INTO `student_` VALUES ('14', 'story6', '男', '15', '一年级', '一班');
INSERT INTO `student_` VALUES ('15', 'story7', '女', '16', '一年级', '二班');
INSERT INTO `student_` VALUES ('16', 'story8', '男', '17', '一年级', '二班');
INSERT INTO `student_` VALUES ('17', 'story9', '男', '18', '一年级', '二班');
INSERT INTO `student_` VALUES ('18', 'story8', '男', '15', '一年级', '二班');
INSERT INTO `student_` VALUES ('19', 'story8', '男', '16', '一年级', '二班');
INSERT INTO `student_` VALUES ('20', 'story10', '保密', '16', '一年级', '二班');

 

3.测试数据

 

以下是分页类(pageInfo)的初步设计:

package org.forever.entities;

import java.util.List;

//分页信息
public class PageInfo {

	private int currentPage = 1;// 当前页
	private int totalPage;// 总页数
	private int totalItems;// 总条数
	private int pageSize = 10;// 每页显示多少条
	private List<?> result;// 结果集合

	private String tableName;// 表名
	private String pkey;// 主键
	private Condition[] conditions;// 条件集合
	private Order[] orders;// 排序集合

	public PageInfo() {

	}

	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 getTotalItems() {
		return totalItems;
	}

	public void setTotalItems(int totalItems) {
		this.totalItems = totalItems;
	}

	public List<?> getResult() {
		return result;
	}

	public void setResult(List<?> result) {
		this.result = result;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public String getPkey() {
		return pkey;
	}

	public void setPkey(String pkey) {
		this.pkey = pkey;
	}

	public Condition[] getConditions() {
		return conditions;
	}

	public void setConditions(Condition[] conditions) {
		this.conditions = conditions;
	}

	public Order[] getOrders() {
		return orders;
	}

	public void setOrders(Order[] orders) {
		this.orders = orders;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

}

 操作类型枚举:

package org.forever.entities;
//操作类型
public enum Operation {
	IN,
	EQ,
	GT,
	LT,
	NE,
	GE,
	LE,
	BETWEEN,
	LIKE
	
	
}

 排序类型枚举:

package org.forever.entities;

public enum OrderType {

	ASC,
	DESC
	
}

 条件操作:

package org.forever.entities;

//条件操作
public class Condition {

	private String propertyName;// 属性名
	private Object propertyValue;// 属性值
	private Operation operation;// 操作符号

	public Condition() {
	}

	public String getPropertyName() {
		return propertyName;
	}

	public void setPropertyName(String propertyName) {
		this.propertyName = propertyName;
	}

	public Object getPropertyValue() {
		return propertyValue;
	}

	public void setPropertyValue(Object propertyValue) {
		this.propertyValue = propertyValue;
	}

	public Operation getOperation() {
		return operation;
	}

	public void setOperation(Operation operation) {
		this.operation = operation;
	}

	public Condition(String propertyName, Object propertyValue,
			Operation operation) {
		super();
		this.propertyName = propertyName;
		this.propertyValue = propertyValue;
		this.operation = operation;
	}
	
	

}

 排序操作:

package org.forever.entities;

public class Order {

	private String propertyName;// 属性名
	private OrderType orderType;// 排序类型

	public Order() {

	}

	public Order(String propertyName, OrderType orderType) {
		super();
		this.propertyName = propertyName;
		this.orderType = orderType;
	}

	public String getPropertyName() {
		return propertyName;
	}

	public void setPropertyName(String propertyName) {
		this.propertyName = propertyName;
	}

	public OrderType getOrderType() {
		return orderType;
	}

	public void setOrderType(OrderType orderType) {
		this.orderType = orderType;
	}

}

 student类:

package org.forever.entities;

import java.io.Serializable;

public class Student implements Serializable{
	private static final long serialVersionUID = -1646247293734375803L;
	public Integer id;//主键
	public String name;//名字
	public String sex;//性别
	public String grade;//年级
	public String stuClass;//班级
	public int age;//年龄

	public Student() {

	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}

	public String getStuClass() {
		return stuClass;
	}

	public void setStuClass(String stuClass) {
		this.stuClass = stuClass;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	
}

 学生业务:

package org.forever.manager;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.forever.entities.Condition;
import org.forever.entities.Operation;
import org.forever.entities.Order;
import org.forever.entities.OrderType;
import org.forever.entities.PageInfo;
import org.forever.entities.Student;

import com.mysql.jdbc.Driver;

public class StudentManager {
	
	public void doPager(PageInfo pageInfo){
		
		StringBuffer sqlPage = new StringBuffer("SELECT * FROM @TABLE_NAME WHERE 1=1 @CONDITIONS @ORDERS LIMIT @FIRST_INDEX,@PAGE_SIZE ");
		StringBuffer sqlCount = new StringBuffer("SELECT COUNT(*) FROM @TABLE_NAME WHERE 1=1 @CONDITIONS ") ;
		
		//处理条件
		Condition[]conditions = pageInfo.getConditions();
		StringBuffer condition = new StringBuffer();
		List<Object> params = new ArrayList<Object>();
		
		if(conditions!=null && conditions.length>0){
			for (Condition item : conditions) {
				
				switch (item.getOperation()) {
				case EQ:
					condition.append(" AND (" + item.getPropertyName()+" =?) ");
					break;
				case LIKE:
					condition.append(" AND (" + item.getPropertyName()+" LIKE ?) ");
					break;
				case BETWEEN:
					condition.append(" AND (" + item.getPropertyName() + " BETWEEN ? AND ?) ");
					break;
				case IN:
					condition.append(" AND (" + item.getPropertyName() + " IN (");
					for (int i = 0; i < ((Object[])item.getPropertyValue()).length; i++) {
						condition.append("?,");
					}
					condition.replace(condition.length()-1, condition.length(), "");
					condition.append(")) ");
					//.....
				default:
					break;
				}
				
				if(item.getOperation() == Operation.LIKE){
					params.add("%"+item.getPropertyValue()+"%");
				}else if(item.getOperation() == Operation.BETWEEN){
					params.add(((Object[])item.getPropertyValue())[0]);
					params.add(((Object[])item.getPropertyValue())[1]);
				}else if(item.getOperation() == Operation.IN){
					for (Object object : (Object[])item.getPropertyValue()) {
						params.add(object);
					}
				}else{
					params.add(item.getPropertyValue());
				}
				
				
			}
		}
		//处理排序
		Order[]orders = pageInfo.getOrders();
		StringBuffer orderList = new StringBuffer(" ORDER BY ");
		if(orders!=null && orders.length>0){
			for (Order item : orders) {
				switch (item.getOrderType()) {
				case ASC:
					orderList.append(item.getPropertyName()+" ASC ,");
					break;
						
				case DESC:
					orderList.append(item.getPropertyName()+" DESC ,");
					break;
				}
			}
			orderList.replace(orderList.length()-1, orderList.length(), "");
		}else{
			orderList.append(" @PKEY ASC ");
		}
		
		String sqlp=sqlPage.toString()
					.replaceAll("@CONDITIONS", condition.toString())
					.replaceAll("@ORDERS", orderList.toString())
					.replaceAll("@TABLE_NAME", pageInfo.getTableName())
					.replaceAll("@PKEY", pageInfo.getPkey())
					.replaceAll("@FIRST_INDEX", (pageInfo.getCurrentPage()-1)*pageInfo.getPageSize()+"")
					.replaceAll("@PAGE_SIZE", pageInfo.getPageSize()+"");
		
		String sqlc = sqlCount.toString()
					.replaceAll("@CONDITIONS", condition.toString())
					.replaceAll("@TABLE_NAME", pageInfo.getTableName())
					.replaceAll("@PKEY", pageInfo.getPkey());
		Connection connection = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		try {
			Class.forName(Driver.class.getName());
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/paginationdb", "root", "root");
			statement = connection.prepareStatement(sqlc);
			for (int i = 0; i < params.size(); i++) {
				statement.setObject(i+1, params.get(i));
			}
			resultSet = statement.executeQuery();
			resultSet.next();
			int totalItems = resultSet.getInt(1);
			//设置总条数
			pageInfo.setTotalItems(totalItems);
			//设置总页数
			pageInfo.setTotalPage(
					totalItems%pageInfo.getPageSize()==0?
							totalItems/pageInfo.getPageSize():
								totalItems/pageInfo.getPageSize()+1
			);
			//设置结果集
			statement = connection.prepareStatement(sqlp);
			for (int i = 0; i < params.size(); i++) {
				statement.setObject(i+1, params.get(i));
			}
			resultSet = statement.executeQuery();
			List<Student> students = new ArrayList<Student>();
			while(resultSet.next()){
				Student student = new Student();
				student.setId(resultSet.getInt("id_"));
				student.setName(resultSet.getString("name_"));
				student.setSex(resultSet.getString("sex_"));
				student.setAge(resultSet.getInt("age_"));
				student.setGrade(resultSet.getString("grade_"));
				student.setStuClass(resultSet.getString("class_"));
				students.add(student);
			}
			
			pageInfo.setResult(students);
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void main(String[] args) {
		StudentManager studentManager = new StudentManager();
		PageInfo pageInfo = new PageInfo();
		pageInfo.setTableName("student_");//指定查询表名
		pageInfo.setPkey("id_");//指定该表的主键名
		pageInfo.setPageSize(2);//每页显示2条
		pageInfo.setCurrentPage(2);//查看第二页
		
		//实体暂时没有和数据库进行映射,所以条件和排序里面的属性名暂时写成数据库的属性名
		
		/*例子:查询一年级二班,名字中包含stor的,年龄在14到18的,性别是男和女的学生
		 *并且按照姓名升序排序,名字相同的按照年龄的逆序排序。 
		 */
		pageInfo.setConditions(
				new Condition[]{
					new Condition("grade_", "一年级", Operation.EQ),	
					new Condition("class_", "二班", Operation.EQ),
					new Condition("name_","stor",Operation.LIKE),
					new Condition("age_", new Object[]{14,18}, Operation.BETWEEN),
					new Condition("sex_",new Object[]{"男","女"},Operation.IN)
				}
		);
		
		pageInfo.setOrders(
				new Order[]{
					new Order("name_", OrderType.ASC),
					new Order("age_",OrderType.DESC)
				}
		);
		
		studentManager.doPager(pageInfo);
		System.out.println("totalPage:"+pageInfo.getTotalPage());
		System.out.println("totalItems:" + pageInfo.getTotalItems());
		for (Object item : pageInfo.getResult()) {
			System.out.println("***************");
			System.out.println(((Student)item).getId());
			System.out.println(((Student)item).getName());
			System.out.println(((Student)item).getSex());
		}
		
		
	}
	
}

 

分享到:
评论
2 楼 AbstractForever 2010-03-25  
cnyangqi 写道
奇怪的是Oracle分页语句怎么没有的。。。

有哈,在第二篇
1 楼 cnyangqi 2010-03-23  
奇怪的是Oracle分页语句怎么没有的。。。

相关推荐

    JAVA+JSP+MYSQL分页

    在IT行业中,分页是网页应用中不可或缺的功能,它能够帮助用户更有效...这样的组合既利用了JAVA的强类型和面向对象特性,也利用了JSP的便捷的视图处理能力,同时通过存储过程优化了数据库操作,提高了系统的整体性能。

    java jsp mysql分页(原代码)

    首先,Java是一种广泛使用的面向对象编程语言,常用于服务器端开发。在这里,Java被用来编写后台逻辑,处理与数据库的交互。JDBC(Java Database Connectivity)是Java中用于连接和操作数据库的标准接口,它使得...

    JAVA分页MYSQL数据库

    本示例"JAVA分页MYSQL数据库"是一个很好的教学案例,适用于J2EE初学者,它结合了基本的CRUD(创建、读取、更新、删除)操作与数据库分页技术。下面将详细解释相关的知识点。 1. **Java编程基础**:这个项目基于Java...

    java分页实例(web工程)

    1. **Java**: 作为后端编程语言,Java提供强大的面向对象特性,适合构建复杂的服务逻辑。 2. **Servlet**: Java Servlet是用于扩展服务器功能的Java类,我们可以通过它处理HTTP请求和响应。 3. **JSP (JavaServer ...

    Java+mySQL实现的购物商城项目

    Hibernate是一个对象关系映射(ORM)工具,它允许Java开发者使用面向对象的方式操作数据库,而无需直接编写SQL。在购物商城项目中,Hibernate可以帮助我们便捷地处理复杂的关联关系,如用户与订单、订单与商品之间...

    java+mysql新闻发布网站(含数据库)

    1. **Java**: Java是一种广泛使用的面向对象的编程语言,适用于网络应用开发。在这个项目中,Java作为后端服务器端的主要编程语言,负责处理HTTP请求,与数据库交互,以及业务逻辑的实现。 2. **MySQL**: MySQL是一...

    java成绩管理系统_JAVA成绩管理_java系统_

    Java成绩管理系统是一个基于Java编程语言开发的软件应用,主要用于高校或教育机构对学生考试成绩的高效管理。这个系统利用了数据库技术来存储、检索和处理大量的学生成绩数据,实现了成绩的增、删、改、查等基本操作...

    javaweb后台数据真分页

    JavaBean是Java中的一种面向对象编程规范,它定义了一种标准的组件模型,用于封装业务逻辑。在这个例子中,我们创建了一个JavaBean作为分页工具类,它包含了分页所需的参数,如当前页、每页记录数、总页数等,并...

    Java编写的简单的图书管理系统(增删改查)

    1. **Java**:Java是一种跨平台的面向对象编程语言,广泛用于后端服务器开发。在这个系统中,Java主要用于编写业务逻辑和控制层,处理用户请求,与数据库进行交互。 2. **JavaScript**:这是一种客户端脚本语言,常...

    韩顺平第70讲学生管理系统jdbc完整代码

    总结来说,这个课程将深入讲解如何利用Java JDBC技术实现一个学生管理系统,涵盖数据库设计、JDBC连接、SQL语句的编写与执行、结果集处理,以及面向对象的设计模式在系统中的应用。通过学习,开发者不仅可以掌握JDBC...

    extjs+java+mysql通用后台管理

    在“extjs-java-mysql通用后台”这个项目中,开发者通常会定义一系列RESTful API接口,这些接口由Java Spring处理,EXTJS前端通过AJAX调用这些接口,实现数据的增删改查和页面的动态更新。同时,为了保证系统的安全...

    Spring+MyBatis+SpringMvc+Mysql+Druid+PageHelper分页实现

    在现代Web开发中,Spring框架以其模块化、灵活性和强大的功能成为了Java开发的首选。而MyBatis作为轻量级的持久层框架,为数据库操作提供了...在实际开发中,这种技术栈的运用非常广泛,是Java Web开发的标准配置之一。

    springMvc+myBatis+mysql+分页(含架包)

    总结来说,"springMvc+myBatis+mysql+分页(含架包)"是一个适合初学者的项目模板,涵盖了Web开发的基础组件和技术,帮助初学者快速理解和实践MVC模式、ORM(对象关系映射)、数据库管理和分页等概念。同时,提供的...

    基于 Java 和 MySQL 实现(控制台)邮件检索功能【100012048】

    这是一个常见的课程设计任务,旨在帮助学生掌握面向对象编程、数据库操作以及用户交互的基本技能。 首先,我们需要理解Java在其中的角色。Java是一种广泛使用的面向对象的编程语言,特别适合开发跨平台的应用程序。...

    Spring+SpringMVC+Mybatis+Maven+MySql项目框架 加分页详解适合新手学习

    1. **Spring**:Spring 是一个全面的Java应用开发框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性,使得代码更加模块化和易于管理。在本项目中,Spring将作为整个系统的容器,管理其他组件的生命周期和...

    人事管理系统_java开发项目_源码

    Java作为一种跨平台的编程语言,具有面向对象、健壮性、安全性、可移植性等诸多优点,使其成为开发企业级应用的首选。本项目中,Java作为后端开发语言,负责处理业务逻辑和数据交互。 二、数据库管理 系统利用...

    JFinal增删改查加分页查询

    config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"); config.setUsername("root"); config.setPassword("password"); ``` 4. **模型定义** 在 JFinal 中,模型类...

    JAVA开发java论坛管理系统设计(源代码+论文)

    1. **Java编程语言**:作为基础开发工具,Java具有跨平台、面向对象的特点,适用于开发大型分布式应用。此项目中,Java可能用于编写控制层、业务逻辑层和数据访问层的代码。 2. **MVC(Model-View-Controller)设计...

    JDBC API 参考教程第三版

    JDBC API 提供了一种标准的方法,使得Java程序员可以使用SQL语句来访问数据库,无论是Oracle、MySQL还是其他任何支持JDBC的数据库。本教程将深入探讨JDBC API的各个方面,帮助开发者更好地理解和应用这一强大工具。 ...

Global site tag (gtag.js) - Google Analytics