Hibernate5配置與使用具體解釋
轉載請註明出處:http://blog.csdn.net/tyhj_sf/article/details/51851163
引言
Hibernate是一個輕量級的持久層開源框架,它是連接java應用程序和關系數據庫的中間件,負責java對象和關於Hibernate內部對JDBC API進行封裝,負責java對象的持久化。由於他封裝了所有的數據訪問細節,使的業務邏輯層開發專註於實現,它是一種優秀的ORM映射工具,提供了完好的對象–關系映射服務。開發過程不依賴容器。靈活性非常大,開源無縫集成到不論什麽一個java系統中。
Hibernate5配置
版本號
這裏是下載地址:http://hibernate.org/orm/
涉及到訪問數據庫還須要數據庫驅動器相關的jar包:
搭建使用hibernate的開發環境
你能夠創建一個Java project或者一個web project。以上的方式創建的項目均可測試hibernate環境。
本次以創建一個web工程的方式演示搭建開發環境的具體步驟。
1)創建一個web項目。
2)將相關hibernate的包和數據庫驅動器的包導入到例如以下圖路徑:
註意:hibernate的jar包,選擇例如以下指定路徑下的所有jar將其導入。
3)(在線安裝eclipse的插件:hibernate tools。方便編輯”.cfg.xml”和“hbm.xml”格式的文件。安裝方法若不熟可自行Google或百度,非本文重點。不再細說。
)
在src目錄創建hibernate.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/example/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上面這個配置文件主要是數據庫連接的相關配置,僅僅要配置成你自己的數據庫設置就可以。
對於這個maping屬性:
<mapping resource="com/example/domain/User.hbm.xml"/>
在你創建完以下的步驟 4和5後,就能夠補上,假設有多個javabean類及相應的 **.hbm.xml文件。就須要加入多個這種maping屬性。
4)創建你的項目中的javabean類,如User.java
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 2015771159L;
// @Id
// @Basic(fetch=FetchType.EAGER)
// @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
// @Basic(fetch=FetchType.LAZY)
// @Column(length=50)
private String emailName;
// @Basic(fetch=FetchType.LAZY)
// @Column(length=50)
private String emailPassword;
public User() {
// TODO Auto-generated constructor stub
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmailName() {
return emailName;
}
public void setEmailName(String emailName) {
this.emailName = emailName;
}
public String getEmailPassword() {
return emailPassword;
}
public void setEmailPassword(String emailPassword) {
this.emailPassword = emailPassword;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( !( o instanceof User ) ) {
return false;
}
if ( id == null ) {
return false;
}
return id.equals( ((User) o).id );
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+"[id="+id+"EmailName="+emailName+"EmailPassword="+emailPassword+"]";
}
5)編寫數據庫表及字段到javabean類User的映射文件。
這個樣例中必須創建為文件名稱:User.hbm.xml,能夠放User類所在包中。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-7-8 1:31:59 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.example.domain.User" table="USER">
<id name="id" type="java.lang.Long">
<column name="ID" not-null="true"/>
<generator class="increment"/>
</id>
<property generated="never" lazy="false" name="emailName" type="java.lang.String">
<column length="50" name="EMAILNAME" not-null="false"/>
</property>
<property generated="never" lazy="false" name="emailPassword" type="java.lang.String">
<column name="EMAILPASSWORD"/>
</property>
</class>
</hibernate-mapping>
Hibernate5的使用
接著上述的幾節內容。我來說說做關鍵部分,hibernate的使用。
這一部分我建議看看hibernate的官方文檔。畢竟網上的樣例各種hibernate版本號的樣例都有。不同版本號提供的接口不同,用法也有非常多差別,並且最新的hibernate版本號的使用demo非常難找到。
基本使用思路
**在使用Hibernate運行持久化操作前。須要得到一個Session對象。有了Session對象,就能夠以面向對象的方式保存、獲取、更新和刪除對象。
Session對象能夠通過SessionFactory(會話工廠類)的openSession方法來獲得。
因此還須要獲取SessionFactory對象**,它通過例如以下方式獲得:
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure() // 默認使用src目錄下的hibernate.cfg.xml進行配置,若更改了路徑,要附加上包路徑如:"/com/example/hibernate.cfg.xml"
.build();
try {
sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
}
catch (Exception e) {
StandardServiceRegistryBuilder.destroy( registry );
}
或者通過例如以下方式獲得:
Configuration configuration = new Configuration();// 默認使用src目錄下的hibernate.cfg.xml進行配置,若更改了路徑。要附加上包路徑如:"/com/example/hibernate.cfg.xml"
SessionFactory sf = configuration.configure().buildSessionFactory();
Session session = sf.openSession();
使用Junit測試搭建的hibernate開發環境
註意測試function中示範了hibernate的用法,這能夠用在實際的開發項目中。
Userdao.java的完整源代碼:
public class UserDao {
public UserDao() {
// TODO Auto-generated constructor stub
}
public static SessionFactory getSessionFactoryInstance(){
if (sessionFactory==null) {
synchronized (SessionFactory.class) {
if (sessionFactory==null){
config=new Configuration().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml");//若不指定。默認在目錄src下
//使用默認配合文件。hibernate.cfg.xml
return config.buildSessionFactory();
//另外一種寫法。
// StandardServiceRegistry standardServiceRegistry=new StandardServiceRegistryBuilder().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml").build();
// Metadata metadata = new MetadataSources( standardServiceRegistry ).getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE).build();
// return metadata.getSessionFactoryBuilder().build();
}
}
}
return sessionFactory;
}
/**
* @param id
* @return
* @throws Exception
*/
public User queryById(long id) throws Exception {
SessionFactory sessionFactory = HibernateConfigContext
.getSessionFactoryInstance();
Session session = sessionFactory.openSession();
Transaction transaction = null;
User user = null;
try {
transaction = session.beginTransaction();
user = (User) session.get(User.class, id);
transaction.commit();
} catch (Exception e) {
// TODO: handle exception
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
sessionFactory.close();
}
return user;
}
/**
* @param user
* 首次保存會生成id
* @throws Exception
*/
public void save(User user) throws Exception {
System.out.println("保存User數據");
SessionFactory sessionFactory = HibernateConfigContext
.getSessionFactoryInstance();
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (Exception e) {
// TODO: handle exception
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
sessionFactory.close();
}
}
/**
* @param user
* 已知id的User實例。
* @throws Exception
*/
public void update(User user) throws Exception {
SessionFactory sessionFactory = HibernateConfigContext
.getSessionFactoryInstance();
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.update(user);
transaction.commit();
} catch (Exception e) {
// TODO: handle exception
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
sessionFactory.close();
}
}
/**
* @param user
* 要刪除的user,已經保存到數據庫的,id分配
* @throws Exception
*/
public void delete(User user) throws Exception {
SessionFactory sessionFactory = HibernateConfigContext
.getSessionFactoryInstance();
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.delete("User", user);
transaction.commit();
} catch (Exception e) {
// TODO: handle exception
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
sessionFactory.close();
}
}
}
Junit測試程序:
public class UserTest extends TestCase {
public UserTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testSave() {
UserDao userDao=new UserDao();
User user=new User();
user.setEmailName("[email protected]");
user.setEmailPassword("ty123456789");
try {
userDao.save(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testQueryById() {
UserDao userDao=new UserDao();
User user=new User();
user.setId(1L);
user.setEmailName("[email protected]");
user.setEmailPassword("ty123456789");
try {
assertEquals(user,userDao.queryById(1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testUpdate() {
UserDao userDao=new UserDao();
User user=new User();
user.setId(1L);
user.setEmailName("[email protected]");
user.setEmailPassword("aaasss");
try {
userDao.update(user);
assertEquals(user,userDao.queryById(1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testDelete() {
UserDao userDao=new UserDao();
User user=new User();
user.setId(1L);
user.setEmailName("[email protected]");
user.setEmailPassword("aaasss");
try {
userDao.delete(user);
assertNull(userDao.queryById(1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
很多其它的數據庫其它操作參照以上測試用例寫就可以。Session類提供了大量方便的操作方法接口,能夠參考javadoc文檔使用。
Hibernate5配置與使用具體解釋