Java Web编程的主要组件技术——Hibernate核心组件
参考书籍:《J2EE开源编程精要15讲》
Hibernate配置文件
1) hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">cq</property>
<mapping resource="hibernateTest/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
hibernate.cfg.xml文件包括一个根元素<hibernate-configuration>,该元素有一个子元素<session-factory>,<session-factory>元素有两个子元素:<property>和<mapping>。
- <property>元素用来指定数据库链接参数。有一个name属性,用来指定数据库连接参数的名字
- <mapping>元素用来指定所要用到的映射文件。有一个resource属性,用来指定所要用到的映射文件的名字及路径
2) hibernate.properties
详见:http://blog.csdn.net/dingherry/article/details/6798886
持久化对象(Persistent Object)
在Hibernate应用中,一个数据表对应一个持久化对象(PO)。PO实际上就是一个遵循一定规则的普通的JavaBean
package hibernateTest; /**
* Person entity. @author MyEclipse Persistence Tools
*/ public class Person implements java.io.Serializable { // Fields private Integer id;
private String name;
private String sex;
private String address; // Constructors /** default constructor */
public Person() {
} /** full constructor */
public Person(String name, String sex, String address) {
this.name = name;
this.sex = sex;
this.address = address;
} // Property accessors public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return this.sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getAddress() {
return this.address;
} public void setAddress(String address) {
this.address = address;
} }
该PO对应数据表person。四个字段:ID( int类型 )、Name( varchar类型 )、Sex( char类型 )、Address ( varchar类型 )。每个字段对应一对getter和setter方法
映射文件 xxx.hbm.xml
Hibernate映射文件把一个PO与一个数据表映射起来,每个表对应一个映射文件。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Person" table="person" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="Name" length="20" not-null="true" />
</property>
<property name="sex" type="java.lang.String">
<column name="Sex" length="1" not-null="true" />
</property>
<property name="address" type="java.lang.String">
<column name="Address" length="200" not-null="true" />
</property>
</class>
</hibernate-mapping>
该文件将类Person和表person映射起来
- <class>元素:定义一个持久化类,属性name表示指定持久化类的Java全限定名,table属性表示指定对应的数据表名,catalog属性表示数据库名
- <id>元素:是<class>的一个子元素。定义了该属性到数据表主键字段的映射,name属性指定PO的标识属性的名字,type属性表示标识类型,column属性指定数据表的主键字段名字
- <generator>元素:<id>的一个子元素。指定id标识的生成类的名字,class属性指定一个Java类的名字,为该持久化类的实例生成唯一的标识。(详见:http://blog.csdn.net/ye1992/article/details/19632001)
- property元素:是<class>元素的一个子元素,为类声名一个持久化的属性。name属性指定属性的名字,小写开头;column属性指定对应数据表字段名;length属性指定属性的长度;type属性指定属性的Hibernate类型的名字( Hibernate基础属性 或 Java类 )
Configuration类
负责管理Hibernate配置信息。执行Configuration conf=new Configuration().configure()语句时,Hibernate自动在CLASSPATH中搜寻Hibernate配置文件;在Java Web应用中,则在WEB-INF/classes目录下搜寻配置文件。还可以指定配置文件的位置,如:
File file=new File("C:\\Users\\Administrator\\Desktop\\dfd\\Hibernate_Proj\\src\\hibernate.cfg.xml");
Configuration cfg=new Configuration().configure(file);
SessionFactory接口
负责Session实例的创建,可通过Configuration创建SessionFactory
Configuration cfg=new Configuration().configure();
SessionFactory sf=cfg.buildSessionFactory();
SessionFactory线程安全,可以被多线程调用以取得Session
Session接口
是应用程序与数据库之间的一个会话,是Hibernate运作中心,相当于JDBC中的Connection。通过SessionFactory创建
Session session=SessionFactory.openSession();
通过Session对象装载、保存、创建或查询持久化对象。
1) 取得持久化对象
get()方法:
public Object get(Class entityClass,Serializable id)
entityClass表明类的类型,id是对象的主键值,如果id是int类型,应通过new Integer(id)方法变成Integer对象。如:取得主键id为"1111"的user对象
user=(User)session.get(User.class,new Integer(1111));
get方法首先通过id在Session缓存中查找对象,存在即直接返回;在二级缓存中查找,找到就返回;从数据库中加载
load()方法:
user=(User)session.load(User.class,new Integer(1111));
与get()的区别:立即加载对象且对象存在无区别,不存在get()返回null,load()弹出异常;延迟加载,get()以立即加载方式发送SQL,得到已初始化的对象,load()不发送SQL,返回代理对象,直到该对象被访问才被初始化
2) 持久化对象保存、更新和删除方法
save()方法
将一个PO属性取出放入PreparedStatement语句中,并向数据库中插入记录。调用时,并不立即执行SQL语句,而等到清理完缓存才执行,若在清理缓存前修改了属性,则Hibernate将会发送update语句来持久化操作。调用save()方法将临时对象保存到数据库中,对象的临时状态将变成持久化状态,对象将一直位于Session的缓存中,对它的任何操作在事务提交时都会同步保存到数据库中
update()方法
用来更新脱管对象,并不立即发送SQL语句,对对象的更新操作将积累起来,事务提交发送一条SQL语句完成全部更新操作
saveOrUpdate()方法
不能对脱管对象使用save(),也不能对临时对象使用udpate(),saveOrUpdate()自行判断对象类型并调用相应的方法
delete()方法
删除一个对象(包括持久对象和脱管对象),并不立即发送SQL语句
Query接口
可从Session对象生成,如
Query query=session.createQuery("from User u where u.username like ?")
主要方法:
- setXXX()方法:设置HQL中问号或变量的值。(setBinary、setBoolean、setFloat等等)
- list()方法:返回查询结果,并把结果转变成List对象
- excuteUpdate()方法:执行更新或删除语句
setString(int position,String value):设置HQL中的“?”的值,position代表“?”在HQL中的位置,value设置"?"的值。如:
Query query=session.createQuery("form User u where u.age>? and u.username like ?";
query.setInteger(0,22);
query.setString(1,"%Tom%“);
setString(String paraName,String value):设置HQL中":"后跟变量的值,paraName代表HQL中":"后跟变量,value为该变量的值。如:
Query query=session.createQuery("from User u where u.age>:minAge and u.username like:userName");
query.setInteger("minAge",22);
query.setString("userName","%Tom%");
list()方法使用示例:
Query query=session.createQuery("from User u where u.age>? ");
query.setInteger(0,22);
List list=query.list();
for(int i=0;i<list.size();i++){
user=(User)list.get(i);
System.out.println(user.getUserName());
}
excuteUpdate()方法使用示例:
Query q=session.createQuery("delete from User");
q.executeUpdate();
一条语句就完成了批量删除操作,但删除后的数据还在缓存中
Transaction接口
可调用JTA或JDBC执行事务管理,运行与Session接口相关
Transaction tx=session.beginTransaction();
- commit():提交相关联的Session示例
- rollback():撤销事务操作
- wasCommitted():检察事务是否提交
应用示例 简单增删改:http://pan.baidu.com/s/1sjqL7Bn
Java Web编程的主要组件技术——Hibernate核心组件的更多相关文章
- Java Web编程的主要组件技术——Hibernate入门
参考书籍:<J2EE开源编程精要15讲> Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系 ...
- Java Web编程的主要组件技术——Struts核心组件
参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...
- Java Web编程的主要组件技术——MVC设计模式
参考书籍:<J2EE开源编程精要15讲> MVC(Model View Controller),Model(模型)表示业务逻辑层,View(视图)代表表述层,Controller(控制)表 ...
- Java Web编程的主要组件技术——Struts入门
参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少 ...
- Java Web编程的主要组件技术——JDBC
参考书籍:<J2EE开源编程精要15讲> JDBC(Java DataBase Connectivity)是Java Web应用程序开发的最主要API之一.当向数据库查询数据时,Java应 ...
- Java Web编程的主要组件技术——Servlet
参考书籍:<J2EE开源编程精要15讲> Servlet是可以处理客户端传来的HTTP请求,并返回响应,由服务器端调用执行,有一定编写规范的Java类. 例如: package test; ...
- Java Web编程的主要组件技术——Struts的高级功能
参考书籍:<J2EE开源编程精要15讲> Struts对国际化的支持 "国际化"(I18N)指一个应用程序在运行时能根据客户端请求所来的国家/地区.语言的不同显示不同的 ...
- Java Web编程的主要组件技术——JSP
参考书籍:<J2EE开源编程精要15讲> JSP(Java Server Page)页面由HTML代码和嵌入其中的Java代码组成. 简单的JSP页面如: <html> < ...
- 五分钟学Java:如何才能学好Java Web里这么多的技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...
随机推荐
- vue.js(一)
之前看过一点vue.js但是知识点没做记录,现在也差不多不记得了,今天把以前看过的翻一遍,顺便提炼一下知识点 注意:下面的所有与vue相关的标签.指令都是写在id="app"的di ...
- 锁、volatile、CAS 比较
一.锁的劣势 (1) 在JDK1.5之前都是使用synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守 护变量的锁,都采用独占的方式来访 ...
- 把大象装进冰箱的N种方法
作者:折剑头链接:https://www.zhihu.com/question/49214119/answer/115728034来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Mirror--镜像使用的工作线程数
/*在SQL SERVER 2005 及以后版本中, 使用'MAXworker thread' 来配置可用的线程数,默认设置为0 ,即自动控制线程数 计算最大工作线程数: 对于32 位系统:逻辑CPU ...
- 关于uuid与自增列的选择
关于uuid与自增列的选择 在db交流群里看到有人提问,说他的userName 登录名是唯一的,可以用其做主键嘛,如果用自增列,那又要多一列. 后面又说,如果要用主键ID,用uuid会不会好一些呢?作 ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- 002-原始jpa以及基本加载过程,基本sql使用
一.概述 1.1.创建 public void createMethod() { EntityManagerFactory factory = Persistence.createEntityMana ...
- ubuntu 用法
1:改变某一个目录的拥有者 sudo chown -hR user:user ./目录名 // user:user 用户名:组名 sudo chmod 777 文件 //给文 ...
- marathon-lb-什么是服务发现?(转)
摘要: 将容器应用部署到集群时,其服务地址,即IP和端口, 是由集群系统动态分配的.那么,当我们需要访问这个服务时,如何确定它的地址呢?这时,就需要服务发现(Service Discovery)了.本 ...
- hdu1286(找新朋友)&&POJ2407Relatives(欧拉函数模版题)
http://acm.hdu.edu.cn/showproblem.php?pid=1286 没什么好说的,模板题,主要是弄懂欧拉函数的思想. #include <iostream> #i ...