hibernate

2021-11-24  本文已影响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查询

HQL查询:

正常查询

  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查询

//创建关于user对象的criteria对象
 Criteria criteria = session.createCriteria(User.class);
//添加条件
criteria.add(Restrictions.eq("id", 1));
//查询全部数据
List list = criteria.list();
System.out.println(list);

本地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负责写入,是个不错的搭配

上一篇下一篇

猜你喜欢

热点阅读