Hibernate初步部署
下载全套文件: hibernate-release-4.1.7.Final.zip
目录结构
Documentation文件夹下是开发帮助文档
Lib文件夹是开发使用的库,其中该文件夹下面的required目录是开发时必须导入的JAR文件;
Project文件夹是项目源码文件
JDBC与Hibernate的比较:
Hibernate的初步配置部署:
1. 创建web项目
2. 添加响应需要的Hibernate的jar包
3. 创建Java Bean业务实体类
4. 创建实体类映射的配置文件:**.hbm.xml
5. 创建Hibernate的配置文件hibernate.cfg.xml
6. 创建测试类测试hibernate是否配置成功
实体类:UserInfo.java
public class UserInfo
{
private int userid;
private String userName;
private String userPwd;
private Date birthday;
//省略了属性各种get和set方法
//创建含有id的构造函数
public UserInfo(int id)
{
this.userid=id;
}
public UserInfo(int userid, String userName, String userPwd, Date birthday)
{
super();
this.userid = userid;
this.userName = userName;
this.userPwd = userPwd;
this.birthday = birthday;
}
//无参的构造函数是必须要有的
public UserInfo()
{
}
}
实体类的配置文件UserInfo.hbm.xml
(配置文件尽量和实体类名字去的一致方便管理和实体类放在同一个包中)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity"> //package包指定实体类的包
<class name="UserInfo" table="luser">
//name指定实体类名 table为数据库中实体类对应的表名如果没有指定就和类名一致
<id name="userid">
<generator class="native"/>
</id>
//id标识主键的字段 class=native标识自增长
<property name="userName" column=”name” />
//property指定属性的字段,column可以指定数据库中对应字段的名称,如果没有就和实体类的属性名一致
<property name="userPwd" />
<property name="birthday" />
</class>
</hibernate-mapping>
Hibernate的配置文件hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 显示执行的sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 配置数据库各种数据 -->
<!-- 配置数据库本地语言 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.3.252:1521:orcl</property>
<!-- 配置数据库的用户名和密码 -->
<property name="hibernate.connection.username">bam1</property>
<property name="hibernate.connection.password">bam1</property>
<!-- 设置数据定义语言操作的方式 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载对象关系映射文件 -->
<mapping resource="entity/UserInfo.hbm.xml"/>
</session-factory>
</hibernate-configuration>
测试类Test.java
添加一条数据:
public static void add()
{
//第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
Configurationcon=new Configuration().configure();
//第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
ServiceRegistryBuilderregbulider=newServiceRegistryBuilder().applySettings(con.getProperties());
//创建注册服务
ServiceRegistryreg=regbulider.buildServiceRegistry();
//第三步:创建会话工厂
SessionFactorysessionFactory=con.buildSessionFactory(reg);
//第四步:创建数据操作会话
Sessionsession=sessionFactory.openSession();
//创建对象
*/
UserInfohanhan=new UserInfo();
hanhan.setUserName("hanhan313");
hanhan.setUserPwd("123");
hanhan.setBirthday(new Date());
/*
//创建事物
Transactiontran=session.beginTransaction();
//保存数据
session.save(hanhan);
//提交事物
tran.commit();
//关闭对话
session.close();
}
查询一条数据:
创建了session回话后
//查询id为10的userinfo的用户信息
UserInfouser=session.get(UserInfo.class,10);
更新一条数据:
首先查询出数据
UserInfo user=session.get(UserInfo.class,10);
再对user进行数据修改后
再通过获取到session回话
session.update(user)
删除一条数据:
删除数据时将需要删除的id数据包装成对象
比如:
UserInfouser=new UserInfo();
User.setUserId(10);
session.delete(user); //删除时就会自动获取到user中id进行删除
hibernate的流程:
持久化JAVA类必须遵循的原则
1、为类的持久化字段声明访问方法(get/set),Hibernate对JavaBeans风格的属性实行持久化。
2、实现一个默认的构造方法,这样的话Hibernate就可以使用Constructor.newInstance()方法来实例化对象。
3、如果是集合类型的属性,它的类型必须定义为集合的接口,例如:List、Set
4、提供一个标识属性(Identifier property),如果没有该属性,一些功能不起作用,比如:级联更新,session.saveOrUpdate()。
对象的状态:
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341