1、什么是crud?
crud代表了save、update、get、delete;也就是所谓的添加、修改、查找、删除。主要被用在描述软件系统中DataBase或者持久层的基本操作功能。
2、如何理解crud?
修改时,实际上是修改hibernate中的对象状态。
3、 在hibernate中 对象有三种状态:
(1)、瞬时状态:一个实体对象,既没有id,也没有和session绑定。
(2)、游离状态:一个实体对象,有id,但是没有和session绑定。
(3)、持久状态:一个实体对象,有id也和session绑定。
实际上,session的四种方法就是在改变实体对象在hibernate中的对象状态。
4、持久化对象的特点:
任何对象的变化都会自动同步到数据库中。
hibernate提供了一个savaOrUpdate的方法,这个方法自动识别对象的状态,实际开发中不去思考对象的实际状态,直接调用该方法。
5、crud操作总结
Configuration :加载hibernate的配置文件。
SessionFactory:会话工厂,在实际的程序也只存在一个对象。
Session:用来操作数据库的会话对象,产生事务对象
Transaction:事务控制对象
Session方法
BeginTransaction() 开始事务
Save()
saveOrUpdate()
delete()
update()
get()/load();
Query q = createQuery()
q.list()
//session.createSQLQuery(arg0)
Query:执行数据库的查询操作,负责执行HQL语句
具体代码奉上:(注:此代码只是测试代码,还需要配置hibernate和实体类以及数据库的建立。有兴趣可以查看我博客项目搭建)
package cn.hd.test; import cn.hd.MyUtils.HibernateUtils; import cn.hd.bean.Student; import cn.hd.bean.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class Demo { public static void main(String[] args) { /*读取配置文件 .configure()自动读取cfg.xml文件*/ Configuration configuration = new Configuration().configure(); /*获得sessionFactory对象,自动生成表,读取数据库信息,检查数据表是否更新 * 这个对象我们用它只用来获取session * 实际上这行代码 它检查了数据库和实体类 * 如果有变化它会更新 * 非常耗费资源 解决方案:(封装工具类) * */ SessionFactory sessionFactory = configuration.buildSessionFactory(); /*使用sessionFactory获得session对象*/ Session session = sessionFactory.openSession(); /*开启事务 * hibernate 必须开启事务 * 不开启事务不会将数据保存到数据库 * */ Transaction transaction = session.beginTransaction(); /*向数据表中插入一条数据*/ /*User user = new User(); user.setName("张三"); user.setPsd("38383838");*/ Student student = new Student(); student.setName("张三"); student.setDenger("男"); /*添加、保存方法*/ session.save(student); /*提交事务*/ transaction.commit(); /*关闭资源*/ session.close(); sessionFactory.close(); } /*演示 session的crud方法*/ @Test public void get(){ //get 查找 只能通过主键来查找 Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); /*通过主键查询单条数据*/ Student student = session.get(Student.class,1); System.out.println(student); transaction.commit(); session.close(); sessionFactory.close(); } @Test public void del(){ Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); /*两种方法:*/ /*1.先调用个get 获取id 再通过delete*/ Student student = session.get(Student.class,1); if (student != null) { session.delete(student); } /*2.手动设置id*/ /*Student student1 = new Student(); student1.setSid(2); session.delete(student1);*/ transaction.commit(); session.close(); sessionFactory.close(); } @Test public void upd(){ Session session = HibernateUtils.getOpenSession(); Transaction transaction = session.beginTransaction(); Student student = new Student(); student.setSid(2); student.setName("狗崽"); student.setDenger("nv"); if (student != null) { session.update(student); } /*添加或修改*/ //session.saveOrUpdate(student); transaction.commit(); HibernateUtils.close(session); } }
查看代码的时候不难发现,我的增加方法与其他方法不一样,查询、删除一样,但是和修改又不一样。
这里,简单解释一下,写增加方法是用的是普通的main方法,但是在测试这种不同功能的代码时就显得非常麻烦,所以我就运用了Junit测试类,这样就可以分别运行不同的代码块了,使得测试代码时更加方便,然后就是查询、删除和修改了,由于代码的重用,这样就产生了大量的重复代码,所以就封装了一个工具类。节省代码的同时也节省了资源。
具体代码奉上:
package cn.hd.MyUtils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static Configuration configuration = null; private static SessionFactory sessionFactory = null; private HibernateUtils(){} static { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static Session getOpenSession(){ return sessionFactory.openSession(); } public static void close(Session session){ session.close(); } }