1.什麼是ORM?爲什麼使用Hibernate?
對象關係映射;爲了少寫和底層數據庫相關的sql語句,方便程序的維護、修改,提高跨平臺性和可擴展性。Hibernate是Java領域內的一款技術成熟穩定的ORM框架
2.Hibernate開發的基本步驟?
(1)新建項目,導入Hibernate必須的架包(點擊打開鏈接),編寫配置文檔hibernate.cfg.xml;
下面是配置MySql數據庫的示例:
<!--該文件的開頭信息,對Hibernate而言,該類文件基本都這麼開頭:)-->
<?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節點就夠了,除非我們中間使用了多個數據庫-->
<session-factory>
<!--用戶名 -->
<property name="connection.username">root</property>
<!--url信息 -->
<property name="connection.url">jdbc:mysql://localhost:3306/webases</property>
<!--數據庫方言信息-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--密碼 -->
<property name="connection.password">root</property>
<!--數據庫驅動信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定Hibernate映射文件路徑 -->
<mapping resource="com/Hibernate/test_products.hbm.xml" />
</session-factory>
</hibernate-configuration>
(2)編寫實體類。注意:每一個實體類都要與數據庫中的一張表一一對應,實體類的編寫要遵循JavaBean的要求;
1)、必須是公有類。
2)、提供共有的不帶參數的默認構造方法。
3)、屬性私有。
4)、屬性setter/getter封裝,以及toString方法。
import java.util.Date;
public class Students {
private int sid;//學號
private String sname;//姓名
private String gender;//
private String Address;//地址
private Date birthday;//生日
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Students(){
}
public Students(int sid, String sname, String gender, String address, Date birthday) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
Address = address;
this.birthday = birthday;
}
@Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", Address=" + Address
+ ", birthday=" + birthday + "]";
}
}
(3)生成對應實體類的映射文件並添加到配置文檔中;Students.hbm.xml的配置內容 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.wangchao.DAO.Students" table="STUDENTS"> <id name="sid" type="int"> <column name="SID"/> <generator class="assigned" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME"></column> </property> <property name="gender" type="java.lang.String"> <column name="GENDER"></column> </property> <property name="birthday" type="java.util.Date"> <column name="BIRTHDAY"></column> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS"></column> </property> </class> </hibernate-mapping>
(4)調用Hibernate API進行測試
使用Junit進行測試要使用到的標籤:
@Test:要測試的方法。
@Before:初始化方法(表示在測試前會先執行before方法進行初始化)。
@After:釋放資源。
執行次序:@before標籤下的方法——>@test方法——>@after釋放資源
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.MyBlog.XYXY.domain.Students;
//測試類
public class StudentsTest{
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init()
{
//創建配置對象
Configuration config = new Configuration().configure();
//創建服務註冊對象
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).getBootstrapServiceRegistry();
//創建會話工廠對象
sessionFactory = config.buildSessionFactory(serviceRegistry);
//會話對象
session = sessionFactory.openSession();
//開啓事務
transaction = session.beginTransaction();
}
@After
public void destory()
{
transaction.commit(); //提交事務
session.close(); //關閉會話
sessionFactory.close(); //關閉會話工廠
}
@Test
public void testSaveStudents(){
//生成學生對象
Students s=new Students(1,"熊長","男",new Date(),"長白山");
session.save(s); //保存對象進入數據庫
}
}
3.什麼是session?
類似於JDBC裏面的connection對象。調用session操作數據庫,實際上就是調用connection的各種API函數來實現的。
4.openSession與getCurrentSession的區別?
(1)openSension每次都是創建新的session對象,而getCurrentSenssion使用單例模式,每次創建都是相同的對象。
(2)openSession在使用完畢後需要顯式地關閉,而getCurrentSession在事務提交之後會自動關閉。
5.單表操作有哪些常用的方法?
增刪改查對應使用session當中的save、delete、update、get/load方法.6.單表操作,查詢一條記錄時,get和load的區別?
答:get在使用的時候立即發送sql語句,並且獲得的是實體類的對象類型,而load只有在使用具體對象的非主鍵屬性的時候纔會發送sql語句,而且返回的是一個代理對象。