SSH进阶之hibernate(四)
2018年4月18日的我在这儿写博客,希望四年以后的我会以现在的我自豪,话不多说,直接进入正题,今天我们介绍的hibernate第四天的内容。
今天的内容包括单表查询的HQL,QBC涉及一点QBE,本地的SQL就不涉及因为既然用的是hibernate就不要写大量的SQL语句,除非要用Mybatis,还有hibernate的并发访问,悲观锁乐观锁,配置C3P0数据源,Session的管理,配置二级缓存
单表查询HQL:
先创建双向一对多的Customer和Order通过customer_id 关联
public class Customer implements Serializable {
private Integer id;
private String name;
private Integer version;
//一对多
private Set<Order> orders = new HashSet<Order>();
public Customer(){
}
public Customer(int id,String name){
this.id=id;
this.name=name;
} //注意这里的version时乐观锁的配置,先不需要加上去
public class Order implements Serializable {
private Integer id;
private String ordernum;//订单号
//多对一
private Customer customer;
接下来写配置文件Customer.hbm.xml
<set name="orders" table="ORDERS" inverse="true">
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
Order.hbm.xml
<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" lazy="proxy" fetch="select"/>
配置hibernate.cfg.xml
<mapping resource="cn/itcast/domain/Customer.hbm.xml" />
<mapping resource="cn/itcast/domain/Order.hbm.xml" />
先自己在数据库上添加语句,然后HQL,QBC查询
@Test
public void test(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
ts.commit();
s.close();
}
/*
* HQL单表查询
*/
@Test
public void test2(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Query q = s.createQuery("from Customer where id=? and name=?");
q.setInteger(0, 1);
q.setString(1, "客户1");
Customer cus = (Customer) q.uniqueResult();//当查询的记录为一条时,可以用该方法
System.out.println(cus);
System.out.println("---------");
//方式二
List<Customer> list = q.list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
@Test//一条语句进行查询
public void test3(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Customer cus = (Customer) s.createQuery("from Customer where id=? and name=?").setInteger(0, 1).setString(1, "客户1").uniqueResult();
System.out.println(cus);
System.out.println("---------");
//方式二
List<Customer> list = s.createQuery("from Customer where id=? and name=?").setInteger(0, 1).setString(1, "客户1").list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
//按照条件查询
@Test
public void test4(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list= s.createQuery("from Customer where name like ?").setString(0, "%客户%").list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
//QBC 按照条件查询
@Test
public void test5(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Criteria criteria = s.createCriteria(Customer.class);
Criterion c1 = Restrictions.eq("id", 1);
Criterion c2 = Restrictions.eq("name", "客户1");
criteria.add(c1);
criteria.add(c2);
//执行查询
Customer cus = (Customer) criteria.uniqueResult();
System.out.println(cus);
ts.commit();
s.close();
}
@Test
public void test(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Criteria criteria = s.createCriteria(Customer.class);
//添加条件
Criterion c= Restrictions.like("name", "%客户%");
criteria.add(c);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
//QBE
@Test
public void test2(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Customer cus = new Customer();
cus.setName("客户2");
Customer c = (Customer) s.createCriteria(Customer.class).add(Example.create(cus)).uniqueResult();
System.out.println(c);
ts.commit();
s.close();
}
//其他的查询。多态查询
@Test
public void test3(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Query query = s.createQuery("from java.io.Serializable");
for(Object o :query.list()){
System.out.println(o);
}
ts.commit();
s.close();
}
//排序查询,HQL
@Test
public void test4(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.createQuery("from Customer order by id").list();
for (Customer c: list) {
System.out.println(c);
}
ts.commit();
s.close();
}
//分页查询 QBC方式
@Test
public void test5(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.createCriteria(Customer.class).setFirstResult(0).setMaxResults(4).list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
//具名查询
@Test
public void test6(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.createQuery("from Customer where id=:ddd and name=:aaa").setInteger("ddd", 1).setString("aaa","客户1").list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
//命名查询,根MyBatis一样
@Test
public void test7(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.getNamedQuery("findAllCustomers").list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
@Test//左外链接
public void test(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Object[]> list = s.createQuery("from Customer c left outer join c.orders ").list();
for(Object obj:list){
Object[] o=(Object[]) obj;
for (Object object : o) {
System.err.println(object);
}
}
ts.commit();
s.close();
}
@Test//迫切左外链接
public void test2(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.createQuery("from Customer c left outer join fetch c.orders ").list();
//set集合过一下去除重复的元素
Set<Customer> set =new HashSet<Customer>(list);
for (Customer customer : set) {
System.out.println(customer);
System.out.println(customer.getOrders());
}
ts.commit();
s.close();
}
@Test//投影,可以查询具体的属性,使用的javabean的属性
public void test3(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
List<Customer> list = s.createQuery("select new Customer(c.id,c.name) from Customer c ").list();
for (Customer customer : list) {
System.out.println(customer);
}
ts.commit();
s.close();
}
}
配置悲观,乐观锁,乐观锁需要在customer中加入version ,和hibernate中加入<version name='version' ></>
@Test
public void test(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Customer cu = (Customer) s.get(Customer.class,1,LockOptions.UPGRADE);
cu.setName("张三6");
ts.commit();
s.close();
}
@Test//乐观锁
public void test2(){
Session s = HibernateUtil.getSession();
Transaction ts = s.beginTransaction();
Customer cu = (Customer) s.get(Customer.class,1);
cu.setName("张三6");
ts.commit();
s.close();
}
hibernate使用的是默认的数据源,只可以做练习用但是要是做到真正的项目时候,需要用hibernate的官方支持的数据源C3P0
首先拷贝jar包,
然后在hibernate.cfg.xml <property name='hibernante.connection.provider_class'>org.hibernate.connetion.C3P0CoonectionProvider</property>
Session 的管理,因为把session绑定到当前的线程上效率高
1. 在Util的工具类下把optionSession换成getCurrentSession( )
private static final SessionFactory sessionFactory;//只有一份
static{
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException e) {
System.out.println("初始化SessionFactory失败。"+e);
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
//把sessio绑定到当前线程上去
//return sessionFactory.getCurrentSession();
return sessionFactory.openSession();
}
public static void main(String[] args) {
Session s = getSession();
// System.out.println(UUID.randomUUID().toString());
s.close();
}
2. 在 hibernate.cfg.xml 配置
<property name='hibernate.current_session_context_class'>thread</property>
配置二级缓存
4.使用EHcache二级缓存
5.验证
@Test
public void test(){Session s1 = HibernateUtil.getSession();
Session s2 = HibernateUtil.getSession();
Transaction ts = s1.beginTransaction();
System.out.println(s2==s1);
ts.commit();
}
@Test
public void test2(){
Session s1 = HibernateUtil.getSession();
Transaction ts = s1.beginTransaction();
Query query = s1.createQuery("from Customer where id=1");
Customer cus =(Customer) query.uniqueResult();
ts.commit();
s1.close();
Session s2 = HibernateUtil.getSession();
s2.get(Customer.class, 1);
s2.createQuery("from Customer where id=1").uniqueResult();
s2.close();
}
//集合缓存
@Test
public void test3(){
Session s1 = HibernateUtil.getSession();
Transaction ts = s1.beginTransaction();
Customer cus = (Customer) s1.get(Customer.class, 1);//查出并且存入到一二级缓存
System.out.println(cus.getOrders());//查出并且存入到一二级缓存
ts.commit();
s1.close();
Session s2 = HibernateUtil.getSession();
Transaction t = s2.beginTransaction();
Customer cus1 = (Customer) s2.get(Customer.class, 1);//查出并且存入到一二级缓存
System.out.println(cus1.getOrders());//查出并且存入到一二级缓存
t.commit();
s2.close();
}
//开启查询缓存
@Test
public void test4(){
Session s1 = HibernateUtil.getSession();
Transaction ts = s1.beginTransaction();
Query query = s1.createQuery("from Customer where id=1");
query.setCacheable(true);//开启查询缓存
Customer cus =(Customer) query.uniqueResult();
ts.commit();
s1.close();
Session s2 = HibernateUtil.getSession();
s2.get(Customer.class, 1);
Query q = s2.createQuery("from Customer where id=1");
q.setCacheable(true);
q.uniqueResult();
s2.close();
}