Hibernate第二天

今天继续学习hibernate

Hibernate中主要存在三大对象Configuration对象SessionFactory对象Session对象

一.Configuration对象

Configuration对象用于加载配置文件,使用Configuration对象中的configure()方法加载src下名为hibernate.cfg.xml文件,配置Hibernate,根启动Hibernate,创建SessionFactory对象。

如果配置文件不符合默认加载规则,我们可以调用

(1)new Configuration().configure(file);通过file加载

(2)new Configuration().configure(path);通过path加载

也可以使用Configuration对象加载映射文件(这种方式不推荐)

>orm的映射文件与简单的类名一致

>orm的映射文件需要与实体的类放在同一包下

推荐hibernate.cfg.xml使用mapping属性导入映射文件

加载核心配置文件代码:Configuration cfg=new Configuration().configure();

二.SessionFactory对象

可以根据Configuration的配置信息创建SessionFactory,SessionFactory创建Session,初始化Hibernate,充当数据存储源的代理,创建Session对象。

SessionFactory sf=cfg.buildSessionFactory();

三.Session对象

Session对象是用于操作数据库的,负责保存、更新、删除、加载和查询对象。

Session se=sf.openSession();//创建一个新的session对象,需要我们手动关闭Session

getCurrentsession();//获取当前session对象

获取当前session对象,需要将Session对象和线程进行绑定,只有在hibernate.cfg.xml中配置hibernate.current_session_context.class属性,才可以getCurrentSession。

hibernate.cfg.xml:

<property name="hibernate.current_session_context_class">thread</property>

当开启了一个session对象时,同时新建两个session对象,并获取当前session对象赋值给两个新的对象,则这两个session对象相等。

Session se1=sf.getCurrentSession();

Session se2=sf.getCurrentSession();

System.out.println(se1==se2);//true

对数据库的增删改查的操作

1.插入方法 对数据库的进行插入一条数据,可以调用Session中的save()方法,将一条数据插入数据库中

Student stu=new Student();

stu.setSno(1);

stu.setSname("a");

stu.setSgrade(1);

Session.save(stu);

2.对数据库的查询方法

有五种方式进行查询

方法一  get方法      get(对象的类名,id) 此方法被调用时,立刻发送sql语句进行查询

Student s=(Student)se.get(Student.class,1);//获取id为1的Student表中的值

System.out.println(s);

方法二  load方法,被调用时,不立即查询,当我们需要使用该对象时才开始查询  

Student s=(Student)se.load(Student.class,14);//获取id为14的Student表中的值

System.out.println(s);

方法三 HQL语句查询 createQuery传入HQL进行查询

Query接口,封装HQL语句的对象,执行数据库查询

Query中封装查询的细节api

//查询所有的Student表中的数据

Query query=se.createQuery("from com.zk.Student.Student");

//查询结果

List<Student> list=query.list();

System.out.println(list);

方法四 Criteria查询=>Hibernate独创的面向对象的查询=>无语句

Criteria criteria=se.createCriteria(Student.class);

List<Student> list=criteria.list();

//返回查询一个结果

//查询sno等于14的结果

criteria.add(Restrictions.eq("sno",14));

Student s=(Student)criteria.uniqueResult()

System.out.println(s);

//查询多个结果

//查询sname中含有h的所有结果

criteria.add(Restrictions.like("sname","%h%"));

List<Student> l=criteria.list();

System.out.println(l);

//查询id大于1的用户

//criteria与Query功能很像

//> gt

//< lt

//= eq

//<= le

//>= ge

//like

//between

criteria.add(Restrictions.gt("sno",1));

List<Student> list=criteria.list();

System.out.println(list);

方法五:原生sql语句,原生sql语句不是面向对象的查询,所以list并不是Student的类型

SQLQuery query=se.createQuery("select * from student where Sname='h'");

//制定结果从第几个开始拿

query.setFirstResult(0);

//制定结果拿几个

query.setMaxResults(1);

//查询结果返回(方式一)

query.addEntity(Student.class);

List<Student> list=query.list();

System.out.println(list);

//查询结果返回(方式二)

List<Object[]> list=query.list();

for(Object[] obj:list){

System.out.println(Arrays.toString(obj));

}

3.对数据库中数据进行修改的方法Update

//首先获取id为1的对象

Student stu=(Student)se.get(Student,1);

//setXXX方法是数据库实体对象映射到Hibernate生成的Student类中的方法

s.setSname("a");

s.setSgrade(1);

se.update(s);

4.对数据库中的数据进行删除的操作delete

Student  s=(Student)se.get(Student.class,1);

se.delete(s);

四.Transaction接口

Transaction接口封装了对事物的操作,负责管理事务

开启事务

封装事务

回滚事务

Transaction tx=se.beginTransaction();

当session执行完对数据库的增删改查的操作后,需要使用事务进行提交

tx.commit();

在所有操作完成之后,关闭session资源,并且关闭sessionFactory

se.close();

sf.close();

至此,增删改查完成操作

原文地址:https://www.cnblogs.com/longlyseul/p/9827223.html