准备
Hibernate持久化对象支持三种对象状态。
瞬态:内存中的没有与Session关联的对象。
持久化:与Session关联的对象,对它所做的操作会自动同步到数据库中。
托管:以前与Session关联过,但Session又关闭了。
增
Serializable org.hibernate.Session.save(Object object)
新增一行。返回生成的主键,因此需要立即执行。通常这样用:
新增一行。返回生成的主键,因此需要立即执行。通常这样用:
int id=(int) sess.save(pojo);
void org.hibernate.Session.persist(Object object)新增一行。延迟执行。此外与save()方法没有区别。
批量增加时可以用下面的代码:
public static void writeToTable(Set<OrderCheckPojo> set) {
long beginTime = System.currentTimeMillis();
Session sess = DaoUtil.sf.openSession();
Transaction tr = sess.beginTransaction();
int id;
int i = 0;
for (OrderCheckPojo pojo : set) {
if (i++ % 100 == 0) { // 每100条刷新并写入数据库
sess.flush();
sess.clear();
}
id = (int) sess.save(pojo);
}
tr.commit();
sess.close();
logger.info("bufferSet.size():" + set.size() + ".And store them cost "
+ (System.currentTimeMillis() - beginTime) + " milliseconds。");
}
删
void org.hibernate.Session.delete(Object object)
从数据库中删除实体。需要实体为持久化状态。
也可以执行hql语句,见下面的例子:
从数据库中删除实体。需要实体为持久化状态。
也可以执行hql语句,见下面的例子:
Session sess=DaoBase.sf.openSession();
Transaction ts=sess.beginTransaction();
//注意executeUpdate()函数
int n=sess.createQuery("delete CounterPojo as t where t.source='online'").executeUpdate();
System.out.println("deleted rows:"+n);
ts.commit();
sess.close();
改
通过主键得到持久化对象
Object org.hibernate.Session.get(Class clazz, Serializable id)
根据指定的id返回数据库中的一行。若不存在返回null。立即执行。
Object org.hibernate.Session.load(Class theClass, Serializable id)
根据指定的id返回数据库中的一行。若不存在会抛异常。延迟执行。
通过get()或load()方法得到的就是持久化对象,对它们调用setter()方法就会自动同步到数据库中。
Object org.hibernate.Session.get(Class clazz, Serializable id)
根据指定的id返回数据库中的一行。若不存在返回null。立即执行。
Object org.hibernate.Session.load(Class theClass, Serializable id)
根据指定的id返回数据库中的一行。若不存在会抛异常。延迟执行。
通过get()或load()方法得到的就是持久化对象,对它们调用setter()方法就会自动同步到数据库中。
通过where条件得到持久化对象
如hql="update Student as t set name='Tom' where t.name='tom' ";
查
hql代表hibernate查询语句,与sql相比,没有了最开始的select XXX ,得到的总是完整的对象。
hql="from Student"或hql="from Student as s"
等价于"select * from Student"
hql="from Student as s where s.name like 'tom%'"
等价于"select * from Student as s where s.name like 'tom%'"
hql="from Student as s order by s.name ASC,s.age DESC"
等价于"select * from Student as s order by s.name ASC,s.age DESC"
in 查询批量where查询可用in查询来提升效率,为了不让一次查询花费太多时间,可以批量in 查询。
比如我想做10000次查询,就可以每100个放到 in (set)后面的集合中,执行100次查询。