`
lh44601
  • 浏览: 7391 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

自己写的项目开发框架(3)--完成持久类Persistence功能

 
阅读更多

上一篇中我们已经创建好我们的持久类Persistence,持久类就是对数据库数据进行相应操作的一个工具实现类。

现在来看看Persistence都能干些什么.

代码如下:

package com.lh446.commons;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.beanutils.DynaBean;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.lh446.commons.code.IsAble;
import com.lh446.commons.code.IsMenu;
import com.lh446.commons.util.BeanHelper;
import com.lh446.commons.util.HQLInfoHelper;
import com.lh446.commons.util.Page;
import com.lh446.commons.util.PageMapBean;
import com.lh446.commons.util.SQLHelper;
import com.lh446.exception.BussinessException;

public class Persistence {
	private JdbcTemplate jdbcTemplate;
	private HibernateTemplate hibernateTemplate;

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

		this.jdbcTemplate = jdbcTemplate;
	}

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	/**
	 * 保存操作
	 * 
	 * @param obj
	 * @return
	 */
	public Serializable saveObj(Object obj) {
		return hibernateTemplate.save(obj);
	}

	/**
	 * 更新操作
	 * 
	 * @param obj
	 */
	public void updateObj(Object obj) {
		hibernateTemplate.update(obj);
	}

	/**
	 * 删除操作
	 * 
	 * @param obj
	 */
	public void deleteObj(Object obj) {
		hibernateTemplate.delete(obj);
	}

	/**
	 * 根据主键获取实体
	 * 
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T> T getEntityById(Class<T> clazz, Serializable id) {
		return (T) hibernateTemplate.get(clazz, id);
	}

	/**
	 * 根据主键删除实体
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 */
	public <T> void deleteObjById(Class<T> clazz, Serializable id) {
		hibernateTemplate.delete(getEntityById(clazz, id));
	}

	/**
	 * 删除所有实体
	 * 
	 * @param list
	 */
	public void deleteAll(Collection<?> list) {
		hibernateTemplate.deleteAll(list);
	}

	/**
	 * 查询数据
	 * 
	 * @param hql
	 * @return
	 */
	public List queryList(final HQLInfo hql) {
		return query(hql, null).getResult();
	}

	/**
	 * 查询操作,返回带分页信息的实体
	 * 
	 * @param hql
	 * @return
	 */
	public PageMapBean query(final HQLInfo hql) {
		return query(hql, null);
	}

	/**
	 * 制定分页信息查询操作,返回带分页信息的实体,
	 * @param hql
	 * @param page
	 * @return
	 */
	public PageMapBean query(final HQLInfo hql, final Page page) {
		if (page != null && page.getPage() == null)
			page.setPage(1);
		if (page != null && page.getPageSize() == null)
			page.setPageSize(10);
		HQLInfo hql2 = new HQLInfo();
		Page nextPage = new Page();
		try {
			BeanHelper.copyProperties(hql, hql2);
			if (page != null)
				BeanHelper.copyProperties(page, nextPage);

		} catch (IllegalArgumentException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IllegalAccessException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (InvocationTargetException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (page != null && page.getUsepager()) {
			Integer size = getTotalSize(hql2);
			nextPage.setTotalSize(size);
		} else {
			nextPage = null;
		}
		List list;
		if (hql.isHQL()) {
			list = (List) hibernateTemplate
					.executeWithNativeSession(new HibernateCallback() {

						@Override
						public Object doInHibernate(Session arg0)
								throws HibernateException, SQLException {
							// TODO Auto-generated method stub
							List list = null;
							try {
								Query query = HQLInfoHelper.createQuery(arg0,
										hql);
								if (page != null && page.getUsepager()) {
									query.setFirstResult((page.getPage() - 1)
											* page.getPageSize());
									query.setMaxResults(page.getPageSize());
								}
								list = query.list();
							} catch (Exception e) {
								e.printStackTrace();
								throw new BussinessException("查询数据库出现异常!");
							}
							return list;
						}
					});
		} else {
			list = (List<DynaBean>) jdbcTemplate
					.execute(new ConnectionCallback() {
						@Override
						public Object doInConnection(Connection arg0)
								throws SQLException, DataAccessException {
							// TODO Auto-generated method stub
							PreparedStatement ps = null;
							ResultSet rs = null;
							List<DynaBean> list = new ArrayList<DynaBean>();
							try {
								if (page != null && page.getUsepager()) {
									hql.setSql(hql.getSql()
											+ " limit "
											+ ((page.getPage() - 1) * page
													.getPageSize()) + ","
											+ page.getPageSize());
								}
								ps = (PreparedStatement) SQLHelper
										.createStatement(hql, hibernateTemplate
												.getSessionFactory(), arg0);
								boolean r = ps.execute();
								String message = "";
								if (r) {
									rs = ps.getResultSet();
									while (rs.next()) {
										ResultSetMetaData rsdata = rs
												.getMetaData();
										int a = rsdata.getColumnCount();
										if (a < 1) {
											return null;
										}
										DynaBean bean = SQLHelper
												.createDynaBeanResult(rsdata,
														rs);
										if (bean != null)
											list.add(bean);
									}
								}
							} catch (Exception e) {
								e.printStackTrace();
								throw new BussinessException("查询数据库出现异常!");
							} finally {
								try {
									if (rs != null)
										rs.close();
								} catch (Exception ex) {
									ex.printStackTrace();
									throw new BussinessException(
											"查询数据库出现异常!无法关闭ResultSet!");
								}
								try {
									if (ps != null)
										ps.close();
								} catch (Exception ex) {
									ex.printStackTrace();
									throw new BussinessException(
											"查询数据库出现异常!无法关闭PreparedStatement!");
								}
								try {
									if (arg0 != null)
										arg0.close();
								} catch (Exception ex) {
									ex.printStackTrace();
									throw new BussinessException(
											"查询数据库出现异常!无法关闭Connection!");
								}
							}
							return list;
						}
					});

		}
		PageMapBean bean = new PageMapBean(nextPage, list);
		return bean;
	}
    /**
     * 获取查询的总结果数
     * @param hql
     * @return
     */
	public Integer getTotalSize(HQLInfo hql) {
		hql = fomatCountSql(hql);
		String sql = SQLHelper.changeHQLtoSQL(hql.getSql(),
				hibernateTemplate.getSessionFactory());
		List<Integer> list = jdbcTemplate.query(sql, hql.getValues(),
				new RowMapper() {
					@Override
					public Object mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						// TODO Auto-generated method stub
						try {
							Integer totalsize = rs.getInt("totalsize");
							return totalsize;
						} catch (Exception e) {
							e.printStackTrace();
						}
						return null;
					}
				});
		if (list != null && list.size() > 0)
			return list.get(0);
		return 0;
	}
    /**
     * 格式化获取总数量的sql语句
     * @param hql
     * @return
     */
	private HQLInfo fomatCountSql(HQLInfo hql) {
		String sql = hql.getSql();
		sql = "select count(*) totalsize " + sql.substring(sql.indexOf("from"));
		hql.setHQL(false);
		hql.setSql(sql);
		return hql;
	}

	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		StringBuffer bf = new StringBuffer();
		bf.append("select a.functionId,a.functionName,a.createTime from Functionn a ");
		bf.append(" where a.ismenu='").append(IsMenu.ISMENU).append("'");
		bf.append(" and a.isable='").append(IsAble.ABLED).append("'");
		bf.append(" group by a.functionId");
		bf.append(" order by a.functionId,a.functionindex");
		String sql = HQLInfoHelper.formatSQLStr(bf.toString());
		String[] params = HQLInfoHelper.getParaNames(sql);
		HQLInfo info = HQLInfoHelper.getHQLInfo(sql, params, null);
		// String
		// aa=SQLHelper.changeHQLtoSQL(ss,(SessionFactory)ctx.getBean("sessionFactory"));
		// List<DynaBean>
		// list=((Persistence)ctx.getBean("persistence")).query(info);
		// for (DynaBean dynaBean : list) {
		// System.out.println((Integer)dynaBean.get("functionId"));
		// System.out.println((Timestamp)dynaBean.get("createTime"));
		// }
	}
}

通过上面代码可以看到Persistence无非就是一些常用的增,删,该,查操作。

对于PageMapBean是一个封装了查询数据和分页信息的bean:

package com.lh446.commons.util;

import java.util.List;

public class PageMapBean {
	//分页信息
	private Page page;
	//查询出来的数据
    private List result;
	public Page getPage() {
		return page;
	}
	public void setPage(Page page) {
		this.page = page;
	}
	public List getResult() {
		return result;
	}
	public void setResult(List result) {
		this.result = result;
	}
	public PageMapBean(Page page, List result) {
		super();
		this.page = page;
		this.result = result;
	}
	public PageMapBean() {
		super();
	}
       
}


对于HQLInfo类是一个封装了查询sql的信息的类,后续将讲到。

Persistence类中的

/**
* 制定分页信息查询操作,返回带分页信息的实体,
* @param hql
* @param page
* @return
*/
public PageMapBean query(final HQLInfo hql, final Page page) 方法就实现了查询操作,支持HQL和jdbc的查询操作。

分享到:
评论

相关推荐

    ejb3-persistence

    【ejb3-persistence】是Java企业版(Enterprise JavaBeans,EJB)3.0规范中的持久化模块,它是Java后端开发中的一个重要组件,主要处理数据库操作和对象关系映射(Object-Relational Mapping,ORM)。在Spring框架中...

    ejb3-persistence.jar

    《ejb3-persistence.jar:Java企业级持久化框架详解》 在Java开发领域,ejb3-persistence.jar是一个至关重要的组件,它涉及到Java企业版(Java EE)中的企业级bean(EJB)3.0规范,特别是持久化(Persistence)部分...

    ejb3-persistence.jar hibernate-annotations.jar

    总结来说,`ejb3-persistence.jar`和`hibernate-annotations.jar`是Java企业级开发中的重要组件,它们为开发者提供了简单易用的持久化框架,使得在面向对象的编程环境下可以轻松地管理和操作数据库,提升了开发效率...

    high-performance-java-persistence.pdf

    《High-Performance Java Persistence》是一本专注于Java持久化性能的书籍,作者Vlad Mihalcea,涵盖了数据库服务器、连接层、应用数据访问层、ORM框架、原生查询构建器、性能与扩展性、响应时间、吞吐量、数据库...

    ejb-3_0-pfd-spec-persistence.pdf

    《ejb-3_0-pfd-spec-persistence.pdf》这一文档深入探讨了EJB(Enterprise JavaBeans)3.0版本的规范与Java Persistence API(Java持久化API),为开发人员提供了一个全面的理解框架,以便在企业级应用中实现更为...

    ejb-3_0-pr-spec-persistence

    Java Persistence API,简称JPA,是EJB 3.0规范中一个重要的组成部分,它提供了一套用于管理持久化对象的标准API,实现了对象关系映射(ORM)功能。JPA允许开发者将Java对象映射到数据库表,通过对象操作间接实现对...

    JPA 基本jar 文件 附带mysql-`jar文件和persistence.xml配置文件

    - `commons-collections-3.1.jar`: Apache Commons Collections是Apache软件基金会的一个项目,提供了大量的Java集合操作工具和算法,增强Java集合框架的功能。 - `antlr-2.7.6.jar`: ANTLR是一个强大的解析器生成...

    persistence-2_0-final-jar_and_schema.zip

    《深入理解JPA:基于persistence-2_0-final-jar_and_schema.zip的解析》 在Java开发领域,Java Persistence API(JPA)是用于管理关系数据库中的对象持久化的一个重要标准。它为开发者提供了一种简洁、面向对象的...

    javax.persistence-2.0.0.jar 包

    《Java持久化API(JPA)2.0详解——基于javax.persistence-2.0.0.jar包》 Java持久化API(Java Persistence API,简称JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它为Java应用程序提供了一种对象/...

    Java-Persistence-with-MyBatis3源码

    MyBatis3是一个优秀的Java持久层框架,它提供了灵活的SQL映射和对象关系映射功能,使得开发人员能够避免使用JDBC代码的繁琐和易出错性。本教程将深入探讨MyBatis3的核心原理,通过对源码的分析,帮助读者掌握其工作...

    Java-Persistence-with-MyBatis3

    《Java-Persistence-with-MyBatis3》这本书深入探讨了如何使用MyBatis3框架进行持久化开发。MyBatis3是一个轻量级的Java持久层框架,它提供了灵活的SQL映射机制,使得开发者可以方便地将数据库操作与业务逻辑相结合...

    ejb3.0学习资料PDF格式

    EJB 3.0与JPA紧密集成,而JPA又可以与ORM框架(如Hibernate)结合,为开发者提供了强大的对象关系映射功能。这允许开发者以面向对象的方式操作数据库,避免了传统的SQL编程的繁琐。 **4. 无状态会话Bean与有状态...

    persistenceLayer

    - **持久机制类层次结构**(The Persistence Mechanism Class Hierarchy):提供了一种抽象方式来处理不同的持久化策略和技术。 - **映射类**(The Map Classes):用于处理数据映射,如将对象属性映射到数据库字段...

    《J2EE应用框架设计与项目开发》

    《J2EE应用框架设计与项目开发》是针对企业级Java应用开发的一门深度学习资料,旨在帮助开发者理解和掌握如何构建高效、可扩展且结构化的应用程序。J2EE(Java Platform, Enterprise Edition)是一个用于开发和部署...

    High-Performance.Java.Persistence

    本书详细阐述了Java持久化的各种概念,包括JPA(Java Persistence API)和其他相关的框架和技术,旨在帮助开发者理解和掌握高效的数据管理策略。 在Java世界中,持久化是应用程序与数据存储之间桥梁的关键部分,它...

    比较实用的MVC框架类-JAVA

    **标题与描述解析** 标题中的“比较实用的MVC框架类-JAVA”指的是这是一个使用Java语言实现的MVC(Model-View-Controller)框架。...开发者可以通过学习和使用这个框架,提高开发效率并降低项目复杂性。

    javax.persistence.jar.zip

    在Java项目中,可以将这个JAR文件添加到项目的类路径中,以便使用JPA的相关功能。为了确保兼容性和性能,需要检查这个JAR文件的版本信息,确保它与正在使用的Java版本和所选的数据库系统相匹配。 总的来说,`javax....

Global site tag (gtag.js) - Google Analytics