一、配置文件(設置隔離級別和配置使用getCurrentSession)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"hibernate.cfg.xml">
<!--hibernate 配置的跟標籤 -->
<hibernate-configuration>
<!--sessionFactory(會話工廠)相當於,數據庫連接池 -->
<session-factory>
<!--加載數據庫的驅動類 ,基礎設置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/a_hibernate_01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--hibernate方言 mysql方言 limit -->
<!--配置使用哪個類,全類名 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--在控制檯輸出sql語句 -->
<property name="hibernate.show_sql">true</property>
<!--美化sql語句 -->
<property name="hibernate.format_sql">true</property>
<!--hbm2ddl.auto是否自動生成表結構 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
通過hibernate來設置事物的隔離級別
這個事物的隔離級別設置
1.髒讀
2.可重複讀
3.幻讀
READ UNCOMMITTED 讀未提交 123 1
READ COMMITTED 讀已提交 23 2
REPEATABLE READ 可重複讀 3 4
SERIALIZABLE 串行化(只能一個一個訪問) 8
設置事物的隔離級別(etc裏面找到
specify a JDBC isolation level
hibernate.connection.isolation 1|2|4|8
隔離級別是用一個字節存儲的
0001 1
0010 2
0100 4
1000 8
-->
<property name="hibernate.connection.isolation">4</property>
<!--使用getCurrentSession必須配置一下
注意:當你使用getCurrentSession時
不需要你手動關閉session,系統會幫你關閉
-->
<property name="hibernate.current_session_context_class">thread</property>
<!--注意:映射實體類 全文件名 從包名開始 -->
<!--讓配置文件知道有你這個實體類 與映射文件進行關聯配置 -->
<mapping resource="com/lanou3g/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
二、映射文件(主鍵生成策略有7個)
1.indentity:主鍵自增,有數據庫維護
2.increment:主鍵自增,有hibernate維護,會先查詢最大id,然後
在這個最大id的基礎上+1,並且插入數據時有id
3.sequence:序列-Oracle
4.hilo:高低位算法,通過hibernate會自己通過該算法,算出主鍵自增
5.native(常用):hilo + indentity + sequence 三選一
6.uuid:全球範圍內,不重複的值,是字符串。
注意:主鍵是字符串類型,是由hibernate生成uuid,然後插入到數據庫中的
7.assigned:是由程序員自己管理主鍵
<?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">
<!-- 讓實體類 與 數據庫中的表建立起關係(字段與屬性建立關係) -->
<!--package可以添加包名,添加後,底下可以省略包名 -->
<hibernate-mapping package="com.lanou3g">
<!--全類名 -->
<class name="User" table="user">
<!-- 設置主鍵關聯,注意:表中必須要有主鍵 -->
<id name="id" column="id">
<!--這裏就是天蠍主鍵生成策略的地方-->
<generator class="native"></generator>
</id>
<!--配置非主鍵屬性 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<!--注意:寫完映射文件需和配置文件進行關聯 -->
</class>
</hibernate-mapping>
三、hibernate中的三種狀態
1.遊離態:沒有id,沒有和session產生關聯
2.持久態:有id,有和session產生關聯
3.遊離態:有id,沒有和session產生關聯
//hibernate的三種形態
public void fun2() {
//獲取session
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
User user = new User(); //瞬時態,沒有id,沒有和session關聯
user.setUsername("wanglong");
user.setPassword("123");
session.save(user); //持久態,有id,有session關聯
transaction.commit();
session.close(); //遊離態,有id,沒有關聯
}
解析:這裏我們獲取數據庫中數據,當我們第一次get的時候,會生成查詢語句,
獲取查詢的數據,然後在向hibernate返回結果集,並且將
結果集封裝成對象,保存在緩存中,當我們再次調用get時,這時我們會去緩存中查看是否有這個id的對象,
有的話,就不生成sql查詢語句,
沒有的話就生成sql查詢語句。
注:在這個方法執行內,所有的返回到hibernate的結果集都會保存在緩存中。
public void fun3() {
//獲取session
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//---------
/*
* 測試一下hibernate中的緩存
*
*/
User user1 = session.get(User.class, 1);
User user2 = session.get(User.class, 1);
User user3 = session.get(User.class, 1);
User user4 = session.get(User.class, 1);
User user5 = session.get(User.class, 1);
//1.生成幾條sql語句
//2.打印結果
System.out.println(user2==user5);
//----------
transaction.commit();
session.close();
}
快照測試:
解析:這裏我們兩次設置usernaeme,第二個dp是數據庫中id爲1存在的,但是沒有更新數據庫的sql語句打印
是因爲當我們第一個get的時候返回的結果集封裝成對象到hibernate中,並且分別保存到緩存中和保存到快照中,在我們去set修改的時候,第一次修改我們修改了緩存中的對象,也就是將dp變成了haha,然後我們再繼續執行set又將haha變成了dp,set語句執行完畢,當事物進行提交後,就會與快照裏面的對象進行比對:
有:就不做修改的sql語句生成
沒有:就生成更新的sql語句
public void fun4() {
//獲取session
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//---------
User user = session.get(User.class, 1);
user.setUsername("haha");
user.setUsername("dp");
session.update(user);
//----------
transaction.commit();
session.close();
}
四、查詢測試
1.HQL查詢測試:session調用createQuery();方法,在用該方法的返回對象去調用預見結果的方法
這個預見方法分爲兩種
a):uniqueResult()--這個是預見但數據結果的方法
b):list()--這個是預見多數據結果的方法
public void fun1() {
String hql ="From User";
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery(hql);
//------------
//預見一下結果(單數據)
// User user = (User)query.uniqueResult();
List list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
2.佔位符 ?
解析:我們用createQuery()的返回對象去調用setParamenter(1,2)方法,
裏面的參數1:我們填寫的是索引(也就是從左到右第一個問號索引是0,第二個是1。。。。)
參數2:我們填寫的是對應的值
public void fun2() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
String hql = "from User where id = ? and username = ?";
Query query = session.createQuery(hql);
//給語句中問號賦值,索引從0開始
query.setParameter(0, 1);
query.setParameter(1, "wanglong");
User user = (User)query.uniqueResult();
System.out.println(user);
//----------
transaction.commit();
session.close();
}
3.冒號佔位符 :
public void fun3() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
//冒號後面相當於,給這個冒號佔位符,起了個別名
//注意:冒號後面不要搞空格
String hql = "from User where id =:ww";
Query query = session.createQuery(hql);
//直接使用別名,給佔位符賦值
User user = (User)query.setParameter("ww",1);
System.out.println(user);
//----------
transaction.commit();
session.close();
}
4. 分頁查詢
@Test
public void fun4() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
String hql = "from User";
Query query = session.createQuery(hql);
//設置起始和最大顯示
query.setFirstResult(2);
query.setMaxResults(2);
//接受結果
List list = query.list();
System.out.println(list);
//----------
transaction.commit();
session.close();
}
5.無語局查詢
public void fun5() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
Criteria criteria = session.createCriteria(User.class);
List list = criteria.list();
System.out.println(list);
//----------
transaction.commit();
session.close();
}
7.查詢一共有多少記錄數
public void fun7() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.rowCount());
//一般返回值是個數的通常都是用大Long來接收
Long l =(Long) criteria.uniqueResult();
System.out.println(l);
//----------
transaction.commit();
session.close();
}
8.原生sql語句查詢
注意:返回的結果跟對象沒有關係
public void fun8() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//------------
String sql = "select * from user where id = ?";
Query query = session.createSQLQuery(sql);
//一條記錄就是一個Object數組
query.setParameter(0, 3);
Object [] objects = (Object[])query.uniqueResult();
System.out.println(Arrays.toString(objects));
// List<Object[]> list = query.list();
// for (Object[] objects : list) {
// System.out.println(Arrays.toString(objects));
// }
//----------
transaction.commit();
session.close();
}