`
mengqingyu
  • 浏览: 328955 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Hibernate笔记(常用技术)

阅读更多
一.对象关系映射基础
	1.hibernate对象属性映射
	映射文件中,<property>元素的access属性用于指定Hibernate访问持久化类的属性的方式。有以下两种可选值:
	property:这是默认值,表示是通过属性相应的get,set方法来访问属性。
	field:表面是运用Java反射机制直接访问类的属性,此属性可以没有get,set方法。
	例如:<property name="name" access="field"/> 
	这样设置是直接通过属性值取得,可以没有get,set方法。
	反之name则是根据set,get后的Name对应,配置文件的name名可以不跟实体bean里的属性名直接对应。
	我们常用的hql语句例如:List customers = session.find("from Customer as c where c.name = 'Tom'");
	这里的c.name中的name名字是根据配置文件里的name所对应,并不是和实体bean里的属性名对应。

	2.在持久化类的访问方法中加入程序逻辑
	(1)hibernate在执行find方法时候会调用bean中的set方法把查询出的内容放入属性中,提供给我们获取其中的值。
	在执行save,update等方法时候会调用bean中的get方法获得我们提交的数据进行持久化操作。
	所以,可以通过在set,get方法中加入相应我们需要的逻辑,如果不需要让hibernate在执行查询或保存操作时候隐式的调用get,set方法,
	可以在映射文件中设置field参数
	(2)利用<property>元素的formula属性。
	如果数据表里没有totalPrice价格总和字段,而我们需要在获得用户对象的同时,需要知道它对应多个订单的价格总和,
	我们可以在CUSTOMER实体bean里定义totalPrice属性,生成get,set方法,再利用以下代码可以实现
	例如:<property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)"/>
	(3)控制insert和update语句
	例如:<property name="price" update="false" insert="false" column="PRICE"/>
	设置成false代表在保存或修改此类时候,price不被操作。一般多用于多对一关系映射中,避免级联操作。

二.关联映射
	1.主键自动生成映射
	<id name="id" type="java.lang.String" column="ID" length="32">
		<generator class="uuid" />
	</id>
	2.一对一主键关联
	<one-to-one name="order" class="mypack.Order" cascade="all"/>
	constrained属性为true,表明ORDERS表的ID主键同时作为外键参照CUSTOMERS表。
	当前xml文件中,必须为OID使用foreign标识符生成策略:
	<one-to-one name="customer" class="mypack.Customer" constrained="true"/>
	<id name="id" type="java.lang.String" column="ID">
		<generator class="foreign">
			<param name="property">customer</param>
		</generator>
	</id>
	注:当两个关联类之间有两个一对一关联时,可以使用一对一外键关联。
	一对一外键关联与多对一关联的区别仅仅是在many-to-one标签上需要配置属性unique="true"。
	3.多对一关联
	<many-to-one name="customer" class="mypack.Customer" column="CUSTOMER_ID"/>
	4.一对多关联
	<set name="orders" cascade="save-update" inverse="true" lazy="extra">
		<key column="CUSTOMER_ID" />
		<one-to-many class="mypack.Order"/>
	</set>
	<list name="orders" cascade="save-update" lazy="extra" fetch="join">
		<key column="CUSTOMER_ID"></key>
		<list-index column="SHOW_INDEX"></list-index> <!--orders表中索引位置字段SHOW_INDEX-->
		<one-to-many class="mypack.Order" /> 
	</list>
	5.多对多关联
	<set name="orders" table="CUSTOMERS_TO_ORDERS" cascade="save-update" lazy="extra">
		<key column="CUSTOMER_ID"/>	<!--双向多对多关联必须把其中一端的inverse属性设为true-->
		<many-to-many class="mypack.Order" column="ORDER_ID"/>
	</set>
	注:当中间表需要有更多的属性字段时,可把多对多分解成两个一对多关联。
	6.在数据库中对集合排序
	set,map映射支持sort属性(内存排序),order-by属性(数据库排序)。
	例如:
	<set name="orders" cascade="save-update" inverse="true" lazy="extra" order-by="ID asc">
		<key column="CUSTOMER_ID" /> <!--当加载Customer对象的orders集合的时,会进行排序操作-->
		<one-to-many class="mypack.Order"/>
	</set>
	7.附加过滤条件
	<set name="orders" cascade="save-update" inverse="true" lazy="extra" where="STATUS='1'">
		<key column="CUSTOMER_ID" /> <!--当加载Customer对象的orders集合的时,只会查出STATUS为1的order对象-->
		<one-to-many class="mypack.Order"/>
	</set>

三.检索方式
	1.分页查询
	List result = this.getSession().createQuery("from Customer c order by c.name asc")
		.setFirstResult(0).setMaxResults(10).list();
	2.条件查询
	//如果hql语句中含有参数可以使用以下方法提高安全性:
	Object[] args = {name,order};	//传入的查询条件的变量名字
	Type[] types = {Hibernate.STRING,Hibernate.entity(Order.class)};	//变量类型
	//Type[]是hibernate提供的变量类型,order为自定义对象类型。
	//根据参数说在位置的索引值,传入的变量名字,变量类型来进行查询。
	List list = this.query("from Customer c where c.name=? and c.order=?",args,types)
	public List query(String hql, Object[] args, Type[] types){
		Query query = this.getSession().createQuery(hql);
		query.setParameters(args, types);
		return query.list();
	}
	3.批量延迟检索
	映射文件中<set>元素有一个batch-size属性,用于为延迟检索或立即检索策略设定批量检索的数量。
	注:批量检索的属性值范围不宜过大,如果过大就失去了延迟加载的意义,如果太小也会失去批量检索的意义。
    一般设置为:3-10。合理的运用批量检索可以提高检索性能。具体请查阅说明文档。
	4.检索单个对象
	Customer customer = (Customer)this.getSession().createQuery("from Customer c order by c.name asc")
	.setMaxResults(1).uniqueResult();
	5.隐式内连接
	//标准的HQL内连接查询语句:
	"from Customer c inner join c.orders";
	//如果Customer类中没有orders集合属性,可以采用SQL风格的隐式内连接查询语句:
	"from Customer c,Order o where c.in=o.customer_id";
	6.分组查询
	//例如以下查询语句仅统计具有一条以上订单的客户的所有订单的总价:
	"select c.id,c.name,sum(o.price) from Customer c join c.orders o group by c.id having (count(o)>1)";
	7.HQL查询的select子句
	"select new map(c.name as personName) from Customer c" 
	//HQL语句返回的结果是集合,其中集合元素是Map对象,以personName作为Map的key。
	8.SQL查询通过对象属性显示 
	//SimpleJdbcTemplete是spring为hibernate查询提供的工具类 
	SimpleJdbcTemplete simpleJdbcTemplete; 
	List<Map<String,Object>> list = simpleJdbcTemplete.queryForList(sql.toString(), new Object[]{});
分享到:
评论

相关推荐

    J2EE框架_笔记_c

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    J2EE三大框架_笔记_a

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    J2EE框架_笔记_b

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    javaEE框架笔记,识货人下

    54留言管理程序_Struts + Spring + Hibernate笔记.pdf 6-Struts标签-BEAN标签笔记.pdf 7-Struts标签 -LOGIC标签笔记.pdf 8-Struts标签- HTML标签笔记.pdf 9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf

    java常用框架学习笔记

    java 开发,常用框架笔记(hibernate,spring,springmvc等)

    java从零基础到精通 学习笔记 (带批注) 完整版PDF

    Java常年占据热门编程语言排行榜第一,Java工程师综合就业排名第一,完成此路径能够应用SSM常用框架结合面向对象编程思想实现项目开发,完成Linux系统下的项目部署运行。将能胜任月薪8,000RMB--15,000RMB的职位,...

    Java/JavaEE 学习笔记

    Hibernate学习笔记..........180 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射......................185 第四章 操纵持久化对象....................

    J2EE学习笔记(J2ee初学者必备手册)

    Hibernate学习笔记..........180 JavaEE@xuxiang 3 Java/JavaEE学习笔记Jonny xuxiang5612@sina.com 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射....

    java培训上课资料pdf

    JavaSE/JavaEE:熟悉Swing、JDBC编程,了解Socket、多线程以及反射机制,对面向对象编程有较为 深刻的理解,理解常用设计模式和设计原则,能够熟练运用Struts、Spring、Hibernate等开 源框架,了解XML及其解析技术...

    前后端分离博客项目.zip

    然后数据层,我们常用的是Mybatis,易上手,方便维护。但是单表操作比较困难,特别是添加字段或减少字段的时候,比较繁琐,所以这里我推荐使用Mybatis Plus(mp.baomidou.com/),为简化开发而生,只… CRUD 操作,...

    leetcode下载-SSM-Examples:SSM-示例

    常用技术,涉及SSM,一些小的工具 config-helper,配置文件读取工具类,使用注解的方式,类型安全 hibernate—examples,从原生jdbc到hibernate集成 mybatis-examples,从原生jdbc到MyBatis集成 spring-satic-...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 鲁班学院-上课笔记mybaits源码分析9-05.docx │ │ │ └─mybaits源码分析 │ mybaits源码分析.mp4 │ ├─面试必问-springcloud架构微服务项目 │ springcloud架构微服务项目.mp4 │ ├─面试必问-...

    jive.chm

    2 jcs学习笔记 3 关于Hibernate的Cache问题 4 用缓冲技术提高JSP应用的性能和稳定性 5 SwarmCache入门 &lt;br&gt; 源代码研究 1 Jive中的全局配置 2 Jive源代码情景分析-index....

    收集的常见的专业问题解决办法.rar

    2009-02-24 08:42 165165 37065 常见的专业问题解决办法\Java核心技术学习笔记--异常和调试_Believe ┭┮ YourSelf.mht 2009-03-20 16:36 142683 39110 常见的专业问题解决办法\JR - 专题论坛问题 - eclipse??如何...

Global site tag (gtag.js) - Google Analytics