(四)Hibernate API详解
一、Configuration类
用来加载默认文件路径下的配置文件(hibernate.properties)。
调用configure()方法会加载默认文件路径下的xml格式的配置文件(hibernate.cfg.xml)推荐使用。
如果配置文件在不默认文件路径下或者配置文件名不符合默认规则 可以使用
new Configuration().configure(file) 加载指定文件
new Configuration().configure(path) 加载指定路径下的文件
如果使用properties格式的配置文件,可以使用addClass(实体类名.class)方法可以加载映射文件。
二、SessionFactory对象
SessionFactory代表数据库存储源。根据Hibernate配置文件创建对应的数据库存储源。
SessionFactory对象创建后,和Configuration对象再无关联。修改Configuration包含的配置文件信息,不会对SessionFactory有任何影响。
获取SessionFactory对象:new Configuration().configure().buildSessionFactory();
对象的缓存很大,就称为重量级对象。SessionFactory存放了Hibernate配置信息,映射元数据信息等。是重量级对象。
三、Session对象
代表程序和数据库的会话。Session提供了操作数据库的各种方法。是轻量级对象。 获取Session对象 factory.openSession(): 获取新的Session实例。 factory.getCurrentSession():采用该方法创建的Session会取出当前线程中的Session,底层使用ThreadLocal进行存取 save()方法:把Java对象保存到数据库中。 Transaction ts=session.beginTransaction(); User u=new User(); u.setName("赵六"); u.setPassword("123456"); //将对象保存到数据库 session.save(u); ts.commit(); update()方法:更新数据库的方法 Transaction ts=session.beginTransaction(); //先查出要修改的对象,根据主键值 User user=session.get(User.class, 1); user.setName("jery"); //将对象更新到数据库,根据OID session.update(user); ts.commit(); delete()方法:删除方法 底层根据OID进行删除。有两种方式 (1) Transaction ts=session.beginTransaction(); User user=session.get(User.class, 1); //删除指定对象 session.delete(user); ts.commit(); (2) Transaction ts=session.beginTransaction(); User user=new User(); user.setId(2); session.delete(user); ts.commit(); load()或get()方法:从数据库查找指定对象 session.get(实体类名.class,OID);或session.load(实体类名.class,OID); load()和get()的区别 我们使用get查询时发现控制台会立马打出查询语句。 使用load查询时控制台不会打印查询语句。 get方法被调用时立刻发送sql语句到数据库进行查询。 load方法被调用时并没有查询数据库,当我们需要使用查询的对象时,才去查询,所以当我们打印对象时,才会在控制台打印sql语句。 get()的原理 程序调用get方法,Hibernate发送sql语句到数据库 数据库返回结果,Hibernate将结果封装成对象,返回对象到程序。 load()的原理 程序调用load方法,Hibernate使用代理技术,创建一个代理对象,属性只有ID值。 然后返回代理对象给程序,我们使用对象时,代理对象调用Hibernate查询数据库,初始化其他属性。 load方法,返回一个代理对象,获取其属性时,会查询数据库,每次访问属性都会查询数据库么? 答:不是。代理对象中有一个标识是否被初始化的boolean类型变量,记录是否被初始化。
四、Criteria
使用HQL语言(后面会详细介绍),HQL语言是面向对象的 Query query=session.createQuery("from User"); 第二种方式 Criteria c=session.createCriteria(User.class); List<User> l=c.list(); 第三种方式,使用原生sql语句进行查询 SQLQuery query=session.createSQLQuery("select * from user"); List l=query.list();
五、Transaction对象
封装了事务的操作。我们做增删改查等操作时,必须开启事务. 因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。 开启事务: Transaction ts=session.beginTransaction(); 提交事务:ts.commit(); 回滚事务:ts.rollback(); 当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。
六、Query对象
封装HQL语句的对象。 返回一个对象的方法 query.uniqueResult(); 分页相关 query.setFirstResult(index):从第几个取 query.setMaxResults(count):指定取几行记录