框架学习笔记之Hibernate框架基础(二)如何建立泛型接口实现增删改查

本文介绍Hibernate框架的基础使用方法,包括session对象的创建、泛型接口的设计及其实现,实现对不同实体类的增删改查操作。同时探讨了Hibernate中对象的三种状态及其转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章讲述了如何用Hibernate框架创建session对象,通过实体类、object类和泛型建立通用接口,实现泛型对象的增删改查。

映射文件中的各项元素:

oracle中键位自增模式:increment、identity、native、assigned。

 

Hibernate内置的映射类型如下:

integer,long,short,float,double,character,byte,boolean,yes_no,true_false

string

date,time,timestamp

calendar,calendar_date

big_decimal big_integer

text

 

简单介绍Hibernate持久化状态:

Transient State : 瞬时状态;

Persistent State : 持久状态;

Detached State : 离线状态或托管状态;

Transient State : 瞬时状态: 

当我们new操作符初始化一个对象时,它处于瞬时态,也就是他没有任何和数据库表相关的行为,只要应用程序不再引用这些对象,它们状态将会丢失,被jvm垃圾回收了。总结,这个对象,Session没管理,数据库中没存。

Persistent State : 持久状态 : 持久化实例则是具有数据库标识的实例,它由持久化管理器Session统一管理的,只要它的状态发生改变,在事务提交时,会同步到数据库中。

Detached State : 离线状态或托管状态 : 数据库中有,但是session不管理了。

 

映射配置文件的作用:链接数据库,将实体对象和数据库表进行映射关联。

public static Session getSession() {

          return sessionFactory.openSession();

       }

getCurrentSession()为获取当前程序的session。

current_session_context_class;指定会话的上下文相关特性,内置提供了jta|thread|managed对象。

需要在cfg中添加property,配置为thread,线程绑定模式,采用线程绑定模式,当事务提交之后就会自动关闭事务,不用手动关闭。

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

引入:如果我们有二十个实体,每一个实体的属性参数都比较多,现在运用Object类型的参数就可以实现对各种实体都可以进行add方法。

将具体的addPerson方法想改为泛型的适用于多种对象的方法,于是将传入的参数编写为Object类型。

public boolean addPerson(Person person) {

          Session session = HibernateUtil.getSession();

          Transaction tran = session.beginTransaction();

          int result = (Integer) session.save(person);// 保存session对象

          boolean flag = false;

          if (result > 0) {

              flag = true;

              tran.commit();

          }

          session.close();

          return flag;

     }

查询过程中使用get方法,用到两个参数,返回值为Object,添加一个Class参数,Class类型为Object。 

    public Object queryPerson(@SuppressWarnings("rawtypes") Class ss,int id) {

    Session session=HibernateUtil.getSession();

          Transaction tran=session.beginTransaction();

          Object obj=session.get(ss, id);

          tran.commit();

          return obj;

          

     }

使用方法的时候只需要将Object对象转型为实体类型:

   PersonDaoImpl   PersonDao=new PersonDaoImpl();

   Person person=(Person)PersonDao.queryPerson(Person.class,100);

 

这里的增删改查操作都得在事务中提交关闭。

因为线程绑定会自动提交session对象,session.close可以关闭。

常规的方法可以将方法提取成泛型进行。

public void queryPerson2(int id) {

          Session session=HibernateUtil.getSession();

          Transaction tran=session.beginTransaction();

          Person person=(Person)session.load(Person.class, id);

                system.out.println("---------------------------");

                        system.out.println(person.getPname());

          tran.commit();    

}

调用load但是没有使用,load方法就不会加载。只在使用load的时候进行加载。

懒加载;延迟加载,在使用的时候才加载。

get和load的区别:立即加载。延迟加载。

 

session对象中save和saveOrUpdate方法的区别

saveOrUpdate返回值为void。

save返回值为int,可以插入表中没有的数据,根据id更新表中已有的数据。

 

使用泛型进行多个实体类的通用接口


public interface BasicDao<T> {

     public boolean add(T t);

     public boolean update(T t);


     public boolean delete(int id);


     public T queryById(Class cl,int id);

    

}

 

使用Basic接口类型为泛型,接口中四个方法增删改查代码如下:


public interface BasicDao<T> {

     public boolean add(T t);

     public boolean update(T t);

     public boolean delete(int id);

     public T queryById(Class cl,int id);

}

BasicImpl.java:

public class BasicImpl<T> implements BasicDao<T> {

    Session session;

    boolean flag;

    @Override

    public boolean add(T t) {

        // TODO Auto-generated method stub

        session=HibernateUtil.getSession();
         

        flag=false;

        int result=(Integer)session.save(t);

        if(result>0) {

            

            flag=true;

            session.beginTransaction().commit();

         

        }

        return flag;

    }


    @Override

    public boolean update(T t) {

        session=HibernateUtil.getSession();

         session.update(t);

         flag=true;

         session.beginTransaction().commit();

         return flag;

    }


    @Override

    public boolean delete(int id) {

        // TODO Auto-generated method stub

        session=HibernateUtil.getSession();

        flag=true;

        session.delete(id);

        return flag;

    }


    @Override

    public T queryById(Class cl,int id) {

        // TODO Auto-generated method stub

        session=HibernateUtil.getSession();

        @SuppressWarnings("unchecked")

        T t=(T)session.get(cl,id);

        session.beginTransaction().commit();

        return t;

    }



}

这里的代码全部都是基于泛型的,在存在多个实体类的时候,将实现类中BasicImpl继承过去,并且添加额外的方法,对代码的简洁性提升很多。

Test.java:

  public static void main(String[] args) {

          Person person=new Person(10,"张钰泉","yuquan");      

          PersonDaoImpl2 personDao=new PersonDaoImpl2();

          boolean flag=personDao.add(person);

         System.out.println(flag);

     }

运行效果:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值