一、iHiberBaseDAO类
package basic; import java.util.*; /** * 基于hibernate技术实现的BaseDAO基类 * @author ZHANGYANTAO * @since 2014-12-19 * @version 2017-4-20 */ public interface iHiberBaseDAO { /** * 实现单个的新瞬时实体类对象的持久化操作(添加对象到数据库中) * 该hibernate添加方法仅用于对单个的瞬时对象进行持久化操作 * @param Object 任意的Hibernate的表映射实体类对象 * @return Object 主键id, null则表示添加失败 */ public Object insert(Object obj); /** * 实现批量的新瞬时实体类对象的持久化操作(添加对象到数据库中) * 该hibernate添加方法仅用于对单个的瞬时对象进行持久化操作 * @param List<Object> 任意的Hibernate的表映射实体类对象列表 * @return boolean true成功,false失败 */ public boolean insert(List<Object> list); /** * 执行表数据删除操作 * 该hibernate删除方法仅用于对单个的瞬时对象使用其id属性进行持久化操作 * @param Class 给出对应表的Pojo类类型,如User.class * @param Serializable 对应表中主键字段的Pojo类的成员属性的值,如用户编号id * @return boolean true 成功 false 失败 */ public boolean delete(Class cls, java.io.Serializable id); /** * 执行表数据删除操作 * 该hibernate删除方法仅用于对单个的瞬时对象进行持久化删除操作 * @param Object Hibernate的表映射对象 当前为要删除表的实体类对象 * @return boolean true 成功 false 失败 */ public boolean delete(Object obj) ; /** * 修改表记录,使用对应表的实体类对象实现 * 该hibernate更新方法仅用于对单个的瞬时对象进行持久化操作 * @param Object Hibernate的表映射对象 * @return boolean true 成功 false 失败 */ public boolean update(Object obj) ; /** * 使用无参数的hql实现查询的,他将返回基于hql中查询对象的List数组对象 * @param String 符合hql结构的无参数查询语句 * @return List 失败返回null */ public List select(String hql) ; /** * 使用无参数的hql实现查询的,他将返回基于hql中查询对象的List数组对象,实现top功能 * @param String 符合hql结构的无参数查询语句 * @param String 取List值的开始索引 * @param String 取List值得结束索引 * @return List 失败返回null */ public List select(String hql,int startIndex, int length) ; /** * 使用带有参数的hql实现查询的,他将返回基于hql中查询对象的List数组对象 * @param String 符合hql结构的有参数查询语句 * @param Object[] 参数值数组 * @return List 失败返回null */ public List select(String hql,Object[] para) ; /** * 使用无参数的hql实现查询的,他将返回基于hql中查询对象的List数组对象,实现top功能 * @param String 符合hql结构的无参数查询语句 * @param String 取List值的开始索引 * @param String 取List值得结束索引 * @return List 失败返回null */ public List select(String hql,Object[] para, int startIndex, int length) ; /** * 获取带聚合函数hql语句的查询结果 * @param hql 带聚合函数的hql结构的无参数查询语句 * @return List 失败返回null */ public int selectValue(String hql); /** * 使用带有参数的hql,获取聚合函数查询的结果 * @param hql 带聚合函数的hql结构的有参数查询语句 * @param para Object[]类型的参数值数组 * @return List 失败返回null */ public int selectValue(String hql,Object[] para); /** * 分页查询返回总页数 * 可使用的hql语句为(1)"from DForum" * (2)from DForum order by forumid desc" * (3)from DForum where DUser.userid = 'zhangjs' order by forumid desc" * @param String hql 分页查询的hql字符串 * @param String pageSize 每页的结果数量 * @return int 查询得到的总页数结果 */ public int selectPages(String hql,int pageSize); /** * 分页查询返回总页数 * 可使用的hql语句为(1)"from DForum" * (2)from DForum order by forumid desc" * (3)from DForum where DUser.userid = 'zhangjs' order by forumid desc" * @param String hql 分页查询的hql字符串 * @param Object[] para 对应hql中参数的值数组 * @param String pageSize 每页的结果数量 * @return int 查询得到的总页数结果 */ public int selectPages(String hql,Object[] para, int pageSize); /** * 分页查询 * 可使用的hql语句为(1)"from DForum" * (2)from DForum order by forumid desc" * (3)from DForum where DUser.userid = 'zhangjs' order by forumid desc" * @param String hql 分页查询的无参数hql字符串 * @param int startPage 查询开始的页数 * @param int pageSize 查询要求的每页的记录数 * @return List 查询返回的记录队列 */ public List selectByPage(String hql,int startPage, int pageSize); /** * 分页查询 * 可使用的hql语句为(1)"from DForum" * (2)from DForum order by forumid desc" * (3)from DForum where DUser.userid = 'zhangjs' order by forumid desc" * @param String hql 分页查询的无参数hql字符串 * @param Object[] para 对应分页查询hql中参数的值数组 * @param int startPage 查询开始的页数 * @param int pageSize 查询要求的每页的记录数 * @return List 查询返回的记录队列 */ public List selectByPage(String hql,Object[] para, int startPage, int pageSize); /** * 根据cls对应表的主键属性id来查询并返回cls类型的对象 * @param Class cls 要查询的Hibernate的表映射类对象名,如User对象的类型为User.class * @param java.io.Serializable id 查询所用的对应主键的值 * @return Object 返回的cls类型的对象 */ public Object findById(Class cls, java.io.Serializable id); /** * 利用无参数的sql实现数据表对象的更新操作 * @param String sql 无参数的update的sql语句 * @return boolean true 成功 false 失败 */ public boolean update(String sql); /** * 利用带参数的sql实现数据表对象的更新操作 * @param String sql 带参数的update的sql语句 * @param Object[] para 对应sql语句中的参数值 * @return boolean true 成功 false 失败 */ public boolean update(String hql,Object[] para); /** * 利用sql实现数据表的批量删除 * @param String sql 无参数的delete的sql语句 * @return boolean true 成功 false 失败 */ public boolean delete(String sql); /** * 利用带参数的sql实现数据表的批量删除 * @param String sql 带参数的delete的sql语句 * @param Object[] para 对应sql语句中的参数值 * @return boolean true 成功 false 失败 */ public boolean delete(String sql,Object[] para); /** * 调用数据库存储过程(无参数) * 参数:String procName 数据库存储过程名 * 输出参数:ResultSet rs 返回存储过程中查询的结果 * 返回值:0 更新语句执行失败 >0 更新语句成功 */ public Object executeProduce(String procName); /** * 调用数据库存储过程(带参数) * 参数:String procName 数据库存储过程名 * 输出参数:ResultSet rs 返回存储过程中查询的结果 * 返回值:0 更新语句执行失败 >0 更新语句成功 */ public Object executeProduce(String procName,Object[] para); /** * 执行更新操作的批处理语句,这里将采用多个结果的事务方式,一起提交,一起回滚 * * @param Object Hibernate的表映射对象 当前为要删除表的实体类对象 * @return boolean true 成功 false 失败 */ public boolean executeBatch(Object[] obj, int[] model); public boolean executeBatch(List<Object> list,List<Integer> models); }
二、iHiberDAOImpl类
package basic; import java.io.Serializable; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; public class iHiberDAOImpl implements iHiberBaseDAO { public static final int INSERT = 1; //代表添加操作 public static final int UPDATE = 2; //代表修改操作 public static final int DELETE = 3; //代表删除操作 @Override public Object insert(Object obj) { //obj必须是符合hibernate的pojo对象 Session session = HibernateSessionFactory.getSession();//每次执行前需引入session对象 Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 Serializable key = session.save(obj); tx.commit(); //持久化操作 session.close(); return key; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return null; } @Override public boolean insert(List<Object> list) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 for(Object obj : list){ session.save(obj); } tx.commit(); //持久化操作 session.close(); return true; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean delete(Class cls, Serializable id) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 //先用cls和id查出要删除的对象 session.delete(session.get(cls, id)); tx.commit(); //持久化操作 session.close(); return true; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean delete(Object obj) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 session.delete(obj); tx.commit(); //持久化操作 session.close(); return true; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean update(Object obj) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 session.update(obj); tx.commit(); //持久化操作 session.close(); return true; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public List select(String hql) { Session session = HibernateSessionFactory.getSession(); try{ Query query = session.createQuery(hql); List list = query.list(); session.close(); return list; }catch(Exception e){ e.printStackTrace(); if(session!=null) session.close(); } return null; } @Override public List select(String hql, int startIndex, int length) { Session session = HibernateSessionFactory.getSession(); try { Query query =session.createQuery(hql); query.setFirstResult(startIndex); //设置起始记录位置 query.setMaxResults(length); //设置返回记录数 List list = query.list(); session.close(); return list; } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return null; } @Override public List select(String hql, Object[] para) { Session session = HibernateSessionFactory.getSession(); try { Query query =session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query.setParameter(i, para[i]); } List list = query.list(); session.close(); return list; } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return null; } @Override public List select(String hql, Object[] para, int startIndex, int length) { Session session = HibernateSessionFactory.getSession(); try { Query query =session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query.setParameter(i, para[i]); } query.setFirstResult(startIndex); //设置起始记录位置 query.setMaxResults(length); //设置返回记录数 List list = query.list(); session.close(); return list; } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return null; } @Override public int selectValue(String hql) { Session session = HibernateSessionFactory.getSession(); try { Query query = session.createQuery(hql); Object obj = query.uniqueResult(); session.close(); if(obj instanceof Long) return ((Long)obj).intValue(); else if(obj instanceof Integer) return ((Integer)obj).intValue(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return 0; } @Override public int selectValue(String hql, Object[] para) { Session session = HibernateSessionFactory.getSession(); try { Query query = session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query.setParameter(i, para[i]); } Object obj = query.uniqueResult(); session.close(); if(obj instanceof Long) return ((Long)obj).intValue(); else if(obj instanceof Integer) return ((Integer)obj).intValue(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return 0; } @Override public int selectPages(String hql, int pageSize) { Session session = HibernateSessionFactory.getSession(); long pages_all = 0; try { Query query = session.createQuery(hql); List list = query.list(); //获得查询记录总数 long records = list.size(); //计算分页数 pages_all =records%pageSize==0?records/pageSize:records/pageSize + 1; //获得总页数 session.close(); return (int)pages_all; }catch(Exception e){ e.printStackTrace(); if(session!=null) session.close(); } return 0; } @Override public int selectPages(String hql, Object[] para, int pageSize) { Session session = HibernateSessionFactory.getSession(); //编程思想:先获得查询记录数,再使用算法来计算出分页的页数 long pages_all = 0; try { Query query = session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query.setParameter(i, para[i]); } List list = query.list(); //获得查询记录总数 long records = list.size(); //计算分页数 pages_all = records%pageSize==0?records/pageSize:records/pageSize + 1; //获得总页数 session.close(); return (int)pages_all; }catch(Exception e){ e.printStackTrace(); if(session!=null) session.close(); } return 0; } @Override public List selectByPage(String hql, int startPage, int pageSize) { Session session = HibernateSessionFactory.getSession(); List pList = null; int currentPage; try { Query query = session.createQuery(hql); //先求出按照pageSize得到的分页的页数 List list = query.list(); //获得查询记录总数 long records = list.size(); //获得总页数 int pages_all =(int)(records%pageSize==0?records/pageSize:records/pageSize + 1); //获得总页数 //设置类成员当前页面的操作页码 if(startPage<=1){ currentPage = 1; }else if(startPage >=pages_all){ currentPage = pages_all; }else { currentPage = startPage; } Query query2 = session.createQuery(hql); query2.setFirstResult((currentPage -1)* pageSize);//从第几条记录开始查询 query2.setMaxResults(pageSize);//每页显示多少条记录 pList = query2.list(); session.close(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return pList; } @Override public List selectByPage(String hql, Object[] para, int startPage, int pageSize) { Session session = HibernateSessionFactory.getSession(); List pList = null; int currentPage; try { Query query = session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query.setParameter(i, para[i]); } List list = query.list(); //获得查询记录总数 long records = list.size(); //获得总页数 int pages_all = (int)(records%pageSize==0?records/pageSize:records/pageSize + 1); //获得总页数 //设置类成员当前页面的操作页码 if(startPage<=1){ currentPage = 1; }else if(startPage >=pages_all){ currentPage = pages_all; }else { currentPage = startPage; } Query query2 = session.createQuery(hql); //根据para设置参数 for(int i=0;i<para.length;i++){ query2.setParameter(i, para[i]); } query2.setFirstResult((currentPage -1)* pageSize);//从第几条记录开始查询 query2.setMaxResults(pageSize);//每页显示多少条记录 pList = query2.list(); session.close(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return pList; } @Override public Object findById(Class cls, Serializable id) { Session session = HibernateSessionFactory.getSession(); try { Object obj = session.get(cls, id); session.close(); return obj; } catch (Exception e) { e.printStackTrace(); if(session!=null) session.close(); } return null; } @Override public boolean update(String sql) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 //将会话Session对象转换成jdbc的Connection Connection con = session.connection(); PreparedStatement ptmt = con.prepareStatement(sql); int row = ptmt.executeUpdate(); tx.commit(); //持久化操作 session.close(); if(row > 0) return true; else return false; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean update(String sql, Object[] para) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 //将会话Session对象转换成jdbc的Connection Connection con = session.connection(); PreparedStatement ptmt = con.prepareStatement(sql); for(int i=0; i<para.length; i++){ ptmt.setObject(i+1, para[i]); } int row = ptmt.executeUpdate(); tx.commit(); //持久化操作 session.close(); if(row > 0) return true; else return false; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean delete(String sql) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 //将会话Session对象转换成jdbc的Connection Connection con = session.connection(); PreparedStatement ptmt = con.prepareStatement(sql); int row = ptmt.executeUpdate(); tx.commit(); //持久化操作 session.close(); if(row > 0) return true; else return false; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public boolean delete(String sql, Object[] para) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); //开启一个事务 //将会话Session对象转换成jdbc的Connection Connection con = session.connection(); PreparedStatement ptmt = con.prepareStatement(sql); for(int i=0; i<para.length; i++){ ptmt.setObject(i+1, para[i]); } int row = ptmt.executeUpdate(); tx.commit(); //持久化操作 session.close(); if(row > 0) return true; else return false; }catch(Exception e){ e.printStackTrace(); if(tx!=null) tx.rollback(); //撤销 if(session!=null) session.close(); } return false; } @Override public Object executeProduce(String procName) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try { tx = session.beginTransaction(); Connection conn=session.connection(); CallableStatement ctmt=conn.prepareCall("{? = call procName}"); ctmt.registerOutParameter(1,java.sql.Types.INTEGER); boolean type = ctmt.execute(); tx.commit(); if(type){ //为true表明存储过程是一个select语句 ResultSet rs = ctmt.getResultSet(); //globesession.close(); return rs; }else{ //不是select,则获取返回值 int isSuccess = ctmt.getInt(1); //获得返回值。 session.close(); return new Integer(isSuccess); } } catch (Exception e) { e.printStackTrace(); if (tx != null) tx.rollback(); //错误时,回滚操作 if(session!=null) session.close(); } return null; } @Override public Object executeProduce(String procName, Object[] para) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try { tx = session.beginTransaction(); Connection conn=session.connection(); CallableStatement ctmt=conn.prepareCall("{? = call procName}"); ctmt.registerOutParameter(1,java.sql.Types.INTEGER); for(int i=0;i<para.length;i++){ ctmt.setObject(i+2, para[i]); } boolean type = ctmt.execute(); tx.commit(); if(type){ //为true表明存储过程是一个select语句 ResultSet rs = ctmt.getResultSet(); //globesession.close(); return rs; }else{ //不是select,则获取返回值 int isSuccess = ctmt.getInt(1); //获得返回值。 session.close(); return new Integer(isSuccess); } } catch (Exception e) { e.printStackTrace(); if (tx != null) tx.rollback(); //错误时,回滚操作 if(session!=null) session.close(); } return null; } @Override public boolean executeBatch(Object[] obj, int[] model) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; tx = session.beginTransaction(); try { for(int i=0; i<obj.length; i++){ if(model[i]==INSERT) session.save(obj[i]); else if(model[i]==UPDATE) session.update(obj[i]); else if(model[i]==DELETE) session.delete(obj[i]); } tx.commit(); session.close(); return true; }catch(Exception e){ e.printStackTrace(); if (tx != null) tx.rollback(); //错误时,回滚操作 if (session!=null) session.close(); } return false; } @Override public boolean executeBatch(List<Object> list, List<Integer> models) { Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try { tx = session.beginTransaction(); for(int i=0; i<list.size(); i++){ Object obj = list.get(i); Integer model = (Integer)models.get(i); if(model.intValue()==INSERT){ session.save(obj); }else if(model.intValue()==UPDATE){ session.update(obj); }else if(model.intValue()==DELETE){ session.delete(obj); } } tx.commit(); session.close(); return true; }catch(Exception e){ e.printStackTrace(); if (tx != null) tx.rollback(); //错误时,回滚操作 if (session!=null) session.close(); } return false; } }
附加给大家一个junit测试方法书写
package Test; import static org.junit.Assert.*; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import basic.*; import model.TForumTitle; import model.Tuser; public class TestHiberBaseDAOImpl { iHiberDAOImpl bdao=null; @Before public void init(){ bdao=new iHiberDAOImpl(); } @After public void tearDown() throws Exception { } @Test public void testInsertObject() { Tuser user=new Tuser(); user.setUserid("zhangsanfeng"); user.setNickname("太极宗师"); user.setPwd("123456"); user.setAgend("男"); user.setUsertype(2); System.out.println(bdao.insert(user)); } @Test public void testInsertListOfObject() { fail("Not yet implemented"); } @Test public void testDeleteClassSerializable() { bdao.delete(Tuser.class,"zhangsanfeng"); } @Test public void testDeleteObject() { fail("Not yet implemented"); } @Test public void testUpdateObject() { Tuser user=(Tuser)bdao.findById(Tuser.class, "zhangsanfeng"); user.setNickname("太极宗师太极拳"); System.out.println(bdao.update(user)); } @Test public void testSelectString() { String hql="from Tuser where usertype =2"; List<Tuser> list =bdao.select(hql); for (Tuser user : list) { System.out.println(user.getNickname()+" "+user.getRealname()); } } @Test public void testSelectStringIntInt() { fail("Not yet implemented"); } @Test public void testSelectStringObjectArray() { fail("Not yet implemented"); } @Test public void testSelectStringObjectArrayIntInt() { fail("Not yet implemented"); } @Test public void testSelectValueString() { //查询普通用户的数量 String hql="select count(*) from Tuser where usertype =1"; System.out.println(bdao.selectValue(hql)); } @Test public void testSelectValueStringObjectArray() { //查询博主用户数量 String hql="select count(*) from Tuser where usertype=?"; Object[] para={2}; System.out.println(bdao.selectValue(hql,para)); } @Test public void testSelectPagesStringInt() { fail("Not yet implemented"); } @Test public void testSelectPagesStringObjectArrayInt() { fail("Not yet implemented"); } @Test public void testSelectByPageStringIntInt() { //按照分页查询 String hql= "from TForumTitle where userid='zhangtao' order by titleid desc"; List<TForumTitle> list =bdao.select(hql,2,5); for (TForumTitle obj : list) { System.out.println(obj.getTopic()); } } @Test public void testSelectByPageStringObjectArrayIntInt() { fail("Not yet implemented"); } @Test public void testFindById() { fail("Not yet implemented"); } @Test public void testUpdateString() { String sql ="update T_User set nickname =' 费柏设' where userid='zhangsanfeng'"; System.out.println(bdao.update(sql)); } @Test public void testUpdateStringObjectArray() { fail("Not yet implemented"); } @Test public void testDeleteString() { fail("Not yet implemented"); } @Test public void testDeleteStringObjectArray() { fail("Not yet implemented"); } @Test public void testExecuteProduceString() { fail("Not yet implemented"); } @Test public void testExecuteProduceStringObjectArray() { fail("Not yet implemented"); } @Test public void testExecuteBatchObjectArrayIntArray() { //删除对象 TForumTitle forum =(TForumTitle)bdao.findById(TForumTitle.class, 30); //修改对应Tuser的文章数 Tuser user =(Tuser)bdao.findById(Tuser.class, "zhangtao"); user.setArticlecounter(user.getArticlecounter()-1); Object[] objs={forum,user}; int[] models={bdao.DELETE,bdao.UPDATE}; //第一个对象删除,第二个对象修改 System.out.println(bdao.executeBatch(objs,models)); } @Test public void testExecuteBatchListOfObjectListOfInteger() { fail("Not yet implemented"); } }
我对不定期给大家提供java类的编写代码,及方式,敬请期待