1. 添加 hibernate 依賴
打開項目結構
選擇模塊選項卡
添加 hibernate 依賴
添加配置文件,如果已經有配置文件可以直接選擇該文件,沒有也可以直接新建一個:
新建完後默認配置文件如下:
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 連接數據庫
打開數據庫工具窗口:
添加數據庫:
設置數據庫驅動:
Driver files 中添加數據庫驅動包,可以選擇本地的也可以 IDEA 直接從網上下載,版本注意對應。
4. 反向生成實體類
打開左下角的 Persistence 選項卡(添加hibernate依賴後就會出現):
右鍵項目的 hibernate,選擇最後一個生成映射文件:
生成實體類:
5. 操作實例:
數據庫如下:
代碼如下:
- 查
@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();
}
}
}