今天继续学习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();
至此,增删改查完成操作