Hibernate.docx
- 文档编号:3938326
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:204
- 大小:89.24KB
Hibernate.docx
《Hibernate.docx》由会员分享,可在线阅读,更多相关《Hibernate.docx(204页珍藏版)》请在冰豆网上搜索。
Hibernate
第一次Hiberate项目(Hiberate_first)
●新建一个java项目
●创建UserLibrary
⏹HIBERNATE_HONE/lib/*.jar
⏹HIBERNATE_HOME/hibernate3.jar
⏹MySqlJDBC驱动
●创建hibernate配置文件hibernate.cfg.xml
●创建实体类,提供User实体类的映射文件User.hbm.xml,将User.hbm.xml文件配置到hibernate.cfg.xml文件中
●创建数据库表,采用hibernate工具类,将实体类生成数据库表
●开发客户端
●为了调试方便将log4j配置文件拷贝到项目中,可以在hibernate.cfg.xml中加入如下配置,来观看hibernatesql的执行:
⏹
hibernate.cfg.xml
mysql:
//127.0.0.1/hibernate//数据库名
User.java
packagecom.axjy.hibernate;
publicclassUser{
privateStringid;
privateStringname;
privateStringpassword;
privateDatecreateTime;
privateDateexpireTime;
publicStringgetId(){returnid;}
publicvoidsetId(Stringid){this.id=id;}
publicStringgetName(){returnname;}
publicvoidsetName(Stringname){this.name=name;}
publicStringgetPassword(){returnpassword;}
publicvoidsetPassword(Stringpassword){this.password=password;}
publicDategetCreateTime(){returncreateTime;}
publicvoidsetCreateTime(DatecreateTime){this.createTime=createTime;}
publicDategetExpireTime(){returnexpireTime;}
publicvoidsetExpireTime(DateexpireTime){this.expireTime=expireTime;}
}
User.hbm.xml
ExportDB.java
//根据实体类生成SQL命令来创建表,注意先要在MySQL中创建数据库hibernate
packagecom.axjy.hibernate;
publicclassExportDB{
publicstaticvoidmain(String[]args){
Configurationcfg=newConfiguration().configure();//读取hibernate.cfg.xml文件
SchemaExportexport=newSchemaExport(cfg);//创建SchemaExport
export.create(true,true);//根据实体类生成MySQL的表
}
}
Client.java
packagecom.axjy.hibernate;
publicclassClient{
publicstaticvoidmain(String[]args){
Configurationcfg=newConfiguration().configure();//读取hibernate.cfg.xml文件
//Configurationcfg=newConfiguration();//读取hibernate.properties文件
SessionFactoryfactory=cfg.buildSessionFactory();
Sessionsession=null;//Session不是线程安全的,使用时要注意
try{
session=factory.openSession();
session.beginTransaction();//打开事务处理
Useruser=newUser();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(newDate());
user.setExpireTime(newDate());
session.save(user);//保存记录,user必须是实体对象
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
if(session!
=null){
if(session.isOpen()){session.close();}
}
}
}
}
测试实体对象的生命周期(Hiberate_session)
●junit简介:
⏹编写测试类xxxTest,需要继承TestCase
⏹编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
⏹publicvoidtestHello1(){}
⏹最好单元测试的代码单独建立一个目录
●了解session的CRUD操作(增删改查)
●了解session.get()和session.load()方法的区别?
⏹get不支持lazy,load支持lazy
⏹采用get加载数据,如果数据库中不存在相应的数据,那么返回null
⏹采用load加载数据,如果数据库中不存在相应的数据,那么抛出ObjectNotFoundException
●Transient状态:
⏹不处在session的缓存中,不和任何session实例有关联
⏹在数据库中没有相应的记录
●Persistent状态:
⏹位于session的缓存中,persistent状态的对象总是和session实例关联
⏹persistent状态的对象和数据库表中的记录有对应
⏹persistent状态的对象发生改变会自动和数据库同步
●Detached状态:
⏹不处于session的缓存中,不和任何session实例有关联
⏹Detached状态的对象在数据库中有与之对应的记录
User.java
packagecom.axjy.hibernate;
publicclassUser{
privateStringid;
privateStringname;
privateStringpassword;
privateDatecreateTime;
privateDateexpireTime;
publicStringgetId(){returnid;}
publicvoidsetId(Stringid){this.id=id;}
publicStringgetName(){returnname;}
publicvoidsetName(Stringname){this.name=name;}
publicStringgetPassword(){returnpassword;}
publicvoidsetPassword(Stringpassword){this.password=password;}
publicDategetCreateTime(){returncreateTime;}
publicvoidsetCreateTime(DatecreateTime){this.createTime=createTime;}
publicDategetExpireTime(){returnexpireTime;}
publicvoidsetExpireTime(DateexpireTime){this.expireTime=expireTime;}
}
User.hbm.xml
ExportDB.java
packagecom.axjy.hibernate;
publicclassExportDB{
publicstaticvoidmain(String[]args){
Configurationcfg=newConfiguration().configure();
SchemaExportexport=newSchemaExport(cfg);
export.create(true,true);
}
}
HibernateUtils.java
//创建SessionFactory,比较费时,使用单例只创建一次,它是线程安全的
packagecom.axjy.hibernate;
publicclassHibernateUtils{
privatestaticSessionFactoryfactory;
privateHibernateUtils(){}
static{
try{
Configurationcfg=newConfiguration().configure();
factory=cfg.buildSessionFactory();
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticSessionFactorygetFactory(){returnfactory;}
publicstaticSessiongetSession(){returnfactory.openSession();}
publicstaticvoidcloseSession(Sessionsession){
if(session!
=null){
if(session.isOpen()){session.close();}
}
}
}
SessionTest.java
packagecom.axjy.hibernate;
publicclassSessionTestextendsTestCase{//测试类必须从TestCase类继承
publicvoidtestHello1(){System.out.println("SessionTest.testHello1()");}
publicvoidtestHello2(){System.out.println("SessionTest.testHello2()");}
publicvoidtestSave1(){
Sessionsession=null;
Useruser=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();//一种事务写法
//开始是transient状态
user=newUser();
user.setName("李四");
user.setPassword("abc");
user.setCreateTime(newDate());
user.setExpireTime(newDate());
//save后变成persistent状态,persistent状态的对象属性发生修改,数据库会自动同步更新
session.save(user);
user.setName("王五");//数据库中也变成"王五"
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
user.setName("张三");//数据库中仍是前面的"王五"
Transactiontx=null;//另一种事务写法
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//persistent状态
session.update(user);//参数user必须是实体对象,数据库中变成"张三"
mit();
}catch(Exceptione){
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
publicvoidtestReadByGetMethod1(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//马上发出了一条查询sql,此时为persistent状态
Useruser=(User)session.get(User.class,"4028801d1acd26d7011acd26dc0d0001");
System.out.println("user.name="+user.getName());
//查询后变成persistent状态,persistent状态的对象属性发生修改,数据库会自动同步更新
user.setName("李四");//数据库中也变成了"李四"
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
publicvoidtestReadByGetMethod2(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用get加载数据,如果数据库中没有与之匹配的数据,返回null
Useruser=(User)session.get(User.class,"fsdfsdfsfdsfds");
System.out.println(user);
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
publicvoidtestReadByLoadMethod1(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//不会马上发出查询sql,因为load实现了lazy(延迟加载/懒加载)
//延迟加载实现原理:
采用代理方式(CGLIB)
//延迟加载:
只有在真正使用的时候才加载相关的对象,lazy是hibernate重要特性
Useruser=(User)session.load(User.class,"402880161acdf2e6011acdf33e8f0001");
//开始真正使用时才发出了一条查询sql,查询后对象变成persistent状态
System.out.println("user.name="+user.getName());
user.setName("张三");
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
publicvoidtestReadByLoadMethod2(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用load加载数据,如果数据库中没有与之匹配的数据,那么抛出ObjectNotFoundException异常
Useruser=(User)session.load(User.class,"sdfsdfsfsdfdfdf4444444");
System.out.println("user.name="+user.getName());
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
publicvoidtestUpdate(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//手动构造detached状态的对象
Useruser=newUser();
user.setId("402880161ac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate