栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Hibernate

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate

目录

一、概念

二、HQL和SQL的区别

三、使用

1、根据返回值类型分类

①String/long

②Object[ ]

③对象/集合

④Map集合

2、设置站位符

四、封装基于Hibernate框架的通用查询

五、疑问


一、概念

HQL(Hibernate Query Language)是支持面对对象的一种查询语句,和SQL非常相似。

二、HQL和SQL的区别

①SQL查询表和表中的列,HQL查询对象和对象属性

②HQL的关键字不区分大小写,类名和属性区分大小写

③HQL可以省略SELECt

三、使用

1、根据返回值类型分类

①String/long
    
	public void testList1() {
		Query query = session.createQuery("select b.bookName as bname from Book b");
		List list = query.list();
		for (String bname : list) {
			System.out.println(bname);
		}
	}

②Object[ ]
    
	public void testList2() {
		Query query = session.createQuery("select b.bookId,b.bookName from Book b");
		List list = query.list();
		for (Object[] o : list) {
			System.out.println(Arrays.toString(o));
		}
	}

③对象/集合
    
	public void testList3() {
		Query query = session.createQuery("select new Book(b.bookId,b.bookName) from Book b");
		List list = query.list();
		for (Book b : list) {
			System.out.println(b);
		}
	}

注意:book必须要有相对应的构造函数!!!

④Map集合
    
	public void testList4() {
		Query query = session.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
		List list = query.list();
		for (Map b : list) {
			System.out.println(b);
		}
	}

这里可以直接获得Map集合,有时候在JS中也需要到Map集合格式的数据,这里也是一种方便了!

2、设置站位符

①SQL:select * from table where id =?    select * from table where id in(?,?,?...)

②HQL:from User u where u.id = :id          from User u where u.id in (:ids)

User:对象,id:属性,u:别名

如何设置站位符:

①SQL通过预编译对象进行设置

②HQL通过query进行设置

案例:

//单个设置
Query query = session.createQuery("from Book where bookId = :bookId");
query.setParameter("bookId", 1);
Book b = (Book) query.getSingleResult();
System.out.println(b);


//多个
Query query = session.createQuery("from Book where bookId in (:bookIds)");
query.setParameterList("bookIds", new Integer[] {1,2,4});

思考:通过这个设置占位符的方式可以观察出,可以通过对象的属性名称和对应的值来完成一个对

象(参数)的赋值!!!这个与通过前端请求获得的参数map集合相似!自定义mvc通用查询对占

位符进行赋值利用了反射,这里该怎么写呢?往后看

四、封装基于Hibernate框架的通用查询
package com.zwf.dao;
 
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import org.hibernate.Session;
import org.hibernate.query.Query;
 
import com.zwf.hql.PageBean;
 

public class baseDao {
 
	
	public void setParam(Map map, Query query) {
		if (map != null && map.size() > 0) {
			Object value = null;
			Set> entrySet = map.entrySet();
			for (Entry entry : entrySet) {
				value = entry.getValue();
                //占位符的值有三种类型
				if (value instanceof Object[]) {
					query.setParameterList(entry.getKey(), (Object[]) value);
				} else if (value instanceof Collection) {
					query.setParameterList(entry.getKey(), (Collection) value);
				} else {
					query.setParameter(entry.getKey(), value);
				}
			}
		}
	}
 
    
	public String getCountHql(String hql) {
		// hql = "from Book where bookName like :bookName"
		// * hql = "select * from new Book(bid,bookName) where bookName like :bookName"
		int index = hql.toUpperCase().indexOf("FROM");
		return "select count(*) " + hql.substring(index);
	}
	
	
	public List executeQuery(Session session,Map map,String hql,PageBean pageBean) {
		List list = null;
		if(pageBean != null && pageBean.isPagination()) {//分页
			String countHql = getCountHql(hql);
			Query countQuery = session.createQuery(countHql);
			this.setParam(map, countQuery);
			pageBean.setTotal(countQuery.getSingleResult().toString());
			
			Query query = session.createQuery(hql);
//			给预定义hql语句执行对象中的参数赋值,有多少赋值多少
			this.setParam(map, query);
			query.setFirstResult(pageBean.getStartIndex());
			query.setMaxResults(pageBean.getRows());
			list = query.list();
		}else {
			Query query = session.createQuery(hql);
//			给预定义hql语句执行对象中的参数赋值,有多少赋值多少
			this.setParam(map, query);
			list = query.list();
		}
		return list;
	}
 
}

五、疑问

HIbernate框架中的session具体起什么作业,工作流程是怎样的呢?

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338190.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号