自己写的项目开发框架(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的查询操作。
相关推荐
offline-persistence-toolkit 1.5.3 offline-persistence-toolkit是一个客户端JavaScript库,可在HTTP请求层提供缓存和离线支持。 该支持对用户是透明的,并且是通过Fetch API和XHR适配器完成的。 恢复与服务器的...
是一款持久层框架,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象关系映射(ORM)模型是基于Hibernate。是一款面向对象的ORM框架,JPA不...
1. 技术选型:项目采用Spring Boot作为开发框架,它提供了大量的开箱即用的插件和组件,简化了项目的配置和开发流程。同时,项目使用JPA(Java Persistence API)来实现数据持久化,便于操作数据库。 2. 功能模块:...
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1] Sun引入新的JPA ORM规范出于两个原因:其一,简化...
Stronghead是一个用Java实现的简单持久性框架。 目的是向其他人展示如何开发总体框架,尤其是持久性框架。
简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注释;JPA 的框架和接口也都非常简单, 可媲美JDBC...
Java持久性框架比较该项目比较了Java的非JPA SQL映射(持久性)框架(jOOQ,Spring JDBCTemplate等)的用法。 我们用它来找出在开发时哪个数据库层是最好的我不是在比较性能,而是在日常任务中如何使用这些框架。 我...
系统分为四个层次,即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC...
系统分为四个层次,即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC...
系统分为四个层次,即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC...
“springboot美食推荐商城的设计与实现.zip”是一个基于Spring Boot框架开发的项目压缩包。此项目主要实现了一个美食推荐商城的后端服务,包括商品管理、用户管理、订单管理等功能。商品管理:实现了商品的增删改查...
统一管理mono- & multi- smooth onboaring mono- & multi- smooth onboaring配置,建立smooth onboaring经验,融化local开发环境与CI/CT/CD设置之间的边界,从Polyglot Programming Polyglot Persistence (4P)设计...
Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束...
该系统采用Spring Boot作为后端开发框架,利用其快速开发和简化部署的特性,构建了一个高效、稳定、易于维护的服务平台。系统的数据持久化层采用JPA(Java Persistence API),它是一个Java EE 5中定义的规范,用于...
寿命-Scala和NoSQL的持久性框架。将开发重点放在域模型上,而不是数据库模型上。 长寿将您的域转换为自然,易于理解的数据库模型。 您的持久对象存储为JSON,并且我们添加了其他所有保持快速性能所需的数据库模式。 ...
该项目已停止。 C#中实现的.NET对象持久性框架。 提供一种简单的持久化对象的方法,使开发人员可以挂钩自定义验证和业务逻辑。
作为Java世界最流行的持久化框架,Hibernate已经成为开发Java EE应用系统中不可替代的支柱之一。随着EJB 3.0和Java Persistence标准的发布,Hibernate也迎来了更加成熟的新版本——Hibernate 3.2。新版本实现了Java ...
SeQuaLite是一个轻量级的Java持久性DAO框架。 尽管它的占地面积很小,但只有一个小罐子,但它既快速又强大。 功能:CRUD操作,延迟加载,级联,分页,POJO生成器。 帮助有效减少开发时间
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。尚硅谷jpa学习路线图思维导图,涵盖了jpa框架从基础知识到高级应用...
A Java library to manage bean's persistence in SQLite, SharedPreferences, JSON, XML, Properties, Yaml, CBOR. For Java and Android platform