本文章讲述了如何用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);
}
运行效果: