IDEA 使用 hibernate

1. 添加 hibernate 依賴

打開項目結構
n5tWZj.png
選擇模塊選項卡
n5t2LQ.png

添加 hibernate 依賴
n5tgsg.png

添加配置文件,如果已經有配置文件可以直接選擇該文件,沒有也可以直接新建一個:
n5tcQS.png
n5tsRf.png
新建完後默認配置文件如下:
n5tyz8.png

2. 完成配置文件

配置文件的一個例子,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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

	<session-factory>
    <!-- 數據庫方言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- MySql數據庫連接 -->
		<property name="connection.url">jdbc:mysql://47.102.200.22:3306/jboa_tesst</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 連接自動提交 -->
		<property name="hibernate.connection.autocommit">true</property>
		<!-- 顯示hibernate持久層操作,即sql語句 -->
        <property name="show_sql">true</property>
        <!-- 將sql語句格式化 -->
		<property name="format_sql">true</property>
        <!-- 自定義的CacheProvider的類名 -->
		<property name="cache.provider_class">
			org.hibernate.cache.EhCacheProvider
		</property>
        <!-- 使用二級緩存. -->
		<property name="cache.use_second_level_cache">true</property>
        <!-- 允許查詢緩存, -->
		<property name="cache.use_query_cache">true</property>

		<mapping resource="entity/BizCheckResult.hbm.xml" />
		<mapping resource="entity/BizClaimVoucher.hbm.xml" />
	</session-factory>
</hibernate-configuration>

3. IDEA 連接數據庫

打開數據庫工具窗口:
n5tDit.png
添加數據庫:
n5t0II.png
設置數據庫驅動:
n5twdA.png
Driver files 中添加數據庫驅動包,可以選擇本地的也可以 IDEA 直接從網上下載,版本注意對應。

添加數據庫連接:
n5tGRK.md.png
n5tJxO.md.png
測試連接:
n5ttMD.md.png

4. 反向生成實體類

打開左下角的 Persistence 選項卡(添加hibernate依賴後就會出現):
n5Ua4I.png

右鍵項目的 hibernate,選擇最後一個生成映射文件:
n5trJP.png
生成實體類:
n5tdZd.png

5. 操作實例:

數據庫如下:
n5tNse.png
代碼如下:

	@Test
	public void test() {
		//加載hibernate配置信息   實例化session工廠
		Configuration configuration = null;
		SessionFactory sessionFactory = null;
		//持久層所有操作都需要session
		Session session = null;
		try {
			//configure  默認會去加載   src目錄下名爲hibernate.cfg.cml的配置件
			sessionFactory = new Configuration().configure().buildSessionFactory();
			session = sessionFactory.openSession();
			//get和load都是根據主鍵(ID)去查詢,  都是先從緩存中抓取, 如果沒有再去數據庫查詢
			//get 是直接從數據庫中查詢, 查詢不到返回NULL
			//load 是從數據庫中查詢出來一個auction的代理類對象, 如果不使用這個對象就不會數據庫中查詢
			Auction auction = (Auction) session.get(Auction.class, 7);
			Auction auction2 = (Auction) session.load(Auction.class, 7);
			System.out.println(auction2);
			System.out.println(auction.getAuctionName());
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(null != session){
				session.close();
			}
		}
	}
  • 增刪改
@Test
public void test01(){
	//crud
	SessionFactory sessionFactory = null;
	Session session = null;
	Transaction transaction = null;
	try {
		sessionFactory = new Configuration().configure().buildSessionFactory();
		session = sessionFactory.openSession();
		//hibernate 他的添加修改刪除都是純粹的面向對象的思想
		//添加的話    必須要知道   主鍵策略
		//native根據不同的數據庫採用不同的主鍵生成策略  比如mysql  就是主鍵自增長
		//									oracle  就是序列自增長
		//assigned 開發人員手動給主鍵
		//數據庫中的增刪改一定是在事務中完成的
		transaction = session.beginTransaction();
		Auction auction = new Auction();
		auction.setAuctionID(281);
		//session.save(auction);
		//新增(注意你的 主鍵策略)
		//session.sava(auction);
		//修改  (注意實體類的ID必須有值)
		//session.update(auction);
		//刪除 (注意實體類的ID必須有值, 且有ID就可以了)
		session.delete(auction);
		transaction.commit();
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
		if(null != session){
			session.close();
		}
	}
}
  • HQL 語句:
	//HQL 兩個特徵
//HQL 是一個半SQL   半面向對象的  數據庫查詢語句
//HQL  他是跨平臺的查詢語句(不管是什麼數據庫hql都可以執行, 寫法都一樣)
@Test
public void test03(){
	SessionFactory sessionFactory = null;
	Session session = null;

	try {
		sessionFactory = new Configuration().configure().buildSessionFactory();
		session = sessionFactory.openSession();
		//查詢所有的拍賣品
		//如果查詢部分字段  使用投影查詢  (用的不多)
		//寫HQL  需要注意一點HQL的思想實際是  OOP 的 思想, 只是他的寫法還是偏向SQL的寫法
		//Auction一定要是 我們的實體類

		//查詢所有商品

//			List<Auction> auctions = session.createQuery("from Auction").list();
//			for (Auction auction : auctions) {
//				System.out.println(auction);
//			}

		//投影查詢

		//username和userpassword必須是AuctionUser中的屬性名
		//hibernate 的佔位符是從0開始
		//uniqueResult 返回唯一的結果, 如果數據大於一條  就報錯

//			AuctionUser auctionUser = (AuctionUser)session.createQuery("from AuctionUser as atus where atus.userName=? and atus.userPassWord=?")
//			.setString(0, "test1").setString(1, "202cb962ac59075b964b07152d234b70")
//			.uniqueResult();
//			System.out.println(auctionUser);
//
		//HQL 使用聚合函數
//			List<Object> objects = session.createQuery("select count(*),max(auctionStartPrice)," +
//					"min(auctionStartPrice),sum(auctionStartPrice),avg(auctionStartPrice)" +
//					" from Auction").list();
//			Object[] objects2 = (Object[]) objects.get(0);
//			for (Object object : objects2) {
//				System.out.println(object);
//			}

		//HQL 實現分頁
		//功能和limit一樣
//			List<Auction> auctions = session.createQuery("from Auction order by auctionStartPrice DESC").setFirstResult(0).setMaxResults(10).list();
//			for (Auction auction : auctions) {
//				System.out.println(auction);
//			}

		//動態查詢
		String auctionName = "周";
		String auctionStartTime = "";
		String auctionEndTime = "";
		String auctionStartPrice = "";
		StringBuilder hql = new StringBuilder("from Auction as at where 1=1 ");
		Auction auction = new Auction();
		if(auctionName != null && !auctionName.equals("")){
			//:auctionName 指的  按佔位符綁定
			//hibernate 有兩種佔位符, 一個是? 一個是:對應的屬性名 (動態查詢用的就是第二個)
			hql.append("and at.auctionName like :auctionName ");
			auction.setAuctionName(auctionName+"%");
		}
		if(auctionStartTime != null && !auctionStartTime.equals("")){
			hql.append("and at.auctionStartTime>=:auctionStartTime ");
			auction.setAuctionStartTime(Timestamp.valueOf(auctionStartTime));
		}
		if(auctionEndTime != null && !auctionEndTime.equals("")){
			hql.append("and at.auctionEndTime>=:auctionEndTime ");
			auction.setAuctionEndTime(Timestamp.valueOf(auctionEndTime));
		}
		if(auctionStartPrice != null && !auctionStartPrice.equals("")){
			hql.append("and at.auctionStartPrice<=:auctionStartPrice ");
			auction.setAuctionStartPrice(Double.valueOf(auctionStartPrice));
		}
		//HQL = from Auction as at and at.auctionName like :auctionName
		//:auctionName 這個佔位符會去下面的auction中找對應的屬性並自動賦值
		List<Auction> auctions = session.createQuery(hql.toString()).setProperties(auction).list();
		for (Auction auction2 : auctions) {
			System.out.println(auction2);
		}
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
	}finally{
		if(null != session){
			session.close();
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章