hibernate

作者: 凌晨的咸鱼 | 来源:发表于2021-11-24 00:50 被阅读0次
    hibernate默认不提交事务
    hibernate有2级缓存
    一个session执行的正常流程:
    
    public class App {
        public static void main(String[] args) {
    
            //创建对象
            User user = new User();
            user.setPassword("123");
            user.setCellphone("122222");
            user.setUsername("nihao");
    
            //获取加载配置管理类
            Configuration configuration = new Configuration();
    
            //不给参数就默认加载hibernate.cfg.xml文件,
            configuration.configure();
    
            //创建Session工厂对象
            SessionFactory factory = configuration.buildSessionFactory();
    
            //得到Session对象
            Session session = factory.openSession();
    
            //使用Hibernate操作数据库,都要开启事务,得到事务对象
            Transaction transaction = session.getTransaction();
    
            //开启事务
            transaction.begin();
    
            //把对象添加到数据库中
            session.save(user);
    
            //提交事务
            transaction.commit();
    
            //关闭Session
            session.close();
        }
    }
    

    session.save()

    • session.save():保存到一级缓存中
    • session.flush():代表刷新,同步一级缓存中的对象到数据库中,仅仅代表把sql语句刷到了数据库中
    • transaction.commit():提交sql语句
    • 所以正常是session.save() 然后 session.flush() 最后 transaction.commit()
    • 但是session.save(),transaction.commit() 也行,在commit的之前,隐含调用了flush,即发送了SQL,又提交了事务,所以有值;

    session查询

    • void save(Employee emp);
    • void update(Employee emp);
    • session.saveOrUpdate(obj);
    • Employee findById(Serializable id);
    • List<Employee> getAll();
    • List<Employee> getAll(String employeeName);
    • List<Employee> getAll(int index, int count);
    • void delete(Serializable id);
    • session.get(javaBean.class, int id); 【传入对应的class和id就可以查询,主键查询,返回javaBean对象】
    • session.load(javaBean.class, int id); 【支持懒加载,主键查询,返回javaBean对象】

    HQL查询:

    • hibernate query language面向对象的查询语言,可以用来查询全部的数据。
    • 注意:from 后面是javaBean名称

    正常查询

      Query query = session.createQuery("FROM User");
      List list = query.list();
      System.out.println(list);
    

    当然也可以传入参数

    按参数位置查询
    Query query = session.createQuery("FROM User WHERE id=?");
    //这里的?号是从0开始的,并不像JDBC从1开始的!
    query.setParameter(0, user.getId());
    List list = query.list();
    System.out.println(list);
    
    按参数名称查询
    Query query = session.createQuery("FROM User WHERE id=:id");
    //这里的?号是从0开始的,并不像JDBC从1开始的!
    query.setParameter("id", user.getId());
    //         query.setString("id", "1");
     //        setDate()        给映射类型为Date的参数赋值
     //        setDouble()        给映射类型为double的参数赋值
     //        setBoolean()    给映射类型为boolean的参数赋值
     //        setInteger()    给映射类型为int的参数赋值
     //        setTime()        给映射类型为date的参数赋值
    List list = query.list();
    // User user = (User)query.uniqueResult();    获取单个对象的信息
    System.out.println(list);
    
    like查询
    String hql = "from Customer where name like ?";
    Query query = session.createQuery(hql);
    query.setString(0, "%wy%");
    List<Customer> list = query.list();
    
    分页查询
    Query query = session.createQuery("FROM User");
    // 设置分页信息 limit ??
    query.setFirstResult(0);  //开始
    query,setMaxResults(10);  //获取多少条数据
    List list = query.list();
    System.out.println(list);
    

    QBC查询

    • query by criteria 完全面向对象的查询
    • 从上面的HQL查询,我们就可以发现:HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码....QBC查询就是完全的面向对象查询...但是呢,我们用得比较少
    //创建关于user对象的criteria对象
     Criteria criteria = session.createCriteria(User.class);
    //添加条件
    criteria.add(Restrictions.eq("id", 1));
    //查询全部数据
    List list = criteria.list();
    System.out.println(list);
    

    本地SQL查询

    • 有的时候,如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!
    • 但是呢,它有一个缺陷:它是不能跨平台的...因此我们在主配置文件中已经配置了数据库的“方言“了。
    //将所有的记录封装成User对象存进List集合中
    SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM User").addEntity(User.class);
    List list = sqlQuery.list();
    System.out.println(list);
    
    //分页查询
    SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM User limit ?,?")
    sqlQuery.setParameter(0, 1);
    sqlQuery.setParameter(1, 10);
    sqlQuery.addEntity(User.class);
    List<User> list = sqlQuery.list();
    System.out.println(list);
    
    

    hibernate的性能一直饱受诟病,通用工具都难免此类问题,实体加的关联多了,数据加载的就慢,再者,hibernate最擅长的并非查询,而是写操作,毕竟是全字段查询,相对来说,JdbcTemplate就可以指定查询哪些具体字段,自己指定的关联查询sql也比hibernate生成的sql高效简洁,让JdbcTemplate负责查询,hibernate负责写入,是个不错的搭配

    相关文章

      网友评论

          本文标题:hibernate

          本文链接:https://www.haomeiwen.com/subject/mwwgtrtx.html