HIbernate 学习 笔记

3月9日
1 # mkdir java && cd java
2 # vi HelloWorld.java
3 # javac HelloWorld.java
4 # java HelloWorld
------------------------------------------------
5 # vi manifase.txt 写入Main-Class: HelloWorld
6 # jar cvfm HelloWorld.jar manifase.txt HelloWorld.class
7 # java -jar HelloWorld.jar
需要工具对Java项目进行方便的打包,管理
1 ant
2 maven2
使用ant对于一个项目进行编译,打包,运行
1 ant软件支持--ant-1.7.0
默认在eclipse中有集成,所以有用额外安装
2 查看ant在eclipse中的存放地点:
# cd /opt/eclipse
# find . -name ant
# cd ./plugins/org.apache.ant_1.7.0.v200706080842/bin
# ls
# sh ant
ant是通过 build.xml对java项目进行管理的,所以使用ant必须自己编写项目的build.xml
特点:第一次较为费时,以后使用非常方便
实例:
使用ant对HelloWorld进行项目管理:
1 # vi build.xml
2 # vi ~/.bashrc
alias ant="sh /opt/eclipse/pxxx/bin/ant"
3 # source ~/.bashrc
4 # cd java
5 # ant compile //创建目录
# ant jar //打jar包
# ant clean //清除创建的目录
继续编写build.xml 完成自动打包功能
实现项目运行
实例:
eclipse + ant
1 新建java项目---> AntFirst
2 新建class--->HelloWorld
3 将build.xml copy到AntFirst下面
在项目右击落选最后一个,复制路径,到终端 # cp build.xml 路径
ant结束
程序的测试:
黑盒测试: 单纯的对程序的功能进行测试,通过编写好的UI进行大量重复的测试
白盒测试: 对于程序的源代码进行测试,一般通过工具完成
Java: JUnit--(Java单元测试):
3.0
4.0 //基于注释开发
实例:
一个类中有一个简单的方法,在写一个测试类对这个方法进行测试
1 新建java项目: FirstJUnit
2 新建包: com.myapp.dao/MyApp.java
public class MyApp {
public boolean login(String name, String passwd) {
boolean result = false;
if ("angel".equals(name) && "123".equals(passwd))
result = true;
return result;
}
}
新建测试包: com.test--->MyAppTest.java(JUnit Test Case)
3 月10日
JUnit Suite(套件):
可以方便的将N单元测试,放入一个类中,这样运行一个类,那么所有的测试都 可以运行
JUnit 3在进行单元测试类的编写时,必须继承junit.framework.TestCase;
JUnit 4在进行单元测试类的编写时,只需要使用注释(Annotation)就可以
注:使用Annotation可以减少和程序员的代码编写量(jdk1.5新特性)
搭建maven2的开发环境:
# vi ~/.bashrc
export M2_HOME="/opt/apache-maven-2.0.10"
PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
source ~/.bashrc
测试:
# mvn //看到帮助信息搭建成功
# tar jxvf maven2_dependencies_appfuse.bz2
# mv repository ~/.m2
# cd ~/.m2
# ls
# cd repository
# ls
appfuse:
是快速JavaEE Web应用程序的开发框架,在早期是: SSH的参考实现,随后加入了其他很多框架的支持
它提供了,Web应用程序最基本功能,用户的CRUD,登录验证...
它通过: maven2进行项目管理,发布,使用
ant----build.xml
maven2----pom.xml
学习目的: SSH项目的参考实现,命名,分层
设置本地 jar包库
# vi $M2_HOME/conf/settings.xml
在53行加入 <localRepository>/root/.m2/repository</localRepository>
# mkdir appfuse
# cd appfuse
mvn archetype:create
-DarchetypeGroupId=org.appfuse.archetypes
-DarchetypeArtifactId=appfuse-basic-struts
-DremoteRepositories=http://static.appfuse.org/releases
-DarchetypeVersion=2.0.2
-DgroupId=com.mycompany.app
-DartifactId=myproject
# sh appfuse.sh
# ls
# cd MyFirstAppfuse
# ls
# vi pom.xml
# pwd
# mvn //编译项目----连接上网
# mvn jetty:run-war
# firefox localhost:8080 &
项目创建成功后,代码结构为:
src/com.xxx.app
dao //DAO设计模式
.hiberntate/
xxxDAOHIbernate.java
model //POJO--getXXX--setXXX
service //DAO与WEB分离层
util //过滤器......
webapp //struts等等
网页结构:
WebContent/
index.jsp
admin/index.jsp
ORM框架--Hibernate
1 回顾DAO:
目标:将数据层和表面层分离----触耦合
ORM(Object/Relational Mapper)
ORM---对象--关系型数据映射组件.对于O/R,即Object(对象)和Relational(关系...)
持久层工具:
SQL/JDBC + DAO模式:成熟,可代码复杂
Hibernate:成熟,强大,便于移植,业界,透明度低
IBATIS:可操作更多的数据细节(SQL),持久层封装不够彻底
Entity Bean:CMP(container-Managed Persistence),EJB容器来管理实体EJB的持久化,移植性较差
Apache OJB
www.hibernate.org
hibernate-distribution //Hibernate支持包
HibernateTools //eclipse插件
slf4j //Hibernate支持包所信赖包
# firefox hibernate-distribution-3.3.1.GA //打开手册
读手册了解到:
Hibernate 功能实现:
通过两个类型的配置文件完成:
1 Hibernate配置文件:数据库的用户,密码,数据库方言(dialect),驱动程序
hibernate.cfg.xml //通过官方提供的: HibernateUtil 初始化Hibernate
2 对象到表的映射文件(N个): 哪个对象映射到哪个表中,属性有哪些
3月11日
1 copy所需要的jar包
# cp hibernate3.jar /opt/apache-tomcat-xxx/lib
# cd lib/required cp *.jar /opt/apache-tomcat-xxx/lib
# tar zxvf slf4j-1.5.6.jar /opt/apache-tomxxx/lib
# cp slf4j-simple-1.5.6.jar /opt/apache-tomxxx/lib
2 创建数据库
# mysql -uroot
# create database dbh;
3 在eclipse中新建一个动态的Web项目:
3.1 MyFirstHibernate
3.2 src/
3.2.1 在手册中cp hibernate.cfg.xml到eclipse中
操作步骤:
在src文件夹上击落鼠标右键,新建xml:hibermate.cfg.xml
以上操作,Hibernate配置完毕
目标:使用Hibernate实现对Student的GRUD
1 src/
edu.zlvc.app.model/Student.java
edu.zlvc.app.dao/StudentDao.java(interface)
2 编写Hibernate持久对象的映射文件,一般与model存放在一起
新建xml: Student.hbm.xml
3 实现DAO
src/
edu.zlvc.app.dao.hibernate/StudentDaoHibernate.java
注: 使用官方提供的HibernateUtil.java初始化Hibernate
src/
edu.zlvc.app.util/HibernateUtil.java
4 测试:
src/
edu.zlvc.app.test/StudentMainTest.java
注: 使用工厂模式:
src/
edu.zlvc.app.dao/DAOFactory.java
MySQL乱码:
# cp my.cnf /etc/
# service mysqld restart
# mysql -uroot
# drop database hdb;
# create database hdb;
使用Junit测试:
src/
edu.zlvc.app.test/StudentTest.java
使用ant + JUnit 进行项目管理,并生成测试报表:
build.xml
细节: ant中要配置JUnit:
Window--->Preferences---> ant--->Runtime--->选Global Entries--->(Add External JARs..)选择--->eclipse/plugins/org.junit.4.xxx/junit.jar
问题解决:
1 ant中要配置JUnit
2 build.xml中的mylib的目录中没有hibernate3.jar
练习:
使用Hibernate实现一个用户登录模块(M):
项目: MyHibernateUserManger
功能:
CRUD
public boolean login(User user);
要求: 使用JUnit测试 + ant 编译管理,测试报表
dao
hibernate
util
model
test
实现步骤:
1 hibernate.cfg.xml
2 model/User.java
3 model/User.hbm.xml
4 dao/UserDao.java, DaoFactory.java
5 dao/hibernate/UserDaoHibernate.java
6 test/UserDaoTest.java
7 build.xml
作业:
将项目与Struts配合使用:
dao
model
util
test
webapp/struts/action/from
WebContent/index.jsp
3月13日
Hibernate核心 API
Configuration对象负责管理数据库的配置信息
Configuration对象通过加载配置文件
(hibernate.cfg.xml)获取并管理这些信息
Configuration config = new Configuration();
config.configure();
File file = new File("C:\\myhibernate.xml");
Configuration config = new Configuration().configure(file);
SessinFactory
负责创建Session对象
SessionFactory对象中保存当前的数据库配置信息和所有映射关系以及预定义的SQL语句
SessionFactory负责维护Hibernate的二级缓存
SessionFactory对象采取了线程安全的设计方式
Transaction
Hibernate本身没有事务管理功能,需要依赖JDBC或JTA的事务管理功能
使用Hibernate进行操作时(增,删,改)必须显式的调用Transaction(默认:autoCommit=false)
Transaction tx = session.beginTransaction();
1 Hibernate核心API
2 对象的生命周期 //Hibernate面试常见问题
持久化对象的状态(重点)
Transient Objects:
使用new操作符初始脂的对象的状态是瞬时的,如果没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,它们的状态将会被丢失,并由垃圾回收机制回收
Persistent Objects:
如果内在中的对象和数据库的记录有对应关系,即和session对象相关,则此对象处于Persistent状态,在当事务提交时它们的状态和数据库进行同步
Detached Objects:
Session关闭这后,持久化对象就变为detached对象.表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理
Transient状态与Persistent状态的区别:
默认情况下:
Transient状态的对象是没有ID号
Persistent通过Session赋予了ID号
Hibernate特性:
倾向于细颗粒度的设计,面向对象,将大表拆分为多个关联关系的小表,消除冗余column
Hibernate通过二级缓存提升性能
3 特点
4 Hibernate主键生成方式:
increment由Hibernate自己进行自增
assigned,自定义Id,主键的产生无须Hibernate的干预
identity方式表示数据库的主键生成方式为采用数据的主键 生成机制,例如:SQL Server或MySQL的自动主键生成机制
sequence: 这种方式铿由序列方式产生主键 的数据库,例如:Oracle, 在<generator>的子元素<param name="sequence">指定用作产生主键的序列名称
native方式: 意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用有同的数据库特定的主键生成方式
5 数据库方言: 3.4.1
选择需要的数据库方言复制到: hibernate.cfg.xml的<property name="dialect"></property>
Hibernate基础部分,结束
基础部分必须掌握:
1 对象的生命周期
2 什么是ORM?
3 Hibernate核心API
4 Hibernate实现步骤
4.1 hibernate.cfg.xml
4.2 model,对应model的映射文件xxx.hbm.xml
4.3 dao与xxxDaoHibernate
4.4 test //可选
4.5 util
5 Hibernate GRUD,重点自学(HQL)
6 主键生成方式: 6种,数据库方言的使用
作业:
将之前的网站发布系统使用struts+hibernate重写
Hibernate高级部分:
1 联合主键处理问题:
准备工作:
1 hibernate.cfg.xml
2 com.student.app.model/StudentID.java
Student.java
Student.hbm.xml
分析数据:描述一个学生所学的专业:
学生的基本数据:
firstname
lastname //这两个构成一个联合主键
major
新建项目: Student_Uinkye
3月16日
1 组合关系映射
在POJO类的分析中,如果有同类型的属性,那么我们可以将同类型的属性独立出来,这样便于管理,然后再将独立的属性与POJO组合,这样就构成了Hibernate中的---组合关系映射
新建项目: Hibernate_Component
1 hibernate基于配置
src/ hibernate.cfg.xml
com.zlvc.app.model/Address.java
zipcode,city
Person.java
id,name,Address
书:<<hibernate高级编程>>
类型1: java
类型2:ORM
类型3:Java与database
class Book
{
private String bookName;
private String type1;
private String type2;
private String type3;
}
回顾高级数据结构:
1 List //充许数据重复
2 Set //不允许数据重复
3 Map //可以存键,值
Hibernate集合类映射:
新建项目: Hibernate_SetTest
1 hibernate基于配置
2 com.set.app.model/Books.java
String bookName
Set<String> topics = null;
作业:
1 再做一个组合关系映射示例:
示例:水果
Hibernate_fruit
2 再做一个集合类关系映射示例:
示例:一个部门:N个员工
Hibernate_Employee
3月17日
1 昨天在集合类映射中,使用Set优势,可以自动过滤重复数据,那么当在实际开发中,需要保留重复数据,如何解决?
List集合映射:
新建项目: Hibernate_List
1 将昨天 的Hibernate_SetTest拷贝过来
2 在Set标签中的lazy属性:
它被称为延迟加载:
当lazy="false": Hibernate会主动将所有相关数据从数据库中全部查询出来
当lazy="true": 开启延迟加载功能,Hibernate会按照用户需求,来进行数据的查询
Map集合类映射:
特点:<key><value>的方式进行存储,如果自定义的数据类型要作为key出现,那么,需要覆盖hashCode() equals()方法
示例:
一个人有一个电话本,电话号码本中有很多电话记录,记录包括了:姓名,电话,那么姓名可以作为:Key, 电话可以作为: value
新建项目: Hibernate_Map
1 基本配置
2 src/com.map.app.model/User.java
long id
String name
Map<String,String> phone
3 级联问题:
3.1 session.delete(Object obj)
它首先到数据库中查询,然后再删除,同时可以根据XXX.hbm.xml实现级联删除
3.2 String hql = "delete From User where id=?";
Query query = session.createQuery(hql)'
query.excteUpdate();
它只到数据库执行sql语句,但是无法实现级联删除
问题:如何实现即可以执行一次SQL语句 ,并且可以实现级联删除?
解决方法:手工建表,然后在建表的同时为数据库设置外键与级联删除选项
1 首先开启hibernamte的自动建表功能
2 运行 test
3 将建好的库使用mysqldump导出
4 编辑导出的sql语句,为需要级联删除的表增加外键和级联删除功能:
foreign key(id) references map_user(id) on delete cascade
5 关闭 hibernate建表功能
注意细节:表类型为innodb
MyISaM不支持级联删除
结束了Hibernate集合类映射:
1 Set //不允许重复
2 List //允许重复,但是在list元素中加入了index属性
3 Map //可以通过key,value的方式进行映射
4 映射标签中: lazy属性的理解,重点,Hibernate重要特性
5 解决ID进行级联删除问题
作业:
自己举例实现:List,Map,级联删除
在Hibernatek主要是编写:
1 POJO
2 xxx.hbm.xml
Hibernate_House
Map_Computer
3月18日
1 关联关系映射:
根据数据库中表与表的关系产生的在Hibernate中的实现技术:
1 1:N || N:1
新建项目: Hibernate_one_to_many
1 配置基本环境
2 1:1
新建项目: Hibernate_one_to_one
1 配置基本环境
Person----> IDCard
3 N:M
新建项目: Hibernate_Many_to_Many
scp -r student@192.168.0.254:/home/student/man* .
学生对课程的示例代码
继承关系映射:
周五结束Hibernate
----------------------------------------------------
周六:
1 设计模式
2 Spring
2 SSH
4 项目(EJB3.0),考试
3月20日
新建项目: Hibernate_Employees
关联映射(6)继承关系映射
在业务逻辑设计中,继承关系是非常常见的,对于继承关系在数据库中数据表上的映射方式:
Hibernate支持三种不同基本不同的基本映射策略,以第一种为例:类继承关系树中的的每个类共用一个表(table pet class hierarcy)
新建项目: Hibernate_inherit
关联映射总结:
1 <one-to-many> || <many-to-one>
2 <one-to-one>
3 <many-to-many>
4 继承映射
<bag>标签:
回顾集合类映射:
<set> ----- java.util.Set ----> HashSet
<list> ---- java.util.List ----> ArrayList
<map> -----java.util.map ----> HashMap
<bag> ---- java.util.Collection ----> ArrayList //允许重复的
官方描述:
在Hibernate中建议一对多集合使用Bag标签
<idbag>
新建项目: Hibernate_Bag(把List代码Copy过来,进行修改)
配置Hibernate使用JNDI数据源(连接池):
1 tomcat conf/server.xml
<Resource>
2 hibernate.cfg.xml
<property name="hebernate.connection.datasource java:/comp/env/jdbc/hdb>
</property>
注:在Hibernate发布包中,还提供了其他两个连接池工具:
c3p0, proxoo1 --------- DBCP
总结Hibernate工作流程:
1 读取并解析配置文件
2 读取并解析映射信息,创建SesssinFactory
3 打开Session
4 创建事务Transation
5 持久化操作
6 提交事务
7 关闭Session
8 关闭SessionFactory
本周Hibernate部分回顾:
1 集合类映射
<set><list><map><bag>
lazy //延迟加载
cascade //级联操作
inverse //true,false
示例:
User: User.hbm.xml----inverse---true
IDCard
outer-join //是否采用表链接查询, 默认为auto
2 联合主键,组合映射:
2.1 <comosite-id>----联合主键
2.2 <component>-----组合映射
3 关联映射
明天:
了解设计模式, Spring
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值