(附件中的blog.sql脚本添加了外键, 在执行非查询操作时可能会报错, 建议执行blog without foreign key.sql)
web应用和hibernate中都有session, 它们都是对话, 但是浏览器与服务器之间的对话, 后者是程序和数据库之间的对话.
先介绍几个hibernate中的基本类,在此基础之上再介绍利用session进行的基本数据操作.
API:
Configuation, 用于加载hibernate.cfg.xml配置文件
SessionFactory,用于创建session对象.
Session,负责以对象方式对数据进行增(save(obj))、删(delete(obj))、改(update(obj))、查(load(), get())操作.
session操作:
要利用session进行操作, 首先得获得session实例.附件中的HibernateUtil类是自己编写的,以较简单的方式封装了获得session的代码. 而HibernateSessionFactory是用Meclipse自动生成的, 不仅封装了获得session的代码, 还增加了线程单例特性.
1.获得session实例
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static Session session; // 该过程要加载映射文件,是一个比较耗费资源的过程,所以放在静态代码块中执行 static { Configuration config=new Configuration(); config.configure("/hibernate.cfg.xml"); SessionFactory sessionFactory=config.buildSessionFactory(); session=sessionFactory.openSession(); } public static Session getSession() { return session; } }
2.查找:session查找有两种方法:load和get, 前者使用了延迟加载(后面会介绍), 后者没有.
业务:查找id=1的Major, 输出名称.
@Test public void testFindById(){ Session session=HibernateUtil.getSession(); //只能根据主键id查找 //查找id=1的Major Major major=(Major) session.load(Major.class, 1); System.out.println(major.getName()); //关闭session session.close(); }
查找操作不需要事务管理, 但增删改操作需要. Transaction类就是hibernate用于管理事务的类.
3.添加
业务:增加一个major:Chinese专业, 有100个学生.
@Test public void testAdd(){ Session session=HibernateUtil.getSession(); Major major=new Major(); major.setName("Chinese"); major.setStuNum(100); //开启事务 Transaction tx=session.beginTransaction(); session.save(major); //提交事务 tx.commit(); session.close(); }
4.更新
业务:将Chinese专业的人数改为150人
@Test public void testUpdate(){ Session session=HibernateUtil.getSession(); Major major=(Major) session.load(Major.class, 3); major.setStuNum(150); Transaction tx=session.beginTransaction(); session.update(major); tx.commit(); }
hibernate的session更新操作要先查找出需要更新的记录, 然后更改对象属性, 再调用update方法.若采用这样的更新方式:
Major major =new Major();
major.setId(3);
major.setStuNum(150);
...
session.update(major);
则需要把对象所有的属性都设置好, 一个都不能落下, 否则在更新操作后没设置的属性就会被置空.若属性较多, 这种更新方法会非常麻烦.
5. 删除
业务需求:删除id=3的专业.
@Test public void delete(){ Session session=HibernateUtil.getSession(); //删除操作是根据主键id进行的, 不需要先查后删, 设置好id就行. Major major=new Major(); major.setId(3); Transaction tx=session.beginTransaction(); session.delete(major); tx.commit(); }
增删改操作若没有调用事务, 操作无效.
下集预告:hibernate的延迟加载和对象状态.
[/size]