1、SessionFactory
//加载主配置文件 Configuration config=new Configuration().configure(); //创建Session工厂 SessionFactory sessionFactory=config.buildSessionFactory();
是由Configuration对象通过buildSessionFactory()方法创建的。是一个重量级对象(系统开销大)、单例的、线程安全的。一般不需要手动关闭,应用结束时自动将其销毁。
目的:
//获取Session Session session=sessionFactory.getCurrentSession();
2、Session 轻量级对象、线程不安全、多例的。使用原则:一个事务一个对象,用完关闭。
两种获取方式:
Session session=sessionFactory.openSession(); 每调用一次方法获取一个新的Session对象。必须手动关闭session对象,无需环境注册,查询可以不在事务中。
Session session=sessionFactory.getCurrentSession(); 获得当前线程中Session对象。自动关闭session对象,无需手动关闭。需要配置运行环境。操作(CURD)必须在事务中进行。
3、Transaction 由Session对象创建 session.getTransaction()
事务的开启:session.getTransaction().begin(); 或者 session.beginTransaction();
事务的提交:session.getTransaction().commit();
事务的回滚:session.getTransaction().rollback();
4、CURD操作
@Test public void mytest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); // 执行操作 Student student = new Student("王五", 21, 100); session.save(student); session.getTransaction().commit(); } @Test public void persistTest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); // 执行操作 Student student = new Student("照六", 21, 100); session.persist(student); session.getTransaction().commit(); } @Test public void deleteTest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); Student student = new Student(); student.setId(2); session.delete(student); session.getTransaction().commit(); } @Test public void updateTest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); Student student = new Student("李四", 27, 89); student.setId(4); session.update(student); session.getTransaction().commit(); } @Test public void getTest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); Student student = session.get(Student.class, 20); System.out.print(student); session.getTransaction().commit(); } @Test public void loadTest() { Session session = CommonUtil.getSession(); session.getTransaction().begin(); Student student = session.load(Student.class, 20); System.out.print(student); session.getTransaction().commit(); } }
对于get()和load()方法的区别:
get():若id对应的数据不存在,不报错,返回null
load():若id对应的数据不存在,抛出异常
5、同一事务中:增、删、改执行的顺序:
@Test public void sortTest(){ Session session = CommonUtil.getSession(); session.beginTransaction(); try { //删除 Student student1=new Student(); student1.setId(2); session.delete(student1); //修改 Student student2= new Student("小七",19,96); student2.setId(3); session.update(student2); //增加 Student student3= new Student("老八",23,98); session.save(student3); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); e.printStackTrace(); } }
执行结果是:
由此可见:在同一个Session中执行顺序默认是增,改,删
调整顺序的方法:在操作之后加上 session.flush();
@Test public void saveOrUpdate(){ Session session = CommonUtil.getSessionFactory().openSession(); session.beginTransaction(); Student student= new Student("小五",19,96);
//有ID设置,则更新 student.setId(3); session.saveOrUpdate(student); //无ID设置,则登录 Student student2= new Student("小五",19,96); session.saveOrUpdate(student2); session.getTransaction().commit(); }