Hibernate初學總結

1.搭建環境

1.1導入jar包(數據庫爲sqlserver)

1.2配置文件:名稱統一爲hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 配置session工廠 -->
<session-factory>
<!-- 用戶名和密碼 -->
<property name="hibernate.connection.password">****</property>
<property name="hibernate.connection.username">sa</property>
<!-- 配置數據庫驅動 -->
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<!-- 數據庫的連接 -->
<property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=heimashop</property>
<!-- 方言 (連接的是哪一個數據庫產品-->
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<!-- 後 臺輸出sql語句-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>

<!-- hibernate 隔離級別 -->
<property name="hibernate.connection.isolation">4</property>
指定session與當前線程綁定
<property name="hibernate.current_session_context_class">thread</property>
<!-- 生成數據表的方式-->
<property name="hibernate.hbm2ddl.auto">update</property> 
<!-- 添加orm文件:映射類對象 -->
<mapping  resource="cn/itheima/domain/Customer.hbm.xml"/>
</session-factory>

1.3創建實體類

public class Customer {
	private Long cust_id;
	private String cust_name;
	private String cust_source;
	public Long getCust_id() {
		return cust_id;
	}
	public void setCust_id(Long cust_id) {
		this.cust_id = cust_id;
	}
	public String getCust_name() {
		return cust_name;
	}
	public void setCust_name(String cust_name) {
		this.cust_name = cust_name;
	}
	public String getCust_source() {
		return cust_source;
	}
	public void setCust_source(String cust_source) {
		this.cust_source = cust_source;
	}
	public String getCust_industry() {
		return cust_industry;
	}
	public void setCust_industry(String cust_industry) {
		this.cust_industry = cust_industry;
	}
	public String getCust_level() {
		return cust_level;
	}
	public void setCust_level(String cust_level) {
		this.cust_level = cust_level;
	}
	public String getCust_phone() {
		return cust_phone;
	}
	public void setCust_phone(String cust_phone) {
		this.cust_phone = cust_phone;
	}
	public String getCust_mobile() {
		return cust_mobile;
	}
	public void setCust_mobile(String cust_mobile) {
		this.cust_mobile = cust_mobile;
	}
	private String cust_industry;
	private String cust_level;
	private String cust_phone;
	private String cust_mobile;

1.4創建orm映射文件<文件名稱與Customer類對應:Customer.hbm.xml>

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
   <!-- 配置表與實體對象的關係 -->
   <!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. -->
   <hibernate-mapping package="cn.itheima.domain">
   <!-- 
		class元素: 配置實體與表的對應關係的
			name: 完整類名
			table:數據庫表名
	 -->
   <class name="Customer" table="cus_customer">
   <!-- id元素:配置主鍵映射的屬性
				name: 填寫主鍵對應屬性名
				column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名
				type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
						每個類型有三種填法: java類型|hibernate類型|數據庫類型
				not-null(可選):配置該屬性(列)是否不能爲空. 默認值:false
				length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
		 -->
   <id name="cust_id">
   <!-- generator:主鍵生成策略 -->
   <generator class="native"></generator>
   </id>
   <!-- property元素:除id之外的普通屬性映射
				name: 填寫屬性名
				column(可選): 填寫列名
				type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
						每個類型有三種填法: java類型|hibernate類型|數據庫類型
				not-null(可選):配置該屬性(列)是否不能爲空. 默認值:false
				length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
		 -->
   <property name="cust_name" column="cust_name"></property>
	<property name="cust_source" column="cust_source"></property>
	<property name="cust_industry" column="cust_industry"></property>
	<property name="cust_level" column="cust_level"></property>
	
	<property name="cust_phone" column="cust_phone"></property>
	<property name="cust_mobile" column="cust_mobile"></property>
	</class>
   </hibernate-mapping>

1.5創建工具類

public class HibernateUtils {
	//創建配置對象,用於讀取hibernate配置文件
	private static SessionFactory sf=null;
	//1.使用Configuration讀取配置文件,默認讀取的是src下一個叫做hibernate.cfg.xml的文件
	static{
		 Configuration conf=new Configuration().configure();
			//2.創建SessionFactory
		 sf = conf.buildSessionFactory();
	}
	/**
	 * 提供獲取session方法,重新生成一個session
	 */

  public static Session openSession(){
	  Session session = sf.openSession();
	  return session;
	  
  };
/**
	 * 獲取當前線程的session,
	 */
public static Session getCurrentSession(){
	  
	  Session session = sf.getCurrentSession();
	  return session;
  };

2.基本操作

1.save

public static void main(String[] args) {
        //獲得session,,打開一個新的session對象
		//session用於hibernate操作數據庫核心對象
		Session session = HibernateUtils.openSession();
		//.session獲得操作事務的Transaction對象,此爲獲得一個事務對象並開啓事務
		Transaction ts=session.beginTransaction();
	    Customer cus=new Customer();//沒有id,沒有與session有關聯=》瞬時狀態
		cus.setCust_name("旺達");瞬時狀態
		session.save(cus);//保存
                ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
}

2.get方法和load方法

	/**
		 * 查詢 -- 根據主鍵查詢  get load
		 * 1.get方法
		 * 作用:
		 * 		根據主鍵查詢數據
		 * 用法:
		 * 		兩個參數
		 * 		第一個參數是class類型,要查詢哪一個表,就寫哪一個表對應的實體類的class類型
		 * 		第二個參數是一個實現了序列化接口的對象,可以傳遞一數字
		 * 2.load方法
		 * 作用:
		 * 	          根據主鍵查詢數據
		 * 用法:與get一模一樣
		 * get是即時加載
		 * load是延遲加載  -- 動態代理,生成了實體類的代理對象(javassist-3.20.0-GA.jar)
		 */
	@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		//Customer customer = session.get(Customer.class, 1l);
		//System.out.println(customer);
		Customer customer=session.load(Customer.class, 1l);
		System.out.println(customer);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

3.delete

public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		//Customer customer = session.get(Customer.class, 1l);
		//System.out.println(customer);
		Customer customer=session.get(Customer.class, 1l);
		session.delete(customer);
		//System.out.println(customer);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}
3.Hql基本語法

3.1查詢所有

/**
		*HQL Hibernate Query 語言
	    * 1.HQL操作的都是java類,而不是表
		*2.在HQL中查詢所有,直接寫 from 實體類的名,不寫select *
		*
		 */
	@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		String sql="from Customer";
		Query c = session.createQuery(sql);
		List<Customer> list = c.list();
		System.out.println(list);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

3.2帶條件查詢

/**
		*HQL Hibernate Query 語言
	    * c.setParameter()第一個問號是從0開始算起
		*
		 */
	@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		String sql="from Customer where cust_name=?";
		Query c = session.createQuery(sql);
		c.setParameter(0, "百度");
		List<Customer> list=c.list();
		System.out.println(list);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

3.3分頁查詢

@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		String sql="from Customer ";
		Query c = session.createQuery(sql);
		c.setFirstResult(1);//設置開始查詢位置
		c.setMaxResults(2);//一次查詢多少條數據
		List<Customer> list=c.list();
		System.out.println(list);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

3.4聚合函數

/**
	 * 聚合函數
	 * 統計年齡大於18歲的有多少人
	 * 如果能夠保證查詢結果只有一條數據的話,那麼可以使用uniqueResult方法,查詢結果如果多於1條記錄,那麼就會報錯
	 * 可以使用uniqueResult根據主鍵進行查詢
	 * 如果查詢某幾個列,那麼返回的是一個Object數組,數組中保存的是每個列的值
	 */
	@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		String sql="select count(cust_id) from Customer ";
		Query c = session.createQuery(sql);
		Object[] result =(Object[]) c.uniqueResult();
		//List<Object[]> list=c.list();
		System.out.println(result[0]);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

4.Critetia查詢

/**
	 * Criteria -- 只能用於查詢
	 * 添加查詢條件
	 * 使用criteria.add
	 * 括號中Restrictions.方法來進行條件查詢條件
	 * 如:Restrictions.eq(propertyName, value)
	 * 第一個參數:根據哪個字段進行查詢(實體類中的屬性名)
	 * 第二個參數:查詢時的參數值
	 * select * from employee where emp_name = '張三'
	 * 常用:
	 * 		eq 代表相等 =
	 * 		lt 代表小於 <
	 * 		le 代表小於等於 <=
	 * 		gt 代表大於 >
	 * 		ge 代表大於等於 >=
	 * 		ne 代表了不等於 !=  ,   <>
	 * 		between 代表了區間 
	 * 		like 代表模糊查詢
	 * 		
	 */
	@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		Criteria c = session.createCriteria(Customer.class);
		c.add(Restrictions.eq("cust_id",1l));
		c.add(Restrictions.lt("cust_age", 15));
		List<Customer> list=c.list();
		System.out.println(list);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

5.原生sql查詢,(複雜多表查詢推薦使用)

@Test
	public void test(){
		Session session = HibernateUtils.openSession();
		Transaction ts=session.beginTransaction();
		String sql="select * from cus_customer";
		SQLQuery c = session.createSQLQuery(sql);
		//如果需要將查詢結果進行映射
		c.addEntity(Customer.class);
		List<Customer> list=c.list();
		System.out.println(list);
		ts.commit();//提交事務
		//ts.rollback();//回滾事務
		session.close();//釋放資源--遊離狀態
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章