准备
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次查询。