Hibernate的检索方式
导航对象图检索方式
根据已经加载的对象导航到其他对象
Customer customer =(Customer) session.get(Custmoer.class,1);
customer.getOrders();
OID检索方式
根据对象的OID来检索对象
get/load 方法进行检索
HQL检索方式 面向对象的查询 支持方法链编程 适用于简单查询
查询所有记录
Query query= session.createQuery("HQL");
List<Customer>list =session.createQuery("from Customer").list();
for(Customer customer: list){
System.out.println(customer);
}
查询使用别名
List<Customer> list=session.createQuery("from Customer c").list();
使用带参数的别名
List<Customer> list=session.createQuery("from Customer as c where c.name=?").setString(0,"demo").list();
不支持select * from Customer写法
List<Customer> list=session.createQuery("select c from Customer c").list(); 相当于select *
排序
List<Customer> list=session.createQuery("from Customer c order by c.id desc").list();
分页查询
Query query =session.createQuery("from Order");
query.setFirstResult(20);
query.setMaxResult(10);
List<Order> list =query.list();
for(Order order :list){
System.out.println(order);
}
单个对象查询
Customer customer =(Customer) session.createQuery("from Customer where cname="?").setString("0","demo").uniqueResult();
参数绑定
使用?号方式进行绑定
Query query =session.createQuery("from Customer where cname=?");
query.setString(0,"demo");
list<Customer> list=query.list();
使用名称方式进行绑定
Query query =session.createQuery("from Customer where cname=:name and cid=:id ");
query.setString("name","demo");
query.setInteger("id",3);
list<Customer> list =query.list();
绑定实体
list<Order> list =session.createQuery("from Order o where o.customer=?").setEntity(0,customer).list();
投影操作
使用构造 来投影
List<Customer> list =session.createQuery("select new Customer(cname) from Customer").list();
模糊查询
Query query =session.createQuery("from Customer where cname like ?");
query.setParameter(0,"xxx");
list<Customer> list =query.list();
SQL多表查询
交叉连接 select *from A,B 笛卡尔乘积 不常用
内连接 查询的是两个表的交集 将数据封装在list<Object>中 select * from A inner join B on A.属性=B.属性 两表匹配的行
隐式内连接 select * from A,B where A.属性=B.属性
迫切内连接 将数据封装在List<Customer>实体类中 需要distinct排重
左外连接 select * from A left outer join B on A.字段 =B.字段
右外连接 select * from A right outer join B on A.字段 =B字段
迫切左外连接/迫切右外连接
QBC检索方式 适用于复杂查询
使用QBC(Query By Criteria)来检索对象
查询List<Customer> list =session.createCriteria(Customer.class).list();
排序 List<Customer> list=session.createCriteria(Customer.class).addOrder().list();
<Object> list =session.createQuery("select c.name from Customer c" ).list();
分页
Criteria criteria =session.createCriteria(Order.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<Order> list =criteria.list();
获取单个对象
Customer customer = (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).uniqueResult();System.out.println(customer);
本地SQL检索方式
SQLQuery query= session.createSQLQuery("SQL");
List<Object[]> list = session.createSQLQuery("select * from customer").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
Hibernate的抓取策略
立即检索 执行某行代码时,马上发出SQL语句进行查询 get()
延迟检索 执行某行代码时,不会马上发出SQL语句进行查询,当真正使用该对象时才会进行查询 load()
类级别检索 <class>标签上配置lazy
关联级别的检索 <set>/ <many-to-one>上配置lazy
从一的一方 关联 多的一方
fetch 控制sql语句的类型
join 会忽略lazy
select 发送多条sql查询关联对象 默认值
subselect 发送子查询关联对象
lazy 控制关联对象的检索是否采用延迟
true 查询关联对象的时候采用延迟检索 默认值
false 查询关联对象的时候不使用延迟检索
extra 极其懒惰的
从多的一方 关联 一的一方
fetch 控制sql语句的发送格式
join 发送迫切左外连接 查询关联对象
select 发送多条sql检索关联对象
lazy 关联对象检索 是否使用延迟
false 不延迟
proxy 使用代理
no-proxy 不使用代理
事务
事务是逻辑上的一组操作 要么全部成功 要么全部失败
事务的四大特性
原子性 一组事务操作不可分割
一致性 事务执行前后 数据的完整性保持一致
隔离性 一个事务在执行过程中不应该收到其他事务的干扰
持久性 一旦事务执行结束 数据持久保存在数据库中
数据库常见读问题
脏读:一个事务读到另一个事务未提交数据中
不可重复读:一个事务读到另一个事务已经提交的数据(update)中 导致查询结果不一致
虚读:一个事务读到另一个事务已经提交的数据(insert)中 导致查询结果不一致
数据库常见写问题
丢失更新 解决方案 悲观锁 乐观锁
事务的隔离级别
1 未提交读 三种读问题都有可能发生
2 已提交读 避免脏读 不可重复读和虚读有可能发生
3 重复读 避免脏读和不可重复读 虚读有可能发生
4 串行的 序列化 对并发影响最大 能保证数据的完整性和一致性
线程中绑定session
SessionFactory.getCurrentSession()方法 线程结束 则session自动关闭
hibernate中设置事务的隔离级别
核心配置文件中
<property name=“hibernate.connection.isolation”>4</property>