接上回,上回的代码做了一个小调整,Student表的ID的类型给为varChar
Student类中的id类型改为String,映射文件的ID部分的修改未
<id column="Id" name="id" type="string">
<generator class="uuid"/>
</id>
UUID是 一种随机生成随机序列的机制,可以作为ID,不会重复
好了 ,不废话 贴代码
Hibernate01.java
package com.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Student;
public class Hibernate02 {
public static SessionFactory sessionFactory;
static {
try {
//有可能产生异常,使用try语句
Configuration cfg=new Configuration().configure();
//应用程序或资源的配置文件。无法继承此类。
sessionFactory= cfg.buildSessionFactory();
//Hibernate的核心接口之一 SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充//当数据存储源的代理,并负责创建Session对象。
} catch (HibernateException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("yushu");
s1.setAge(10L);
//s1.setId("8");
Hibernate02 h2 = new Hibernate02();
//h2.saveStudent(s1);
//h2.deleteStudent("2");
//h2.findAllStudent();
//h2.updateStudent(s1);
//h2.loadAndUodate("4");
}
//保存对象的方法
public void saveStudent(Student s){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
//以上代码所有方法都一样,得到session,开启事务,以后不在赘述
session.save(s);//保存最简单,直接调用sava()方法就行了
//问题一:当ID被设置了,ID会保存到数据库吗?
//以下代码,提交事务,关闭session
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
public void deleteStudent(String id){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
//方案一:
Student ss = new Student();
ss.setId(id);
session.delete(ss);
//方案二:session.delete((Student)session.load(Student.class, id));
/**
* 问题二:删除对象的方法,上面的代码有问题,在删除时,还得查询到这个对象,执行效率是不是太低了,有什么方法可以优化没?
* 方案一比方案二较好,但是还是新建了一个内存空间,还有没有更好的方法?
*/
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
@SuppressWarnings("unchecked")
public void findAllStudent(){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
//这就是传说中的HQL真正学好还真得花一阵功夫
Query query = session.createQuery("from Student order by id desc");
//Query 对象的list方法,可以得到对象列表
List<Student> students = query.list();
for(Student s :students){
System.out.print(s.getId()+" ");
System.out.print(s.getName()+" ");
System.out.print(s.getAge()+" ");
System.out.println();
}
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
public void updateStudent(Student student){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
student.setName("jiji");
//这个方法当ID为空的时候进行插入操作,ID不为空的时候进行修改操作,如果ID不为空,数据库
//又不存在会是什么效果呢?
//org.hibernate.StaleStateException异常
session.saveOrUpdate(student);
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
public void loadAndUodate(String id){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
Student student = (Student) session.load(Student.class, id);
student.setName("yika");
//load过来的对象,是个“干净的对象”,是对于脏数据而言的
//当这个纯的对象变为脏对象时,当事务提交时Hibernate会自动检测对象并保存
//ts.commit();这句写不写效果一样
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
}