hibernate学习

SessionFactory
1.创建SessionFactory做的事情:
根据核心配置文件中的配置,映射到数据库的表中进行建表或者更新表的操作。
2.创建SessionFactory,非常的消耗资源,在没有多数据源的情况下,一般一个项目只有一个SessionFactory。
Session
1.session类似于jdbc中的connection
2.session的常用方法
1).添加 save方法
2).修改 update方法
3).删除 delete方法
4).根据id查找 get方法


public class Test {
    @org.junit.Test
    public void add() {
//        //1.加载hibernate核心配置文件
//        Configuration cfg = new Configuration();
//        cfg.configure();
//        //2.创建SessionFactory对象
//        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //3.使用SessionFactory对象创建session
        SessionFactory sessionFactory = SessionUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        //4.开启事务
        Transaction transaction = session.beginTransaction();
        //5.写具体crud操作
       //添加
//        User user = new User();
//        user.setName("zcl");
//        user.setPassword("123456");
//        user.setAddress("HZ");
//        session.save(user);
        //根据id查找
//        User o = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
//        System.out.println(o.toString());
        //修改
//        User o = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
//        o.setName("李四");
//        session.update(o);
        //删除
//        User user = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
//        session.delete(user);
//        User user = new User();
//        user.setName("张飞");
//        user.setPassword("123");
//        user.setAddress("葫芦岛");
        User user = (User) session.get(User.class, "4028489976e7366a0176e7366e040000");
        user.setName("2礼拜");
      //  session.saveOrUpdate(user);
        //6.提交事务
        transaction.commit();
        //7.关闭资源
        session.close();
        sessionFactory.close();
    }
}

3.session是单线程对象(session对象不能共用,只能自己使用)
Transaction
1.事务对象
2.提交和回滚:
commit()、rollback();
3.事务的概念:
原子性、一致性、隔离性、持久性。

Hibernate中实体类的三种状态
1.瞬时态
没有session关联.没有id
2.持久态
有id,与session关联
3.托管态
有id,没有session关联

saveOrUpdate方法
为瞬时态时为新增操作,其他为修改操作

Hibernate一级缓存和二级缓存
一级缓存:
hibernate默认开启一级缓存
是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库中取数据
二级缓存:
需要从配置文件中配置,现在一般不开启二级缓存,用redis代替它
是SessionFactory级别的缓存,也就是整个项目中,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库

一级缓存特性:持久态会自动更新数据库
当一个持久态的返回实体类时,如果实体类在一级缓存中不存在,回去执行select语句查找这条数据,返回结果后,该结果会写入一级缓存中以及对应的快照区。执行修改动作时,只改变一级缓存中的相应内容,快照区不改变,事务提交时,会将一级缓存中的内容与快照区比较,如果不同就自动更新,相同的话不会执行update。
优点:快速,节约资源。

在实际项目中,session对象要保持单线程,需要与本地绑定,在配置文件中进行配置。
获取与本地绑定的session,不需手动要关闭,否则会报错

hibernate api的使用
Query对象
Critia对象
SQLQuery对象



public class Test03 {
    @Test
    public void test4() {
        Session session = null;
        Transaction transaction = null;
        try {
            session = SessionUtil.getSessionObject();
            transaction = session.beginTransaction();
            SQLQuery sqlQuery = session.createSQLQuery("select * from t_user a join t_dept b on a.dept=b.did ");
            List list = sqlQuery.list();
            System.out.println(list);
        }catch (Exception e){

        }
    }
        @Test
        public void test3 () {
//        Session session = null;
//        Transaction transaction = null;
//        try {
//            session = SessionUtil.getSessionObject();
//            transaction = session.beginTransaction();
//            Criteria criteria = session.createCriteria(User.class);
//            //查询所有
//            //List<User> list = criteria.list();
//            //条件查询,需要使用add方法,使用类对象实现条件设置
//            criteria.add(Restrictions.eq("name","李清照"));
//            criteria.add(Restrictions.like("address","%s%"));
//            List<User> list = criteria.list();
//            //排序查询
//            criteria.addOrder(Order.asc("id"));
//            criteria.addOrder(Order.desc("id"));
//            List list = criteria.list();
//            //分页查询
//            criteria.setFirstResult(0);
//            criteria.setMaxResults(2);
//            List list = criteria.list();
//            for (User u :
//                    list) {
//                System.out.println(u.toString());
//            }
//            transaction.commit();
//        } catch (Exception e) {
//            e.printStackTrace();
//            transaction.rollback();
//        }
        }

        @Test
        public void test2 () {
//        Session session = null;
//        Transaction transaction = null;
//        try {
//            session = SessionUtil.getSessionObject();
//            transaction = session.beginTransaction();
//            //排序
//            Query query = session.createQuery("from User order by id desc ");
//            List<User> list = query.list();
//            //分页
//            Query query = session.createQuery("from User order by id desc");
//            //设置开始位置
//            query.setFirstResult(0);
//            //设置最大记录数
//            query.setMaxResults(2);
//            List list = query.list();
//            //聚合
//            Query query = session.createQuery("select count(*) from User ");
//            Object o = query.uniqueResult();
//            Long obj=(Long) o;
//            int count=obj.intValue();
//            System.out.println(count);
//
//            //            query.setParameter(0,"4028489976ea83fe0176ea8402540000");
            query.setParameter(1,"李清照");
            List<User> list = query.list();
            //模糊
            Query query = session.createQuery("from User where name like ?");
            query.setParameter(0, "%飞%");
            List<User> list = query.list();
//            for (User u :
//                    list) {
//                System.out.println(u.toString());
//            }
//            transaction.commit();
//        } catch (Exception e) {
//            transaction.rollback();
//            e.printStackTrace();
//        }
        }

        @Test
        public void test () {
            Session session = null;
            Transaction transaction = null;
            try {
                session = SessionUtil.getSessionObject();
                transaction = session.beginTransaction();
                //使用Query对象
//            Query query = session.createQuery("from User");
//            List<User> list = query.list();
//            for (User u :
//                    list) {
//                System.out.println(u.toString());
//            }
                //使用Critia对象
//            Criteria criteria = session.createCriteria(User.class,"from User");
//            List<User> list1 = criteria.list();
//            for (User u:
//                    list1 ) {
//                System.out.println(u.toString());
//            }
                //使用SQLQuery对象
                SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
                sqlQuery.addEntity(User.class);
                List<User> list = sqlQuery.list();
                for (User u :
                        list) {
                    System.out.println(u.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值