对于在Web容器中使用EntityManager对象,这里需要做一些改进,才能更安全。Servlet是非线程安全的,所以需要改变获得EntityManager对象的方式,这里使用ThreadLocal类。
ThreadLocal就是为每一个使用某变量的线程都提供一个该变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量,这就解决了Servlet非线程安全的问题。
以下EntityManager对象非容器EJB容器托管,手动控制事务处理。可用于JAVA SE环境。如果是EJB容器管理,或者WEB容器,可以直接注入@PersistenceContext,使用JTA、RESOURCE_LOCAL事务管理。
import java.io.Serializable; import java.util.Collection; import java.util.List; /** * * Title: 数据库操作接口
* Description:EasyJWeb Tools中的添删改查等业务引擎使用该DAO进行数据库操作
* Copyright: Copyright (c) 2006
* Company: EasyJF开源团队
* @author 大峡 * @version 0.1 */ public interface IDAO { /** * 把对象保存到持久层 * * @param obj * @return 若保存成功,则返回true,否则返回false * @throws IdExistException */ boolean save(T obj); /** * 更新持久层中的对象 * * @param obj * @return 若修改成功,则返回true,否则返回false */ boolean update(T obj); /** * 删除持久层中的对象 * * @param obj * @return 若删除操作成功,则返回true,否则返回false */ boolean del(T obj); /** * 根据类及主键加载对象 * * @param clz * @param id * @return 若查找到指定主键值的持久对象,则返回该对象,否则返回null */ T get(Class clz, Serializable id); /** * 根据类、字段名及字段值加载对象,只加载一条符合条件的对象。 * * @param clz * @param fieldName * @param value * @return 若查询到指定属性及值的持久对象,则返回该对象,否则返回null */ T getBy(Class clz, String fieldName, Serializable value); /** * 根据条件查询对象 * * @param clz 类名 * @param scope 查询条件 * @return 返回查询的记录结果记录 */ List query(Class clz, String scope); /** * 根据条件、条件参数查询对象 * * @param clz 类名 * @param scope 查询条件 * @param paras 查询参数 * @return 返回查询的记录结果集 */ List query(Class clz, String scope, Collection paras); /** * 查询符合条件的对象,从begin开始取max条记录 * * @param clz Java类 * @param scope 查询条件 * @param paras 查询参数 * @param begin 返回有效结果开始记录数 * @param max 返回的最多记录数 * @return 返回查询的记录结果集 */ List query(Class clz, String scope, Collection paras, int begin, int max); /** * 执行sql语句,并返回一个对象,如select count(*) from tableName等 * @param sql sql语句 * @return 返回查询结果,若没有结果则返回null */ Object uniqueResult(String sql); /** * 根据sql语句及查询参数执行查询,并返回一个唯一对象,如select count(*) from tableName where filed=? * @param sql * @param paras * @return 返回单一的查询结果,若没有结果则返回null */ Object uniqueResult(String sql,Collection paras); /** * 执行任意sql语句,返回受影响的记录数 * @param sql sql语句 * @return 返回受影响的记录数 */ int execute(String sql); /** * 根据sql语句及参数执行数据库操作,返回受影响的记录数 * @param sql sql语句 * @param paras 参数 * @return 返回受影响的记录数 */ int execute(String sql,Collection paras); }
***********************************************
***********************************************
import java.io.Serializable; import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Query; public class EntityMangerDaoSurport implements IDAO { private static EntityManagerFactory emf; private static ThreadLocal em; public EntityManager getEntityManager() { EntityManager manager = em.get(); if (manager == null) { manager = emf.createEntityManager(); em.set(manager); } return manager; } public boolean del(Object obj) { getEntityManager().getTransaction().begin(); if (!getEntityManager().contains(obj)) obj = getEntityManager().merge(obj); getEntityManager().remove(obj); getEntityManager().getTransaction().commit(); return true; } public int execute(String sql) { return execute(sql, null); } public int execute(String sql, Collection paras) { Query query = getEntityManager().createNativeQuery(sql); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } return query.executeUpdate(); } public T get(Class clz, Serializable id) { return getEntityManager().find(clz, id); } public T getBy(Class clz, String fieldName, Serializable value) { Query query = getEntityManager().createQuery( "from " + clz + " where fieldName=?"); query.setParameter(0, value); return (T) query.getSingleResult(); } public List query(Class clz, String scope) { return query(clz, scope, null); } public List query(Class clz, String scope, Collection paras) { return query(clz, scope, null, -1, -1); } public List query(Class clz, String scope, Collection paras, int begin, int max) { Query query = getEntityManager().createQuery( "from " + clz + " where " + scope); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } if (begin >= 0 && max > 0) { query.setFirstResult(begin); query.setMaxResults(max); } return query.getResultList(); } public boolean save(Object obj) { getEntityManager().getTransaction().begin(); getEntityManager().persist(obj); getEntityManager().getTransaction().commit(); return true; } public Object uniqueResult(String sql) { return uniqueResult(sql, null); } public Object uniqueResult(String sql, Collection paras) { Query query = getEntityManager().createQuery(sql); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } return query.getSingleResult(); } public boolean update(Object obj) { getEntityManager().getTransaction().begin(); getEntityManager().merge(obj); getEntityManager().getTransaction().commit(); return true; } }
不是每个人都能制定成标准,但是每个人都有追求标准和超越标准的权利!!