1.主要类与接口
Hibernate。Hibernate通过Configuration的实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。
SessionFactory接口
负责初始化Hibernate。一个SessionFactory实例对应一个数据库。应用程序从SessionFactory中获得Session实例。
Session接口
Session被称为持久化管理器,负责管理与持久化相关的操作:存储、更新、删除和加载对象。
Transaction接口
是Hibernate框架的事务接口。它对底层的事务接口做了封装。包括:JDBC API和JTA。
2. Session的缓存
Session的CRUD方法以及调用查询接口的list(),iterate()方法时,如果session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中,如果session缓存中已经存在这个对象,就不需在去数据库加载,而直接使用缓存中的对象。
flush: 进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步 执行一些列sql语句,但不提交事务,;
commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。
session的缓存一般交由hibernate框架自动管理。
3.Session的几个主要方法
1)、save保存数据,相当于insert方法
2)、delete,删除对象
3)、update,更新对象,如果数据库中没有记录,会出现异常。
4)、get,根据ID查,会立刻访问数据库。
5)、Load,根据ID查,(返回的是代理,不会立即访问数据库)。
6)、saveOrUpdate (根据ID和version的值来确定是save或update
4.主键id的属性值:取值标识符取值器
注:increment是mysql数据库,identity是oracle数据库,Sequence是sql server;最常用的是native,因为该属性可以自行判断是什么数据库而只能的调用相应数据库标示符
5.一个运用hibernate写的增删该查案例
- 自己手动编写的一个工具类 Hibernate.java
- package com.hbsi.utils;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtil {
- private static Session session;
- static{
- Configuration cfg = new Configuration().configure();
- SessionFactory factory = cfg.buildSessionFactory();
- session = factory.openSession();
- }
- public static Session getSession(){
- return session;
- }
- public static void close(){
- if(session!=null){
- session.close();
- }
- }
- }
- 增删改查类 UtilTest.java:
- package com.hbsi.test;
- import java.util.Date;
- import java.util.List;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.junit.Test;
- import com.hbsi.domain.User;
- import com.hbsi.utils.HibernateUtil;
- public class UtilTest {
- @Test
- public void addUser(){
- User user = new User();
- user.setName("lisi");
- user.setBirthday(new Date());
- try{
- Session session = HibernateUtil.getSession();
- session.beginTransaction();
- session.save(user);
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- @Test
- public void deleteUser(){
- try{
- //方法一:先查找,再操作
- /*Session session = HibernateUtil.getSession();
- session.beginTransaction();
- User user = (User)session.get(User.class, 1);
- session.delete(user);
- session.getTransaction().commit();*/
- //方法二:直接new出bean类,然后指明要删除的id
- Session session = HibernateUtil.getSession();
- session.beginTransaction();
- User user = new User();
- user.setId(2);
- session.delete(user);
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- @Test
- public void updateUser(){
- try{
- //方法一:先查找,再操作
- /*Session session = HibernateUtil.getSession();
- session.beginTransaction();
- User user = (User)session.get(User.class, 2);
- user.setName("lisi");
- session.update(user);
- session.getTransaction().commit();*/
- //方法二:直接new出bean类,然后指明要更新的id,这种方法适合删除不适合更新,比如你只更新名字字段,其他的字段就会变成空
- Session session = HibernateUtil.getSession();
- session.beginTransaction();
- User user = new User();
- user.setId(2);
- user.setName("利索");
- session.update(user);
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- //按id查找;get()方法会立刻访问数据库;load()方法返回的是代理,不会立即访问数据库
- @Test
- public void findUser(){
- try{
- Session session = HibernateUtil.getSession();
- User user = (User)session.get(User.class, 1);
- System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- //按id查找,懒加载;之所以说懒,是因为这里的load()方法与上面的get()方法有所不同,前者只有在使用load()方法返回的对象时才去执行sql语句,不使用不执行;而后者不一样,它不管什么时候都执行
- @Test
- public void loadUser(){
- try{
- Session session = HibernateUtil.getSession();
- User user = (User)session.load(User.class, 1);
- System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- //查找所有
- @Test
- public void findAll(){
- try{
- Session session = HibernateUtil.getSession();
- Query query = session.createQuery("from User");
- List<User> list = query.list();
- for(User user : list){
- System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());
- }
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- HibernateUtil.close();
- }
- }
- }
自己手动编写的一个工具类 Hibernate.javapackage com.hbsi.utils;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration; public class HibernateUtil { private static Session session; static{ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); session = factory.openSession(); } public static Session getSession(){ return session; } public static void close(){ if(session!=null){ session.close(); } }}增删改查类 UtilTest.java:package com.hbsi.test; import java.util.Date;import java.util.List; import org.hibernate.Query;import org.hibernate.Session;import org.junit.Test; import com.hbsi.domain.User;import com.hbsi.utils.HibernateUtil; public class UtilTest { @Test public void addUser(){ User user = new User(); user.setName("lisi"); user.setBirthday(new Date()); try{ Session session = HibernateUtil.getSession(); session.beginTransaction(); session.save(user); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } } @Test public void deleteUser(){ try{ //方法一:先查找,再操作 /*Session session = HibernateUtil.getSession(); session.beginTransaction(); User user = (User)session.get(User.class, 1); session.delete(user); session.getTransaction().commit();*/ //方法二:直接new出bean类,然后指明要删除的id Session session = HibernateUtil.getSession(); session.beginTransaction(); User user = new User(); user.setId(2); session.delete(user); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } } @Test public void updateUser(){ try{ //方法一:先查找,再操作 /*Session session = HibernateUtil.getSession(); session.beginTransaction(); User user = (User)session.get(User.class, 2); user.setName("lisi"); session.update(user); session.getTransaction().commit();*/ //方法二:直接new出bean类,然后指明要更新的id,这种方法适合删除不适合更新,比如你只更新名字字段,其他的字段就会变成空 Session session = HibernateUtil.getSession(); session.beginTransaction(); User user = new User(); user.setId(2); user.setName("利索"); session.update(user); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } } //按id查找;get()方法会立刻访问数据库;load()方法返回的是代理,不会立即访问数据库 @Test public void findUser(){ try{ Session session = HibernateUtil.getSession(); User user = (User)session.get(User.class, 1); System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday()); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } } //按id查找,懒加载;之所以说懒,是因为这里的load()方法与上面的get()方法有所不同,前者只有在使用load()方法返回的对象时才去执行sql语句,不使用不执行;而后者不一样,它不管什么时候都执行 @Test public void loadUser(){ try{ Session session = HibernateUtil.getSession(); User user = (User)session.load(User.class, 1); System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday()); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } } //查找所有 @Test public void findAll(){ try{ Session session = HibernateUtil.getSession(); Query query = session.createQuery("from User"); Listlist = query.list(); for(User user : list){ System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday()); } }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.close(); } }}