Hibernate学习.docx
《Hibernate学习.docx》由会员分享,可在线阅读,更多相关《Hibernate学习.docx(88页珍藏版)》请在冰豆网上搜索。
Hibernate学习
**************第一章************
Hibernate是一个优秀的持久化框架
什么是持久化?
只有数据保存到数据库中这个对象才称为持久化对象
瞬时状态:
保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态
持久化:
将程序数据在瞬时状态和持久状态之间转换的机制
持久状态:
保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态
什么是ORM?
ORM(对象-关系映射):
完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。
是一个主流的持久化框架
在JDBC基础上进行分装
只需要少量代码就可以完成持久化工作
是一个优秀的ORM(对象-关系映射)机制
通过映射文件保存映射信息
在业务层以面向对象的方式编程,不用考虑数据保存形式
手工搭建Hibernate框架:
1.导包:
(最少依赖的jar包)
●下载地址http:
//www.hibernate.org,本教程使用3.2.5。
●将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar
2.添加Hibernate配置文件hibernate.cfg.xml(模板源代码/etc下)
打开源代码下etc/hibernate.cfg.xml复制到src路劲下
(注意:
默认hibernate会在src下读取名称为hibernate.cfg.xml文件,这与Ibatis中SqlMapConfig.xml文件一样,主要配置数据库连接方式,打开数据库连接)
//表示数据库方言不同数据库方言不同
org.hibernate.dialect.MySQL5Dialect
//表示是否显示sql语句
true
//表示通过实体类映射创建数据库表update/create
update
3.添加实体类(例如:
User类)
com.hibernate.user.bean.User:
publicclassUser{
privateintuid;
privateStringuserName;
privateStringpassword;
publicintgetUid(){
returnuid;
}
publicvoidsetUid(intuid){
this.uid=uid;
}
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
4.实体类目录中添加User.hbm.xml(模板在源代码eg\org\hibernate\auction)
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--generator主键生成器
Increment表示mysql主键并增长
Identity表示sqlserver主键并增长
Sequence表示oracle主键并增长
Native表示兼容所有数据库由hibernate判断
-->
5.hibernate.cfg.xml文件中添加User..hbm.xml
6.创建UserDao类
publicclassUserDaoimplementsIUserDao{
privatestaticSessionsession;
static
{
//1.读取hibernate.cfg.xml文件
Configurationcfg=newConfiguration().configure();
//2.创建sessionFactory
SessionFactorysessionFactory=cfg.buildSessionFactory();
//3.打开session
session=sessionFactory.openSession();
}
}
1.添加(查看主键值是否返回)(User类)
true
Hibernate开启自动提交功能
publicvoidaddUser(Useruser){//此时为瞬时状态
//4.开启事物
Transactiontx=session.beginTransaction();
try{
//5.持久化到数据库
//session.save(user);
session.persist(user);//持久化状态
//6.提交事物
mit();
}catch(HibernateExceptione){
e.printStackTrace();
tx.rollback();
}finally
{
//7.关闭session
session.close();
//脱管状态
}
}
测试:
UserDaouserDao=newUserDao();
Useruser=newUser();
user.setPassword("zhangsan");
user.setUserName("张三");
userDao.addUser(user);
2.删除
publicvoiddeleteUser(intuid){
Transactiontr=session.beginTransaction();
try{
Useruser=newUser();
user.setUid(uid);
session.delete(user);
mit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
tr.rollback();
}finally
{
session.close();
}
}
测试:
userDao.deleteUser
(1);
3.修改
publicvoidupdateUser(Useruser){
Transactiontr=session.beginTransaction();
try{
session.update(user);
//或者
//session.merge(user);
mit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
tr.rollback();
}finally
{
session.close();
}
}
测试:
Useruser=newUser();
user.setUid
(2);
user.setPassword("lisi");
user.setUserName("李四");
userDao.updateUser(user);
4.查询(查询单个对象)
publicUserfindUserByUid(intuid){
Useruser=(User)session.get(User.class,uid);
session.close();
returnuser;
}
测试:
Useruser=userDao.findUserByUid
(2);
System.out.println(user.getUserName()+","+user.getPassword());
5.load方法(懒加载)
publicUserfindUserByUid1(intuid)
{
//注意:
我们的实体类不能加上final关键字是因为懒加载会通过通过这个实体类派生一个子类出来实现懒加载(提供一个无参构造函数)
//所以上面的user这个对象永远不可能为null如果没有查到懒加载也会生成一个子类对象
Useruser=(User)session.load(User.class,uid);
System.out.println(user.getClass().getName());
//System.out.println(user.getPassword());
//Hibernate.initialize(user);
session.close();
returnuser;
}
测试:
Useruser=userDao.findUserByUid1
(2);
System.out.println(user.getUserName()+","+user.getPassword());
6.更新或者保存
publicvoidsaveOrUpdateUser(Useruser)
{
Transactiontr=session.beginTransaction();
try{
session.saveOrUpdate(user);
mit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
tr.rollback();
}finally
{
session.close();
}
}
测试:
Useruser=newUser();
user.setPassword("王五");
user.setUserName("wangwu1");
user.setUid(6);
userDao.saveOrUpdateUser(user);
7.对象的状态(三个状态:
瞬时状态,持久化状态,脱管状态)
8.如何动态生成表领域模型(oop思想--->创建数据库表)(Teacher类)
Teacher类:
1.创建实体类2.创建teacher.hbm.xml3.hibernate.cfg.xml配置
在hibernate.cfg.xml文件中添加如下内容:
update
如何用Xdoclet+ant生成映射文件:
如何开始使用Xdoclet?
Xdoclet不是单独可以运行的工具(不像Ant工具),它可以与其它工具一起配合运行,如Ant。
我们下面的例子就是基于Ant和xdoclet的。
1、首先需要保证ant是可用的
2、下载并解压xdoclet的包(我们现在使用的是xdoclet2,具体版本是xdoclet-plugins-1.0.3)。
3、在ant构建工具中定义xdoclet任务,并使用:
如何开始使用Ant?
1、确保你的机器已经安装了JDK,确保你的path环境变量中包含有java虚拟机的运行程序,确保你的环境变量中有JAVA_HOME变量
2、下载ant并解压
3、设置ANT_HOME环境变量,指向ant解压根目录
4、在path环境变量中,添加ANT_HOME\bin目录
5、打开控制台,运行:
ant
6、如果能够运行ant(忽略这些异常:
Buildfile:
build.xmldoesnotexist!
),而不是出现诸如命令无法解释的错误,那么你的ant就安装成功了
1.创建com.hibernate.ant.bean包:
Test类:
/**
*@hibernate.class
*table="t_test"
*@authorAdministrator
*
*/
publicclassTest{
/**
*@hibernate.id
*generator-class="native"
*/
privateintid;
/**
*@hibernate.property
*/
privateStringname;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
2.Src下放入build.xml文件:
xmlversion="1.0"encoding="GBK"?
>
\xdoclet-plugins-1.0.3\xdoclet-plugins-1.0.3"/>
--Buildclasspath-->
name="xdoclet"
classname="org.xdoclet.ant.XDocletTask"
classpathref="xdoclet.task.classpath"
/>
classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
version="3.0"
destdir="${src.dir}"
/>
3.MyEclipse-Window-showView–other–Ant-AddBuildfiles–runas–Antbuild
9.传统模型(表生成实体类)(Student类)
用MyEclipse向导(MyEclipseDBBrower)
*************第二章***************
1.一对多,多对一(Emp表,Dept表)
Dept实体类:
/**
*一对多
*@authorAdministrator
*
*/
publicclassDept{
privateintdeptId;
privateStringdeptName;//部门名称
privateSetemps;
publicDept(intdeptId,StringdeptName,Setemps){
this.deptId=deptId;
this.deptName=deptName;
this.emps=emps;
}
publicDept(){
}
publicintgetDeptId(){
returndeptId;
}
publicvoidsetDeptId(intdeptId){
this.deptId=deptId;
}
publicStringgetDeptName(){
returndeptName;
}
publicvoidsetDeptName(StringdeptName){
this.deptName=deptName;
}
publicSetgetEmps(){
returnemps;
}
publicvoidsetEmps(Setemps){
this.emps=emps;
}
}
Dept.hbm.xml文件:
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
Emp实体类:
/**
*多对一
*@authorAdministrator
*
*/
publicclassEmp{
privateintempId;
privateStringempName;
privateDeptdept;
publicEmp(intempId,StringempName,Deptdept){
this.empId=empId;
this.empName=empName;
this.dept=dept;
}
publicEmp(){
}
publicStringgetEmpName(){
returnempName;
}
publicvoidsetEmpName(StringempName){
this.empName=empName;
}
publicintgetEmpId(){
returnempId;
}
publicvoidsetEmpId(intempId){
this.empId=empId;
}
publicDeptgetDept(){
returndept;
}
publicvoidsetDept(Deptdept){
this.dept=dept;
}
}
Emp.hbm.xml文件:
xmlversion="