1.Hibernate中的事物
1.1 设置事物隔离级别
Hibernate中书屋的隔离级别都是用字节存储的 二进制 十进制 read uncommitted 读未提交 0001 1 read committed 读已提交 0010 2 repeatable read 重复读 0100 4 mysql默认级别 serializable 可串行化 1000 8 配置数据库的隔离级别直接写十进制的值即可 在主配置文件中配置数据库的隔离级别 <property name="Hibernate.connection.isolation">4</property>
1.2 Hibernate管理事务的方法
//开启事务 Transcation t = session.beginTranscation(); try{ //.......写自己的代码(do som work....) //提交事务 t.commit(); }catch(Exception e){ //异常:事务回滚 if(t!=null){ t.rollback(); } }
1.3 Hibernate得到Session对象的方式
Configuration c = new Configuration(); c.Configure(); SessionFactory factory = c.bulidSessionFactory(); //方式一: Session session = factory.openSession(); //方式二: Session session = factory.getCurrentSession();
1.4 openSession 和 getCurrentSession的区别
openSession()和getCurrentSession() 1.openSession()每次调用生成新的Session getCurrentSession()每次调用都使用的同一个session(与当前线程绑定的session) 2.openSession()使用不需要配置 getCurrentSession()必须要配置,在主配置文件hibernate.cfg.xml中配置 <property name="hibernate.current_session_context_class"> thread </property> 3. openSession()使用之后可以关闭 getCurrentSession()不能关闭 4.Session要线程安全建议使用getCurrentSession(); 建议用getCurrentSession()
1.5 HibernateUtils封装的工具类
public class HibernateUtils { private static SessionFactory sessionFactory=null; static { Configuration configuration = new Configuration(); configuration.configure(); sessionFactory = configuration.buildSessionFactory(); } public static Session openSession() { return sessionFactory.openSession(); } public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); } //openSession产生的session要关闭 public static void closeSession(Session session) { session.close(); } }
2.Hibernate的增删改查
2.1 插入(save)
Session session = HibernateUtils.getCurrentSession(); Transaction t = session.beginTransaction(); try { User user =new User(); user.setUser_name("皮皮虾"); user.setUser_pwd("123456"); session.save(user); t.commit(); } catch (Exception e) { // TODO: handle exception t.rollback(); }
2.2 修改(update)
Session session = HibernateUtils.getCurrentSession(); Transaction t = session.beginTransaction(); try { //根据唯一标识来修改 //如果对象的某些属性没有设值,修改后这些属性的值为null User user =new User(); user.setUser_id(1); user.setUser_name("看谁在睡觉?"); session.update(user); t.commit(); } catch (Exception e) { // TODO: handle exception t.rollback(); }
2.3 删除(delete)
Session session = HibernateUtils.getCurrentSession(); Transaction t = session.beginTransaction(); try { //根据唯一表示来修改 User user =new User(); user.setUser_id(1); session.delete(user); t.commit(); } catch (Exception e) { // TODO: handle exception t.rollback(); }
2.4 查询(Query)
2.4.1 以oid查询
//参数1:查询的类型:T.class 参数2:唯一标识id值 session.find(T.class,id); session.get(T.class,id); session.load(T.class,id);
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { //Student student = session.find(Student.class, 5); Student student = session.get(Student.class, 5); //Student student = session.load(Student.class, 5); System.out.println(student); transaction.commit(); } catch (Exception e) { // TODO: handle exception transaction.rollback(); }
2.4.2 对象导航图查询
常用于多表查询
2.4.3 原生sql语句查询
SQL(结构化查询语言 Structor Query Language)
Hibernate5.2以后用 session.createNativeQuery(sql语句); Hibernate5.2以前用session.createSQLQuery(sql语句); //取session Session session = HibernateUtils.getCurrentSession(); Transaction t= session.beginTransaction(); try { //使用原生sql语句查询查询所有 //createNativeQuery是hibernate5.2版本之后建议用 /*NativeQuery<User> query= session.createNativeQuery("select * from user", User.class);*/ //createSQLQuery是Hibernate5.2版本之前使用的,但是目前或者将来不会使用了 NativeQuery<User> query=session.createSQLQuery("select * from user"); //设置从第几个位置开始取数据 query.setFirstResult(0); //设置每次最多取多少条数据 query.setMaxResults(4); //query.list() 与query.getResultList()等价 System.out.println("=--==="+query.list()); t.commit(); } catch (Exception e) { // TODO: handle exception if (t!=null) { t.rollback(); } } }
2.4.4 HQL查询(
1.基础查询 )
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { //基本语法:from 包名+类名(如果整个程序中只有这么一个类,直接省略包名,默认查找该类) String HQL = " from com.xx.domain.Student"; //参数1:HQL语句 参数2:结果类型 Query<Student> query = session.createQuery(HQL, Student.class); List<Student> list = query.list() System.out.println(list); transaction.commit(); } catch (Exception e) { // TODO: handle exception transaction.rollback(); }
2.别名查询
查询所有的信息
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { String HQL = "select s from Student s"; Query<Student> query = session.createQuery(HQL, Student.class); List<Student> list = query.list(); System.out.println(list); transaction.commit(); } catch (Exception e) { // TODO: handle exception transaction.rollback(); }
查询持久化类的某个成员变量
Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { String HQL = "select s.name from Student s where id=:id"; Query query = session.createQuery(HQL); query.setParameter("id", 2); System.out.println(query.list()); transaction.commit(); } catch (Exception e) { // TODO: handle exception transaction.rollback(); }
3.条件查询
方式一: Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { //:user_id表示占位 String HQL="from com.xx.domain.Student where id=:id"; Query<User> query = session.createQuery(HQL, Student.class); //参数1:表示属性名 ,参数2:属性名对应的值 query.setParameter("id", 2); System.out.println(query.uniqueResult()); transaction.commit(); } catch (Exception e) { // TODO: handle exception if (transaction!=null) { transaction.rollback(); } } 方式二: Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); try { String HQL = " from Student where id=?"; Query<Student> query = session.createQuery(HQL, Student.class);
//?号的位置从0开始 query.setParameter(0, 2); System.out.println(query.uniqueResult()); transaction.commit(); } catch (Exception e) { // TODO: handle exception transaction.rollback(); }