java_hibernate 框架4

类级别查询

@Test
	public void func7() {
		
		//------------------------------------------------------------------------
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		//关联级别查询  调用时 才加载  注意:使用懒加载时要确保,调用属性加载数据时,session还是打开的.不然会抛出异常
		Customer c = session.load(Customer.class, 2l);
		//无任何策略
		Customer a = session.get(Customer.class, 2l);
		System.out.print(c);
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  

get方法:没有任何策略. 调用即立即查询数据库加载数据.  

load方法: 应用类级别的加载策略 使用才会加载

  

<!-- lazy 属性 决定是否延迟加载
			 	true:延迟加载   默认
			 	false 不延迟加载
			 	extra 及其懒惰
			 
			 
			 fetch属性:决定加载策略    使用什么类型的sql语句加载集合数据
			 	select 默认
			 	join 多表查询加载集合
			 	subselect 使用子查询加载集合     
		 -->
		 <!-- batch-size="3"
		 	一次抓取几个客户的联系人
		 	批量抓取
		  -->
		<set name="linkMans" cascade="save-update" inverse="true" lazy="true" fetch="select">
			<key column="lkm_cust_id"></key>
			<one-to-many class="LinkMan"/>
			
		</set>

  

lazy属性默认是true        查询类是返回代理对象 

当lazy:false. load方法会与get方法没有任何区别.调用时即加载数据.

//lazy 和 fetch 属性
	//fetch select
	@Test
	public void func9() {
		//关联级别 延迟加载
		//lazy:true     使用时才加载集合数据
		//fetch:select   
		//
		
		//------------------------------------------------------------------------
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		Customer c = session.load(Customer.class, 2l);
		Set<LinkMan> linkMans = c.getLinkMans();//关联级别
		System.out.print(linkMans);
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
		
		//lazy:false     立即加载集合数据
		//fetch:select   
		
		
		//lazy:extra     与true 懒加载差不多       只获得集合的size 只查询集合的size
		//fetch:select  
		
		
		//fetch join 多表查询
		//lazy:true|false|extra 失效 没有意义  都是立即加载
		
		
		
		
		
	}
	
	//fetch:subselect
	public void func10() {
		//子查询
		//lazy:true     懒加载 使用才加载
		//fetch:subselect    子查询
		//
		
		//------------------------------------------------------------------------
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "from Customer";
		Query query  = session.createQuery(hql);
		List<Customer> list = query.list();
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
		
		
		//lazy:false     立即加载
		//fetch:subselect    子查询   立即加载以及子查询
		
		//lazy:extra     懒加载效果一样
		//fetch:subselect    子查询   立即加载以及子查询
	}
	
	
	public void function1() {
		//子查询
		//fatch 决定加载的sql语句
		//反查询     
		//select 单表查询                默认
		//join   多表查询
		
		//lazy 决定加载时机
		/*false       立即加载
		 * proxy      代理决定     默认    由一方决定        就是一放的lazy
		 * 
		 * 
		 * proxy        select         使用时加载
		 * 
		 * false        select           全加载
		 * 
		 * false        join         多表查询     lazy失效      
		 * 
		 * proxy         join           多表查询     lazy失效   
		 * */
		//------------------------------------------------------------------------
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		LinkMan lmLinkMan = session.get(LinkMan.class, 1l);
		Customer customer = lmLinkMan.getCustomer();
		System.out.print(customer);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
		
		/*
		 * no-session问题解决 扩大session的作用范围
		 * 利用filter
		 * 
		 * 创建session
		 * 
		 * chain.dofilter(req,res);
		 * 
		 * 销毁session
		 * 
		 * 
		 * */

	}

  结论 用默认的就好

HQL查询      hibernate Query Language

public void hql() {
		 Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			
			/*取数据list customer 所有的*/
			String hql = "from Customer";
			Query query = session2.createQuery(hql);
              //不止一个值使用list()方法 即可返回一个list List<Customer> customers = query.list(); System.out.println(customers); /*提交*/ txTransaction.commit(); session2.close(); sessionfactory.close(); }

 添加where条件  使用 :变量名       来让hibernate知道这是个需要替换的变量

public void hql_rule_include_symbol() {
		 Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			
			/*找数据*/
			/*HQL语句中 不可能出现数据库名      */
			String hql2 = "from Customer where cust_id = :abc";
			
			Query query = session2.createQuery(hql2);
              //替换变量 query.setParameter("abc", 1l);
            //得到唯一值 使用uniqueResult方法 Customer c = (Customer)query.uniqueResult(); System.out.println(c); /*提交*/ txTransaction.commit(); session2.close(); sessionfactory.close(); }

  分页

 @Test
	 public void hql_page() {
		 Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			
			/*取数据*/
			String hql = "from Customer";
			
			Query query = session2.createQuery(hql);
              //设置第几个开始
query.setFirstResult(0);
              //数多少个 query.setMaxResults(100); //query.setParameter("abc", 1l); List<Customer> customers = query.list(); /*提交*/ txTransaction.commit(); session2.close(); sessionfactory.close(); }

  

跨表

public void hql_page2() {
		 Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			
			/*取数据 customer为1的所有linkman*/
			String hql = "from Customer c,LinkMan l where l.customer = c.cust_id and c.cust_id = :id";
			
			Query query = session2.createQuery(hql);
            //设置第几个开始
			query.setParameter("id", 1l);
			List<Object[]> objects = query.list();
			System.out.println(objects);
			/*提交*/
			
			txTransaction.commit();
			session2.close();
			sessionfactory.close();
	 }

 排序

public void func2() {
		//排序
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = " from Customer order by cust_id desc";
		//查询object子类的对象  所有注册的对象
		Query query = session.createQuery(hql);
		List<Customer> list = query.list();
		System.out.println(list);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  count

public void func5() {
		//查条数
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "select count(*) from Customer";
		Query query = session.createQuery(hql);
		//query.setParameter("id","id");
		
		Number count = (Number) query.uniqueResult();
		System.out.println(count);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  查询所需要的值

	public void func7() {
		//查询所需字段的值
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "select cust_name,cust_id from Customer";
		Query query = session.createQuery(hql);
		
		List<Object[]> list = query.list();
		System.out.println(list);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}
	

  封装对象

	public void func8() {
		//封装对象
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "select new Customer(cust_name,cust_id) from Customer";
		Query query = session.createQuery(hql);
		
		List<Customer> list = query.list();
		System.out.println(list);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  内链接

@Test
	public void func9() {
		// 内连接
			//隐式连接
			/*
			 *  select * from a,b where b.aid = a.id
			 *  显示内连接
			 * 
			 * 
			 * 左外
			 * select * from A left [outer] join b on b.aid = a.id
			 * select * from A right [outer] join b on b.aid = a.id
			 * */
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		String hql = " from Customer c inner join c.linkMans ";
		
		Query query = session.createQuery(hql);
		
		List<Object[]> list = query.list();
		
		for(Object[] arr : list){
			System.out.println(Arrays.toString(arr));
		}
		//----------------------------------------------------
		tx.commit();
		session.close();
		
		
	}

  迫切内连接 

public void func10() {
		//HQL 迫切内连接 => 帮我们进行封装.返回值就是一个对象
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "from Customer c inner join fetch c.linkMans";
		Query query = session.createQuery(hql);
		
		List<Customer> list = query.list();
		System.out.println(list);
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
		
		
	}

  左外以及右外

@Test
	public void func11() {
		/*
			 * 左外
			 * select * from A left [outer] join b on b.aid = a.id
			 * select * from A right [outer] join b on b.aid = a.id
			 * */
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		String hql = "from Customer c left join c.linkMans";
		String hqlString = "from Customer c right join c.linkMans";
		//查询object子类的对象  所有注册的对象
		Query query = session.createQuery(hqlString);
		//query.setParameter("id","id");
		
		List<Object[]> list = query.list();
		for(Object[] arr : list){
			System.out.println(Arrays.toString(arr));
		}
		
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
		
		
	}

  

Criteria查询     可用于单表条件查询       Hibernate自创的无语句面向对象查询

查列表

@Test
	public void func1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
		List<Customer> list = criteria.list();
		System.out.print(list);
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

条件

	 public void None_Sql() {
		 	Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			
			/*存数据*/
			/*HQL语句中 不可能出现数据库名*/
			Criteria criteria = session2.createCriteria(Customer.class);		
			/*条件查询*/
			// >  gt
			/* >=    ge
			 * <   lt
			 * <=    le
			 * ==    eq
			 * !=    ne
			 * in    in
			 * between and      between
			 * like             like
			 * is not null      isnotnull
			 * is null         isNull
			 * or               or
			 * and              and 
			 * 
			 * 
			 * 
			 * */
			
			//添加条件 使用Restrictions
			criteria.add(Restrictions.eq("cust_id", 1l));
			
			Customer customer =(Customer) criteria.uniqueResult();
			
			/*提交*/
			
			txTransaction.commit();
			session2.close();
			sessionfactory.close();
	 }

  分页

@Test
	public void func3() {
		//分页
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.setFirstResult(0);
		criteria.setMaxResults(10);
		List<Customer> list = criteria.list();
		System.out.print(list);
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  排序

@Test
	public void func4() {
		//排序
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
          //排序条件 criteria.addOrder(Order.asc("cust_id")); List<Customer> list = criteria.list(); System.out.print(list); //!--------------------------------------------------------------------- tx.commit(); session.close(); }

  

设置查询目标
@Test
	public void func5() {
		//设置查询目标
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.setProjection(Projections.rowCount());
		List<Customer> list = criteria.list();
		System.out.print(list);
		//!---------------------------------------------------------------------
		tx.commit();
		session.close();
	}

  离线criteria

@Test
	public void func6() {
		//离线criteria
		DetachedCriteria dCriteria = DetachedCriteria.forClass(Customer.class);
		dCriteria.add(Restrictions.idEq(6l));

		//------------------------------------------------------------------------
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//!---------------------------------------------------------------------
          //为离线传入session Criteria criteria = dCriteria.getExecutableCriteria(session); List<Customer> list = criteria.list(); System.out.print(list); //!--------------------------------------------------------------------- tx.commit(); session.close(); }

  原生sql

public void origin_sql() {
		 	Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
			
			
			SessionFactory sessionfactory = configuration.buildSessionFactory();
			
			Session session2 = sessionfactory.openSession();
			
			Transaction txTransaction = session2.beginTransaction();
			

			String sql = "select * from cst_customer";
			SQLQuery query  = session2.createSQLQuery(sql);
			//制定结果集
			query.addEntity(Customer.class);
			//多个
			List<Customer> list = query.list();
			//一个
			query.uniqueResult();
			
			
			//条件
			
			String sql2 = "select * from cst_customer where cust_id = ?";
			SQLQuery query2  = session2.createSQLQuery(sql);
			//制定结果集
			query2.setParameter(0, 1);
			//多个
			//一个
			Customer  customer = (Customer) query.uniqueResult();
			
			//分页
			String sql3 = "select * from cst_customer limit ?,?";
			SQLQuery query3  = session2.createSQLQuery(sql);
			//制定结果集
			query3.setParameter(0, 0);
			query3.setParameter(1, 10);
			//多个
			List<Customer> list2 = query.list();
			//一个
			query.uniqueResult();
			
			/*提交*/
			
			txTransaction.commit();
			session2.close();
			sessionfactory.close();
	 }

  

  

猜你喜欢

转载自www.cnblogs.com/hywhyme/p/11629082.html