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负责写入,是个不错的搭配
网友评论