好久没有用s2sh的框架了,最近业务需要又要拾起来。在搭框架时,发现之前都是复制配置文件,对具体的细节却很懵懂,所以要从新来一遍,也是一次新的学习。
我使用的版本是hibernate-release-4.3.11.Final,因为需要使用基于xml的配置,这一版本关于xml的文档还是很友好的,最新的5.x主要针对注解,与业务有所出入。
下面开始搭建:
百度云:jar包链接 密码:h7o8
关于文件结构
搭建Hibernate的压缩文件解压后就是下面的结构:
jdbc和log4j包是我后加的,其他是就是hibernate的,下面说下他这几个文件夹的大致用途
documentation文件夹:存放了Hibernate的使用文档和框架API等,下面会用到。
lib文件夹:存放的是hibernate所需要的jar包。
project文件夹:存放的是一些小项目实例,里面的etc会用到。
关于jar包
搭建Hibernate,首先就是jar包,而Hibernate的jar包就在lib/required文件夹里,下面是这些jar包的作用
有了这些jar包,Hibernate的功能就全了,但是Hibernate是操作数据库的,所以我们还需要提供我们要使用的数据库的对应的驱动。如mysql的驱动包。
在开发过程中,我们必然还需要记录捕捉项目的运行情况,所以还需要log4j的支持,进官网下载即可
下载完的文件里有很多jar包,用哪个呢,官网的下面说的很清楚。
到这里,jar包就准备完成了,
创建项目
创建一个项目。
一、file-new-javaProject 填写项目名即可,因为主要说明Hibernate的使用,不需要web,所以直接用JavaProject,如果使用web也是一样的道理。
导入jar包
一、创建一个文件夹,将上面Hibernate的required文件夹的jar包、jdbc的jar包、log4j的jar包都copy进来
二、全选,鼠标右键-buildPath-add to build path
创建一个数据表
创建一个数据库,并添加一个表,下面是一个示例。也可以自己随意创建。
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( ?`u_id` int(11) NOT NULL AUTO_INCREMENT, ?`u_email` varchar(60) DEFAULT NULL, ?`u_name` varchar(100) DEFAULT NULL, ?`u_username` varchar(100) DEFAULT NULL, ?`u_password` varchar(70) DEFAULT NULL, ?`u_age` varchar(255) DEFAULT NULL, ?`u_detail` varchar(255) DEFAULT NULL, ?`u_avatar` varchar(255) DEFAULT NULL, ?`is_admin` varchar(5) DEFAULT NULL, ?`createtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, ?`updatetime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, ?PRIMARY KEY (`u_id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
创建一个表对应的实体类
先建一个com.xx.domain的包,将实体类放入包中
package com.cky.domain;import java.sql.Timestamp;public class User { ???private Integer uId; ???private String uEmail; ???private String uName; ???private String uUsername; ???private String uPassword; ???private String uAge; ???private String uDetail; ???private String uAvatar; ???private String isAdmin; ???private Timestamp createtime; ???private Timestamp updatetime; ???public Integer getuId() { ???????return uId; ???} ???public void setuId(Integer uId) { ???????this.uId = uId; ???} ???public String getuEmail() { ???????return uEmail; ???} ???public void setuEmail(String uEmail) { ???????this.uEmail = uEmail; ???} ???public String getuName() { ???????return uName; ???} ???public void setuName(String uName) { ???????this.uName = uName; ???} ???public String getuUsername() { ???????return uUsername; ???} ???public void setuUsername(String uUsername) { ???????this.uUsername = uUsername; ???} ???public String getuPassword() { ???????return uPassword; ???} ???public void setuPassword(String uPassword) { ???????this.uPassword = uPassword; ???} ???public String getuAge() { ???????return uAge; ???} ???public void setuAge(String uAge) { ???????this.uAge = uAge; ???} ???public String getuDetail() { ???????return uDetail; ???} ???public void setuDetail(String uDetail) { ???????this.uDetail = uDetail; ???} ???public String getuAvatar() { ???????return uAvatar; ???} ???public void setuAvatar(String uAvatar) { ???????this.uAvatar = uAvatar; ???} ???public String getIsAdmin() { ???????return isAdmin; ???} ???public void setIsAdmin(String isAdmin) { ???????this.isAdmin = isAdmin; ???} ???public Timestamp getCreatetime() { ???????return createtime; ???} ???public void setCreatetime(Timestamp createtime) { ???????this.createtime = createtime; ???} ???public Timestamp getUpdatetime() { ???????return updatetime; ???} ???public void setUpdatetime(Timestamp updatetime) { ???????this.updatetime = updatetime; ???} ???@Override ???public boolean equals(Object o) { ???????if (this == o) return true; ???????if (o == null || getClass() != o.getClass()) return false; ???????User user = (User) o; ???????if (uId != user.uId) return false; ???????if (uEmail != null ? !uEmail.equals(user.uEmail) : user.uEmail != null) return false; ???????if (uName != null ? !uName.equals(user.uName) : user.uName != null) return false; ???????if (uUsername != null ? !uUsername.equals(user.uUsername) : user.uUsername != null) return false; ???????if (uPassword != null ? !uPassword.equals(user.uPassword) : user.uPassword != null) return false; ???????if (uAge != null ? !uAge.equals(user.uAge) : user.uAge != null) return false; ???????if (uDetail != null ? !uDetail.equals(user.uDetail) : user.uDetail != null) return false; ???????if (uAvatar != null ? !uAvatar.equals(user.uAvatar) : user.uAvatar != null) return false; ???????if (isAdmin != null ? !isAdmin.equals(user.isAdmin) : user.isAdmin != null) return false; ???????if (createtime != null ? !createtime.equals(user.createtime) : user.createtime != null) return false; ???????if (updatetime != null ? !updatetime.equals(user.updatetime) : user.updatetime != null) return false; ???????return true; ???} ???@Override ???public String toString() { ???????return "User{" + ???????????????"uId=" + uId + ???????????????", uEmail=‘" + uEmail + ‘\‘‘ + ???????????????", uName=‘" + uName + ‘\‘‘ + ???????????????", uUsername=‘" + uUsername + ‘\‘‘ + ???????????????", uPassword=‘" + uPassword + ‘\‘‘ + ???????????????", uAge=‘" + uAge + ‘\‘‘ + ???????????????", uDetail=‘" + uDetail + ‘\‘‘ + ???????????????", uAvatar=‘" + uAvatar + ‘\‘‘ + ???????????????", isAdmin=‘" + isAdmin + ‘\‘‘ + ???????????????", createtime=" + createtime + ???????????????", updatetime=" + updatetime + ???????????????"}\n"; ???} ???@Override ???public int hashCode() { ???????Integer result = uId; ???????result = 31 * result + (uEmail != null ? uEmail.hashCode() : 0); ???????result = 31 * result + (uName != null ? uName.hashCode() : 0); ???????result = 31 * result + (uUsername != null ? uUsername.hashCode() : 0); ???????result = 31 * result + (uPassword != null ? uPassword.hashCode() : 0); ???????result = 31 * result + (uAge != null ? uAge.hashCode() : 0); ???????result = 31 * result + (uDetail != null ? uDetail.hashCode() : 0); ???????result = 31 * result + (uAvatar != null ? uAvatar.hashCode() : 0); ???????result = 31 * result + (isAdmin != null ? isAdmin.hashCode() : 0); ???????result = 31 * result + (createtime != null ? createtime.hashCode() : 0); ???????result = 31 * result + (updatetime != null ? updatetime.hashCode() : 0); ???????return result; ???} ???}
在创建实体类时,属性最好使用包装类,例如:Integer,因为与基本类型(int)相比,包装类多了一种null状态。可以表示不存在,而基本类型带有默认值(如int默认0),这时就会有歧义,不知道是值为0还是不存在。
创建Hibernate配置文件
在项目鼠标右键-new-SourceFolder,创建一个资源文件。
(资源文件是为了方便我们阅读而设计的,当程序编译后,所有的资源文件会进行合并最后全部放到classes文件中,所以我们可以通过classpath进行获取)
创建hibernate.cfg.xml文件(这个文件名是hibernate默认文件名,当程序启动时,hibernate会自动在classpath中寻找名为hibernate.cfg.xml的文件,如果不是这个名字,就需要后期手动指定,会比较麻烦)
下面我们需要为文件添加约束,那么约束在哪里呢?
其实hibernate早已经为我们准备好了,打开hibernate核心包下的org.hibernate,最下面会有dtd文件
双击打开hibernate-configuration-3.0.dtd文件(3.0向下兼容,4.0不向下兼容,所以要选择3.0的文件),会发现,上面注释里说明了约束头怎么写:
复制到配置文件中:
这时我们写一个<然后alt+?,会有提示标签,什么?你没有?那可以看看另一篇博客
配置文件的基本结构如下:
<?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"> ???<hibernate-configuration> ???<!-- 先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 --> ???<session-factory> ???????<!-- 必须的配置的参数5个,4大参数,数据库方言 ?--> ???????<!-- ???????#hibernate.connection.driver_class com.mysql.jdbc.Driver ???????#hibernate.connection.url jdbc:mysql:///test ???????#hibernate.connection.username gavin ???????#hibernate.connection.password ????????数据库方言 ???????#hibernate.dialect org.hibernate.dialect.MySQLDialect ????????--> ???????<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> ???????<property name="hibernate.connection.url">jdbc:mysql:///blog</property> ???????<property name="hibernate.connection.username">root</property> ???????<property name="hibernate.connection.password">123456</property> ????????<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> ???????<!-- 可选配置 --> ???????<!-- 显示sql语句 --> ???????<property name="hibernate.show_sql">true</property> ???????<!-- 格式化sql语句 --> ???????<property name="hibernate.format_sql">true</property> ???????<!-- 生成数据库的表结构 ????????(hbm2dd全称hibernate mapping to db define language auto create) ???????update 没表会自动创建,有表添加数据。 ???????????如果开发中间需要添加字段,可以在实体类添加属性。update会自动在数据库添加字段,并且不改变原来数据库值 ???????validate 校验实体属性和数据库是否一致 ???????--> ???????<property name="hibernate.hbm2ddl.auto">update</property> ???????????????<!-- 映射配置文件,可以在map配置文件右键copy qualified name--> ???????<mapping resource="com/cky/domain/User.hbm.xml"/> ???</session-factory></hibernate-configuration>
上面配置的属性都可以在hibernate-release-4.3.11.Final\project\etc\hibernate.properties文件中找到
创建mapping映射文件
关于mapping映射文件的一些默认的规则。
1、Hibernate的mapping映射文件默认需要和实体类在同一文件夹中。
2、mapping映射文件默认命名规则:实体类名.hbm.xml。hbm(全称:hibernate mapping)
User.hbm.xml文件
<?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"> ???<hibernate-mapping><class name="com.cky.domain.User" table="user"><!-- 配置id ???name实体类属性,column表字段,如果一样,column可以省略。 --> ???<id name="uId" column="u_id"> ???<!-- 主键生成策略 --> ???????<generator class="native"></generator> ???</id> ???<property name="uEmail" column="u_email"></property> ???<property name="uName" column="u_name"></property> ???<property name="uUsername" column="u_username"></property> ???<property name="uPassword" column="u_password"></property> ???<property name="uAge" column="u_age"></property> ???<property name="uDetail" column="u_detail"></property> ???<property name="uAvatar" column="u_avatar"></property> ???<property name="isAdmin" column="is_admin"></property> ???<property name="createtime" column="createtime"></property> ???<property name="updatetime" column="updatetime"></property></class></hibernate-mapping>
User实体类文件
package com.cky.domain;import java.sql.Timestamp;public class User { ???private Integer uId; ???private String uEmail; ???private String uName; ???private String uUsername; ???private String uPassword; ???private String uAge; ???private String uDetail; ???private String uAvatar; ???private String isAdmin; ???private Timestamp createtime; ???private Timestamp updatetime; ???public Integer getuId() { ???????return uId; ???} ???public void setuId(Integer uId) { ???????this.uId = uId; ???} ???public String getuEmail() { ???????return uEmail; ???} ???public void setuEmail(String uEmail) { ???????this.uEmail = uEmail; ???} ???public String getuName() { ???????return uName; ???} ???public void setuName(String uName) { ???????this.uName = uName; ???} ???public String getuUsername() { ???????return uUsername; ???} ???public void setuUsername(String uUsername) { ???????this.uUsername = uUsername; ???} ???public String getuPassword() { ???????return uPassword; ???} ???public void setuPassword(String uPassword) { ???????this.uPassword = uPassword; ???} ???public String getuAge() { ???????return uAge; ???} ???public void setuAge(String uAge) { ???????this.uAge = uAge; ???} ???public String getuDetail() { ???????return uDetail; ???} ???public void setuDetail(String uDetail) { ???????this.uDetail = uDetail; ???} ???public String getuAvatar() { ???????return uAvatar; ???} ???public void setuAvatar(String uAvatar) { ???????this.uAvatar = uAvatar; ???} ???public String getIsAdmin() { ???????return isAdmin; ???} ???public void setIsAdmin(String isAdmin) { ???????this.isAdmin = isAdmin; ???} ???public Timestamp getCreatetime() { ???????return createtime; ???} ???public void setCreatetime(Timestamp createtime) { ???????this.createtime = createtime; ???} ???public Timestamp getUpdatetime() { ???????return updatetime; ???} ???public void setUpdatetime(Timestamp updatetime) { ???????this.updatetime = updatetime; ???} ???@Override ???public boolean equals(Object o) { ???????if (this == o) return true; ???????if (o == null || getClass() != o.getClass()) return false; ???????User user = (User) o; ???????if (uId != user.uId) return false; ???????if (uEmail != null ? !uEmail.equals(user.uEmail) : user.uEmail != null) return false; ???????if (uName != null ? !uName.equals(user.uName) : user.uName != null) return false; ???????if (uUsername != null ? !uUsername.equals(user.uUsername) : user.uUsername != null) return false; ???????if (uPassword != null ? !uPassword.equals(user.uPassword) : user.uPassword != null) return false; ???????if (uAge != null ? !uAge.equals(user.uAge) : user.uAge != null) return false; ???????if (uDetail != null ? !uDetail.equals(user.uDetail) : user.uDetail != null) return false; ???????if (uAvatar != null ? !uAvatar.equals(user.uAvatar) : user.uAvatar != null) return false; ???????if (isAdmin != null ? !isAdmin.equals(user.isAdmin) : user.isAdmin != null) return false; ???????if (createtime != null ? !createtime.equals(user.createtime) : user.createtime != null) return false; ???????if (updatetime != null ? !updatetime.equals(user.updatetime) : user.updatetime != null) return false; ???????return true; ???} ???@Override ???public String toString() { ???????return "User{" + ???????????????"uId=" + uId + ???????????????", uEmail=‘" + uEmail + ‘\‘‘ + ???????????????", uName=‘" + uName + ‘\‘‘ + ???????????????", uUsername=‘" + uUsername + ‘\‘‘ + ???????????????", uPassword=‘" + uPassword + ‘\‘‘ + ???????????????", uAge=‘" + uAge + ‘\‘‘ + ???????????????", uDetail=‘" + uDetail + ‘\‘‘ + ???????????????", uAvatar=‘" + uAvatar + ‘\‘‘ + ???????????????", isAdmin=‘" + isAdmin + ‘\‘‘ + ???????????????", createtime=" + createtime + ???????????????", updatetime=" + updatetime + ???????????????"}\n"; ???} ???@Override ???public int hashCode() { ???????Integer result = uId; ???????result = 31 * result + (uEmail != null ? uEmail.hashCode() : 0); ???????result = 31 * result + (uName != null ? uName.hashCode() : 0); ???????result = 31 * result + (uUsername != null ? uUsername.hashCode() : 0); ???????result = 31 * result + (uPassword != null ? uPassword.hashCode() : 0); ???????result = 31 * result + (uAge != null ? uAge.hashCode() : 0); ???????result = 31 * result + (uDetail != null ? uDetail.hashCode() : 0); ???????result = 31 * result + (uAvatar != null ? uAvatar.hashCode() : 0); ???????result = 31 * result + (isAdmin != null ? isAdmin.hashCode() : 0); ???????result = 31 * result + (createtime != null ? createtime.hashCode() : 0); ???????result = 31 * result + (updatetime != null ? updatetime.hashCode() : 0); ???????return result; ???} ???}
添加测试
package com.cky.Demo;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import com.cky.domain.User;import com.cky.utils.HibernateUtils;public class DemoTest { ???@Test ???public void testSave() { ???????//1.加载配置文件 ???????Configuration cfg=new Configuration(); ???????//默认加载src目录下的hibernate.cfg.xml的配置文件 ???????cfg.configure(); ???????//2.创建sessionFactory ???????SessionFactory sessionFactory = cfg.buildSessionFactory(); ???????//3.创建session ???????Session session = sessionFactory.openSession(); ???????//4.开启事务 ???????Transaction tr = session.beginTransaction(); ???????//5.编写更新代码 ???????User user=new User(); ???????user.setuName("小红"); ???????user.setuPassword("123456"); ???????session.save(user); ???????????????//6.提交事务 ???????tr.commit(); ???????//7.释放资源 ???????session.close(); ???????sessionFactory.close(); ???}}
如何完全根据官方下载包搭建hibernate框架
原文地址:http://www.cnblogs.com/chenkeyu/p/7874998.html