版权声明:转载需经同意,谢谢! https://blog.csdn.net/Big_KK/article/details/82026770
使用Hibernate进行CRUD操作
1.CRUD操作
在了解完Hibernate的对象之后,可以尝试进行CRUD的操作,毕竟是Dao层的框架,那么最起码要和数据库产生点关系,看看是个什么样的结果呗。代码比较简单,就直接贴了。在里面进行了简单的说明,写出来还是为了加深印象,好记性不如烂笔头,好好总结才是自己的! 好了回正题,下面列出了基本的CRUD操作:
1.以下的操作未按照正常的try…catch…方式对事务进行分情况的提交/回滚操作。默认是按不发生异常的情况下进行操作的,
2.测试时主键生成策略为UUID, 代码中的字符串就是主键值
3.实体类Person具有的属性:id(主键),name,age,gender,birthday。
public class Main {
static SessionFactory sessionFactory = null;
//插入操作
@Test
public void test_insert() throws ParseException {
sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Person person1 = new Person();
person1.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2015-05-20"));
person1.setName("KK");
person1.setAge(20);
person1.setGender("男");
/*
* 使用save()方法来将一个对象到建立映射关系的表里面
* 参数:save(建立映射关系的实体类对象)
* 返回:该行记录的主键值key
* >插入的方法还可以使用:session.saveOrUpdate()方法进行,参数一致。
* */
Serializable key = session.save(person1);
System.out.println(key);
session.getTransaction().commit();
}
//通过设置的主键获取单个实体类的对象
@Test
public void test_get(){
sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
/*
* 使用get()方法通过id查询一个对象:
* 参数:get(实体类A的class对象, 要查询的id)
* 返回一个A的对象
* */
Person person = (Person) session.get(Person.class, "4028aa3e656c2fc401656c2fc63c0000");
System.out.println(person.toString());
session.getTransaction().commit();
}
//进行数据的修改操作
@Test
public void test_update() throws ParseException {
sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
/*
* 使用update()方法更新对象的信息。
* 大致流程:首先获取到要修改的实体对象,然后对这个实体对象的某写信息进行修改,最后再次将该对象作为最新值进行更新
* 修改指定信息的实现:在使用update()方法的时候,会确定传递进来这个实体的主键值,然后根据这个值去数据库里面修改。
* 参数:update(实体类对象)
* 在修改了一个实体之后,不使用update()方法,调用save()对这个实体再次插入也同样可以达到修改数据的目的。但是不推荐这样做!
* >修改的方法还可以使用:session.saveOrUpdate()方法进行,参数一致。
* 在调用update()方法时候,会根据传递的实体信息更新[所有的值],如果此时传递的实体类信息不完整,那么不完整的信息也会更新进去(前提:传递了正确的主键值)。
* */
Person person = (Person) session.get(Person.class,"4028aa3e656c2ffd01656c2fff060000");
person.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2015-05-20"));
session.update(person);
session.getTransaction().commit();
}
//进行删除操作
@Test
public void test_delete(){
sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
/*
* 使用delete()方法进行删除操作
* 方式1:使用设置的主键获取到实体对象,将其作为参数传递进行,执行删除
* 参数:delete(要删除的实体类对象)
* 方式2:构造一个新的实体A,将其主键设置为要删除对象的主键值,作为参数传递给delete();
* 参数:delete(构建的新的实体对象)
* 二者给我感觉是一样的。之所以要传递对象,都是为了获取组件值,然后Hibernate在底层执行delete语句的时候将其作为where条件来定位删除的行,因为执行的是删除操作,所以对其普通属性的值就不关心了
* */
Person person = (Person) session.get(Person.class, "4028aa3e656c44c701656c44c8610000");
session.delete(person);
session.getTransaction().commit();
}
@AfterClass
public static void endTest(){
System.out.println(":::::test end, close sessionFactory");
sessionFactory.close();
}
}
2.实体类的几种状态
接下来简单说说实体类的几种状态,上面代码里面就提及了saveOrUpdate()方法,看字面意思就明白这个方法是进行插入或更新的,但是具体执行某个功能,就是通过实体类的状态决定的。
实体类具有以下的几种状态:
每种不同状态的实体都无所谓是否设置了其他普通属性。
- 瞬时态
该状态下的实体没有设置主键值,且和Session未产生关系。比如新建了一个实体类对象,为其普通属性设置了参数,那么此时这个对象就是瞬时态 - 持久态
该状态下的实体设置了主键值,并与Session对象有关系,比如我们使用get()方法获取到的一个实体对象,肯定是包含主键值的,并且由于是通过Session对象获取的,所以和Session也是有关系的 - 托管态
该状态下的体设置了主键值,但是和Session对象没关系比如实例化一个实体对象,为其设置了主键值,但是仅此而已,那么这个对象就是托管态的。
上面所提及的saveOrUpdate(Object obj)方法根据传递进去的实体状态决定调用哪个功能,当实体状态是瞬时态时候,调用save()功能,当实体状态是持久态以及托管态的时候,执行uodate()功能。 一句话:实体具有主键值了,就更新,否则插入