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