Hibernate概念深入和CURD(增删改查)

一  Hibernate开发流程

1.hibernate需要的三个条件

(1)domian类

(2)映射文件 User.hbm.xml

(3)创建表

2.开发流程

(1)站在面向对象的角度

由domain Object---àmapping ---àdb(官方推荐)

(2)站在关系模型的角度

由DB开始,用工具生成mapping和Domain object(使用较多)

(3)从映射文件开始写(用的较少)

注:以上任何两个都可以互相生成

二  开发中的细节

1.Domian Object限制(实体类对象限制)

(1)默认的构造是必须的,如果写了一个有参数的构造,必须要写上无参构造

原因是Hibernate会用反射的机制生成一个class对象,创建对象的时候用newInstance()方法去创建,用的是无参构造,例:

Class clazz = User.class;

User user = clazz.newInstance();

(2)有无意义的标识符id(主键)(可选)

在实际中用到,如果有id,会充分发挥它的特性

(3)非final的,对懒加载有影响(可选)

懒加载内部会自动的创建一个子类,如果是final,懒加载会有影响

2.映射文件 --- 把类映射成二维表

(1)一个java类在映射文件中用一对<class>标签表示,如果有多个java类,那么在映射文件中应该有多个<class>标签

(2)对于<class>标签来说,<clas>标签可以放到一个映射文件中,可以放到多个映射文件中

(3)映射文件的命名规范:类名.hbm.xml

三 代码编写

(1)HibernateUitl  工具类  --  提取和数据库连接的宝贵资源

    public final class HibernateUtil {

    private static SessionFactory sessionFactory;

    private HibernateUtil() {

 

    }

    //耗时资源放到代码块中,只执行一次

    static {

       Configuration cfg = new Configuration();

       cfg.configure();// 用来完成Hibernate的初始化---用来读取配置文件中的信息,可以指定配置文件的位置

                     // cfg.configure("");

       // 得到sessionFactoroy的工厂对象,相当于DirverManager,

       sessionFactory = cfg.buildSessionFactory();

    }

 

    public static SessionFactory getSessionFactory() {

       return sessionFactory;

    }

 

    public static Session getSession() {

       return sessionFactory.openSession();

    }

}

(2)添加用户  ---  使用上面的工具类优化代码

    public static void addUser1(User user) {

       Session session = null;

       Transaction tx = null;

       try {

           session = HibernateUtil.getSession();

           tx = session.beginTransaction();// 开启事务

           session.save(user);

           tx.commit();

       } finally {

           // 使资源得到释放

           if (session != null) {

              session.close();

           }

       }

}

(3)查询用户

    //查 ---查询不用开启事务,不修改数据库中的东西

    public static User getUser(int id){

      

       Session session = null;

       try {

           session = HibernateUtil.getSession();

           Class clazz = User.class;//通过映射文件查找class对象

           //User user = (User) session.load(clazz, id);//懒加载,运行后没有立刻访问相应的数据库,返回的是代理对象,永远不可能为空,当第一次使用该对象的时候,才去访问

           User user = (User) session.get(clazz, id);

           return user;

       } finally {

           // 使资源得到释放

           if (session != null) {

              session.close();

           }

       }

}

四  session接口中的方法

Transation beginTransaction() 开启事务

Void clear() 清除缓存

Connection close() 关闭session释放资源的方法

Session只能按id查询,所以有了:

Criteria createCirteria(Class persistentClass)   查询所有...

Query createQuert(String queryString)

void delete(Object object)

Object load(Class theClass,Serializable id) 懒加载,当调用的时候,不是立刻去查数据库,只有第一次使用的时候才去查

Void persist(Object object) 保存对象

Void save(Object object)  保存对象  两者不同是:

在没有开启事务的时候,persist插入的语句没有做,而save插入的操作确做了,可是回滚了

五  对象状态

1.瞬时状态:自己new出来的对象就是瞬时状态

User user =new User() ; 

user是一个瞬时对象,在数据库的表中没有记录和瞬时对象想对应的,也不管理瞬时 对象

当调用 session.save(user)方法之后,为持久状态

2.持久状态:数据库表中有记录和这个对象相对应的,当持久态的对象发生变化的时候,session中也变化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyfspg.html