初入Hibernate框架<一>
需要的工具從官網下載: hibernate.org
Hibernate框架實際上就是:對象關係映射:通過描述對象和數據庫之間映射的元數據,操作數據庫,將Java程序中的對象自動持久化到數據庫(自己不用寫sql語句)。
是一個將持久化類與數據庫表相映射的工具。
入門示例:
第一步 先建一個Java工程導入使用hibernate最小必要包。 —-lib/required
第二步 在src目錄下創建配置文件hibernate.cfg.cml
第三步 編寫一個會話工廠
注意:
Hibernate中的session不能關也關不了,和sessionFactory也不能關
新建一個值對象,在domain包下面建立一個Student.hbm.xml,映射文件,用來將值對象裏面的屬性與數據庫的每一列對應。
後面附上需要的數據庫創建語句——–
配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 該配置文件站的立場是Object, 去配置自己和 數據庫表之間的映射關係 -->
<!-- 根 hibernate-mapping-->
<hibernate-mapping package="cn.hncu.demo.domain">
<class name="Student" table="students" catalog="hib">
<!-- id標記是指Student類中的屬性變量,該屬性是表主鍵字段對應 -->
<id name="studId" type="java.lang.String">
<!-- column標記是指數據庫表中的哪一列(字段) -->
<column name="id" length="8"></column>
</id>
<!-- 只有主鍵字段對應的屬性變量才能用id,其它字段對應的屬性變量都用property -->
<property name="studName" type="java.lang.String">
<column name="name" length="40"></column>
</property>
<property name="age" type="java.lang.Integer">
<column name="age"></column>
</property>
<property name="depId" type="java.lang.String">
<column name="deptId" length="8"></column>
</property>
</class>
</hibernate-mapping>
然後寫一個在SRC下的配置文件 hibernate.cfg.xml:
告訴hibernate要怎樣鏈接數據庫,將你的連接信息給它,還有你對值對象的映射配置也要在此配置
hibernate.cfg.xml
<?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>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hib</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- SQL dialect方言:告訴它你是用的什麼數據庫語言-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 其他在此用不上,就省略了-->
<!-- 一定要把我們寫的對象映射文件配置進來(可以配置多個),否則沒法使用Hibernate的ORM功能 -->
<mapping resource="cn/hncu/demo/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
鏈接完 之後,寫個類似於C3P0Ppool的Util,用來獲取他的SessionFactory
HibernateUtil:
public class HibernateUtil {
//單例
private static SessionFactory sessionFactory =null;
private static ThreadLocal<Session> t = new ThreadLocal<Session>();
static{
//類似於C3P0連接池
try {
Configuration config = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( config.getProperties() ).build();
sessionFactory = config.buildSessionFactory(serviceRegistry);
} catch (HibernateException e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() throws HibernateException{
Session session = t.get();
if(session == null || !session.isOpen()){
//沒有sessionFactory哪來的session
session=(sessionFactory!=null) ?sessionFactory.openSession() : null;
t.set(session);
}
return session ;
}
//關閉與數據庫的會話
public static void closeSession() {
t.set(null);
}
}
最後就是測試是否成功的操作數據庫:
public class StudentManager {
public static void main(String[] args) {
//來自手冊的方式---新測結果:不行
Session session = HibernateSessionFactory.getSession();
session.beginTransaction(); //開啓事務
Student stud = new Student();
stud.setStudId("S006");
stud.setStudName("劉備");
stud.setAge(23);
stud.setDepId("D003");
session.save(stud);
Student stud2 = new Student();
stud2.setStudId("S007");
stud2.setStudName("張飛");
stud2.setAge(23);
stud2.setDepId("D003");
session.save(stud2);//如存在主鍵重複則會進行事務回滾
session.getTransaction().commit();//事務提交 (如果出異常,Hibernate會幫我們回滾的,我們不用寫rollback() )
session.close();
}
}
結果
日誌信息:
我所使用的Hibernate版本鏈接:
http://pan.baidu.com/s/1dEOGVx3
我所用的SQL語句
create database hib character set utf8;
use hib;
create table students(
id varchar(8) primary key,
name varchar(40),
age int,
deptId varchar(8)
);
insert into students values('S001','Jack',20,'D001');
insert into students values('S002','Tom', 21,'D001');
insert into students values('S003','張三',23,'D002');
insert into students values('S004','李四',24,'D002');
insert into students values('S005','王五',22,'D002');
CREATE TABLE depts(
id VARCHAR(8) PRIMARY KEY,
NAME VARCHAR(40)
);
insert into depts values('D001','信息科學與工程學院');
insert into depts values('D002','數學與計算機學院');
insert into depts values('D003','土木工程學院');
DELETE FROM students;
ALTER TABLE students ADD(
CONSTRAINT fk_stu_dept FOREIGN KEY(deptid) REFERENCES depts(id)
);
使用Hibernate必須要導入的包(最小必要包):
最後一個爲連接數據庫的包