工程結構:
所有實驗步驟:
建立java工程
1.導入包
2.建立一個對應與數據庫的類Student。里面的屬性和數據庫中的字段對應。
3.在上面Student類所在的目錄下建立映射文件。配置對象-關系映射文件:Student.hbm.xml //名稱不確定,隨意!最好放在bean中
<?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 package="com.huasoft.domain">
<!-- 不指定table默認以類為依據,創建student表 (第一個字母小寫)-->
<class name="Student">
<id name="id" >
<generator class="native"></generator> <!-- 自動增長 -->
</id>
<property name="name" length="20" column="myname"></property> <!--類的屬性和數據庫字段對應關系,默認不寫column就以屬性為數據庫字段列-->
<property name="sex"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
4.在src下加入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 >
<!--指定方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--指定數據庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定連接url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hbm_first</property>
<!-- 指定數據用戶名 -->
<property name="hibernate.connection.username">root</property>
<!-- 指定數據庫密碼 -->
<property name="hibernate.connection.password">ai2212935</property>
<!-- 中斷輸出sql語句 -->
<property name="hibernate.show_sql">true</property>
<!-- 加載指定映射文件 -->
<mapping resource="com/huasoft/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.引入mysql的驅動包,hibernate只能生成表,不能生成數據庫,打開sql自己創建數據庫。
6.建立一個類Client.java,用來生成表(讀取配置文件,連接,)。
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
//生成表
public class Client {
public static void main(String[] args){
try {
Configuration cfg=new Configuration().configure();
//根據配置信息生成表的工具類
SchemaExport export=new SchemaExport(cfg);
//工具類產生表:第一個參數,創建表顯示在控制台,第二個參數:允許將腳本配置導入數據庫。
export.create(true, true);
} catch (Exception e) {
}
}
}
7.創建一個帶有主函數類Test,用來對數據庫進行操作,獲取增刪該查
i
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
import com.huasoft.domain.Student;
//對生成的數據庫進行底層操作
public class Test {
public static void main(String[] args) {
try {
Configuration cfg=new Configuration().configure();//讀取配置文件
/**
* hibernate 4.0之后版本獲取方式,使用帶有參數的buildSessionFactory()獲取sessionFactory對象
*/
ServiceRegistryBuilder srb = new ServiceRegistryBuilder();
SessionFactory factory=cfg.buildSessionFactory(srb.applySettings(cfg.getProperties()).buildServiceRegistry());
/**老版本獲取sessionFactory對象,buildSessionFactory()
SessionFactory factory=cfg.buildSessionFactory();
*/
Session session=factory.openSession();
Transaction tx=session.getTransaction();
tx.begin();
Student student=new Student();
student.setAge(20);
student.setName("艾廣然 ");
student.setSex("男");
session.save(student);
tx.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.單元測試(允許建立多個方法,每一個方法作為程序的運行接口,不再局限於main,做測試用):
引入架包junit.jar
為了區分,建立一個source src,建立一個com.huasoft.test包,包中的HbmTest類extends TestCase類 。
方法名必須以test開頭,可以實現多個方法的測試。
由於我們不需要每次執行其中的方法都去建立一個SessionFactory,所以我們把
Configuration cfg=new Configuration().configure();//讀取配置文件
SessionFactory factory=cfg.buildSessionFactory();//創建factory對象。
這兩句話創建的factory在hbmUtil中單例模式建立,在HbmTest類中就不需要每次都創建對象了。
hbmUtil單例模式:
package com.huasoft.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
public class hbmUtil {
private static final SessionFactory sesionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
/*
* 4.0之后新版本獲取方式。sessionFactory對象
*/
Configuration cfg = new Configuration().configure();
ServiceRegistryBuilder srb = new ServiceRegistryBuilder();
return cfg.buildSessionFactory(srb.applySettings(cfg.getProperties()).buildServiceRegistry());
/*
* 老版本獲取方式 sessionFactory對象
* Configuration().configure().buildSessionFactory();
*/
} catch (Throwable ex) {
System.out.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sesionFactory;
}
}
HbmTest類中(對底層的操作):
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.huasoft.domain.Student;
import com.huasoft.util.hbmUtil;
import junit.framework.TestCase;
public class HbmTest extends TestCase {
//插入保存
public void testSave(){
SessionFactory factory=null;
Session session=null;
Transaction tx=null;
try {
factory=hbmUtil.getSessionFactory();
session=factory.openSession();
tx=session.getTransaction();
//開啟事物
tx.begin();
Student student=new Student();
student.setAge(21);
student.setName("艾廣然 ");
student.setSex("男");
session.save(student);
//提交事物
tx.commit();
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
e.printStackTrace();
}finally{
session.close();
}
}
//查詢某一個,使用get或者load方法
public void testLoad(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
//要加載的類型, 序列化(基本類型都實現了序列化,id)
Student student=(Student) session.load(Student.class, 1);
System.out.println(student.getName()+" "+student.getAge());
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//查詢多個
public void testQuery(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
//操作的是對象 ,from 類名
Query query=session.createQuery("from Student");
List list=query.list();
for (Iterator<Student> iterator = list.iterator(); iterator.hasNext();) {
Student student = iterator.next();
System.out.println(student.getName()+" "+student.getAge());
}
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//更新
public void testUpdate(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
Transaction tx=session.getTransaction();
tx.begin();
Student student=(Student) session.get(Student.class, 1);
student.setName("小狗1");
session.update(student);
tx.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}