使用hibernate测试加载数据、删除数据和修改数据等功能时,针对的是与数据库表user对应的User。
为了简化对其他数据表对应的实体类的持久化操作,可以在项目中创建一个BaseHibernateDAO类,将数据的加载、添加、修改、删除等持久化方法封装其中。
BaseHibernateDAO.java
package com.dao;import java.io.Serializable;import javax.xml.rpc.handler.HandlerInfo;import org.hibernate.Session;import org.hibernate.Transaction;import com.util.HibernateSessionFactory;public class BaseHibernateDAO { protected void add(Object object) { Transaction t = null; Session session = HibernateSessionFactory.getSession(); //获取session try{ //开始事务 t = session.beginTransaction(); //持久化事务 session.save(object); //提交事务 t.commit(); }catch (Exception e) { if(t!=null){ //事务回滚 t.rollback(); } e.printStackTrace(); }finally{ HibernateSessionFactory.closeSession(); } } //加载数据 protected Object get(Class cla, Serializable id) { Object object = null; Session session = HibernateSessionFactory.getSession(); try{ object = session.get(cla, id); }catch (Exception e) { e.printStackTrace(); }finally{ HibernateSessionFactory.closeSession(); } return object; } //删除数据 protected void delete(Object object) { Transaction t = null; Session session = HibernateSessionFactory.getSession(); try { t = session.beginTransaction(); session.delete(object); t.commit(); } catch (Exception e) { if(t!=null){ t.rollback(); } e.printStackTrace(); } finally{ HibernateSessionFactory.closeSession(); } } //修改数据 protected void update(Object object) { Transaction t = null; Session session = HibernateSessionFactory.getSession(); try { t = session.beginTransaction(); session.update(object); t.commit(); } catch (Exception e) { if(t!=null){ t.rollback(); } e.printStackTrace(); } finally{ HibernateSessionFactory.closeSession(); } } }
为了使得数据访问层的代码更加清晰,创建一个接口UserDAO.java,并在接口中定义一些方法
package com.dao;import com.vo.Stu;public interface UserDAO { public void add(Stu stu); public void delete(Stu stu); public Stu get(int id); public void update(Stu stu);}
实现类UserDAOImpl类继承BaseHibernateDAO类(操作数据),实现UserDAO接口(具体实现方法)
package com.dao;import com.vo.Stu;public class UserDAOImpl extends BaseHibernateDAO implements UserDAO { @Override public void add(Stu stu) { // TODO Auto-generated method stub super.add(stu); } @Override public void delete(Stu stu) { // TODO Auto-generated method stub super.delete(stu); } @Override public Stu get(int id) { // TODO Auto-generated method stub return (Stu) super.get(Stu.class, id); } @Override public void update(Stu stu) { // TODO Auto-generated method stub super.update(stu); }}
创建测试类
package com.test;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import com.dao.UserDAO;import com.dao.UserDAOImpl;import com.util.HibernateSessionFactory;import com.vo.Stu;public class OpTest { public static void main(String[] args) { OpTest test = new OpTest(); //test.testAdd(); //test.testDelete(3); test.testUpdate(2); } //添加数据 public void testAdd() { Stu stu = new Stu(); stu.setSage(11); stu.setSname("85693897453"); stu.setSnumber("2016"); UserDAO userDAO = new UserDAOImpl(); userDAO.add(stu); } //删除数据 public void testDelete(int id) { UserDAO userDAO = new UserDAOImpl(); Stu stu = userDAO.get(id); userDAO.delete(stu); } //修改数据 public void testUpdate(int id) { UserDAO userDAO = new UserDAOImpl(); Stu stu = userDAO.get(id); stu.setSname("FUCK U!"); userDAO.update(stu); }}
---由于这个项目很赶时间,所以代码请在GitHub查看~
①对项目整体设计的一个感受(面试官可能会让你画系统的架构图)
- 做这个“项目”其实是很赶时间的,当时由于写项目的我们组也同是一个ACM队伍的,到处出去参加ACM比赛,最重要的周末在比赛中度过了,所以那半个月为了完成这个项目我们三个人没怎么睡觉。(12.15~1.2)由于是人才招聘网站,整体设计包括个人和企业两个模块,包括数据字典的设计、数据库表的对应关系都是不断推翻重建,甚至在之后还有站内信没来得及实现。
②在这个项目中你负责了什么、做了什么、担任了什么角色;
- 我负责的是后端方面,前端由另一个同学负责。
- 设计数据库表 + 构建Hibrnate数据模型和映射关系的配置文件 + 编写dao业务逻辑代码(和数据库交互)
- 后端主程和测试人员,因为只有三个人完全从零到一写项目,不可能专门拿出人来做测试工作。
③ 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用;
- 这个项目主要学会了熟练使用Hibernate,用到了SSH
④项目描述中,最好可以体现自己的综合素质;比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的?又或者说你在这个项目用了什么技术实现了什么功能?比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
- 这个项目印象最深刻的就是一个Hibernate产生脏数据的问题,询问学长说要用Spring重构才能解决。具体还没有实施...