Hibernate 增删改查

来源:互联网 发布:mac口红干嘛 编辑:程序博客网 时间:2024/05/16 01:10

准备

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语句,见下面的例子:
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()方法就会自动同步到数据库中。

通过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次查询。

1 0
原创粉丝点击