自己写的项目开发框架(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】是Java企业版(Enterprise JavaBeans,EJB)3.0规范中的持久化模块,它是Java后端开发中的一个重要组件,主要处理数据库操作和对象关系映射(Object-Relational Mapping,ORM)。在Spring框架中...
《ejb3-persistence.jar:Java企业级持久化框架详解》 在Java开发领域,ejb3-persistence.jar是一个至关重要的组件,它涉及到Java企业版(Java EE)中的企业级bean(EJB)3.0规范,特别是持久化(Persistence)部分...
总结来说,`ejb3-persistence.jar`和`hibernate-annotations.jar`是Java企业级开发中的重要组件,它们为开发者提供了简单易用的持久化框架,使得在面向对象的编程环境下可以轻松地管理和操作数据库,提升了开发效率...
《High-Performance Java Persistence》是一本专注于Java持久化性能的书籍,作者Vlad Mihalcea,涵盖了数据库服务器、连接层、应用数据访问层、ORM框架、原生查询构建器、性能与扩展性、响应时间、吞吐量、数据库...
《ejb-3_0-pfd-spec-persistence.pdf》这一文档深入探讨了EJB(Enterprise JavaBeans)3.0版本的规范与Java Persistence API(Java持久化API),为开发人员提供了一个全面的理解框架,以便在企业级应用中实现更为...
Java Persistence API,简称JPA,是EJB 3.0规范中一个重要的组成部分,它提供了一套用于管理持久化对象的标准API,实现了对象关系映射(ORM)功能。JPA允许开发者将Java对象映射到数据库表,通过对象操作间接实现对...
- `commons-collections-3.1.jar`: Apache Commons Collections是Apache软件基金会的一个项目,提供了大量的Java集合操作工具和算法,增强Java集合框架的功能。 - `antlr-2.7.6.jar`: ANTLR是一个强大的解析器生成...
《深入理解JPA:基于persistence-2_0-final-jar_and_schema.zip的解析》 在Java开发领域,Java Persistence API(JPA)是用于管理关系数据库中的对象持久化的一个重要标准。它为开发者提供了一种简洁、面向对象的...
《Java持久化API(JPA)2.0详解——基于javax.persistence-2.0.0.jar包》 Java持久化API(Java Persistence API,简称JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它为Java应用程序提供了一种对象/...
MyBatis3是一个优秀的Java持久层框架,它提供了灵活的SQL映射和对象关系映射功能,使得开发人员能够避免使用JDBC代码的繁琐和易出错性。本教程将深入探讨MyBatis3的核心原理,通过对源码的分析,帮助读者掌握其工作...
《Java-Persistence-with-MyBatis3》这本书深入探讨了如何使用MyBatis3框架进行持久化开发。MyBatis3是一个轻量级的Java持久层框架,它提供了灵活的SQL映射机制,使得开发者可以方便地将数据库操作与业务逻辑相结合...
EJB 3.0与JPA紧密集成,而JPA又可以与ORM框架(如Hibernate)结合,为开发者提供了强大的对象关系映射功能。这允许开发者以面向对象的方式操作数据库,避免了传统的SQL编程的繁琐。 **4. 无状态会话Bean与有状态...
- **持久机制类层次结构**(The Persistence Mechanism Class Hierarchy):提供了一种抽象方式来处理不同的持久化策略和技术。 - **映射类**(The Map Classes):用于处理数据映射,如将对象属性映射到数据库字段...
《J2EE应用框架设计与项目开发》是针对企业级Java应用开发的一门深度学习资料,旨在帮助开发者理解和掌握如何构建高效、可扩展且结构化的应用程序。J2EE(Java Platform, Enterprise Edition)是一个用于开发和部署...
本书详细阐述了Java持久化的各种概念,包括JPA(Java Persistence API)和其他相关的框架和技术,旨在帮助开发者理解和掌握高效的数据管理策略。 在Java世界中,持久化是应用程序与数据存储之间桥梁的关键部分,它...
**标题与描述解析** 标题中的“比较实用的MVC框架类-JAVA”指的是这是一个使用Java语言实现的MVC(Model-View-Controller)框架。...开发者可以通过学习和使用这个框架,提高开发效率并降低项目复杂性。
在Java项目中,可以将这个JAR文件添加到项目的类路径中,以便使用JPA的相关功能。为了确保兼容性和性能,需要检查这个JAR文件的版本信息,确保它与正在使用的Java版本和所选的数据库系统相匹配。 总的来说,`javax....