05.Hibernate中的關聯關系映射,物件查詢,二級快取
1、關聯關系映射
同表
組件配置
不同表
一對一關聯映射
多對一
一對多
多對多
2、物件查詢
OID
get:
load:
HQL(面向物件的查詢陳述句)
條件查詢
投影查詢(只查詢結果中的部分內容)
不封裝物件
封裝物件
分頁查詢
setFirstReult:查詢的起始位置
setMaxResult:查詢的內容數量
連接查詢
迫切
因為結果數量對標了普通查詢結果,所以需要去重復
非迫切
行內、左外連接、右外連接、全連接、交叉鏈接
報表查詢(GROUP BY HAVING ,SUM,AVG,MAX,MIN,COUNT)
動態SQL
QBC
標準化查詢
本地SQL
執行批量操作
使用HQL的步驟
1、創建Query物件
2、呼叫Query的方法
3、二級快取(當Session被關閉之后,仍然快取在SessionFactory中)
Session快取
SessionFactory快取
兩塊
內置快取
不是我們要操作的內容,里面存放了大量Hibernate的配置資訊
外置快取
默認處于關閉狀態
適合存放的內容
頻繁的被讀取的內容,少有被修改的
允許并發的資料
Hibernate提供并發訪問策略
Nonstrict-read-write:非嚴格的讀寫,對應READ UNCOMMITTED
Read-write:讀寫,對應READ COMMITTED
Transaction:事務,對應REPEATABLE READ
Read-only:只讀,對應SERIALIZABLE
可配置的快取插件
EHCache:
OpenSymphony OSCache,SwarmCache,JBossCache
配置二級快取
加入jar包:hibernate-release-5.4.22.Final\lib\optional\ehcache
加入EHCache組態檔:hibernate-release-5.4.22.Final\project\etc
開啟Hibernate外置二級快取的支持:
<propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
設定哪些內容加入二級快取:<class-cache usage="快取策略" class="被快取的類"/>
4、session與執行緒系結
案例
案例1:多對一(一對多)
匯入相應的jar包
創建物體類
創建一個班級類ClassInfo.java
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class ClassInfo {
private Integer class_id;
private String class_name;
private String class_address;
private String class_manager;
// 關聯關系配置在一段(一對多,資料庫中怎么記錄跟我們沒有關系)
private Set<StuInfo> stuInfos = new HashSet<StuInfo>();//初始化集合
public Integer getClass_id() {
return class_id;
}
public void setClass_id(Integer class_id) {
this.class_id = class_id;
}
public String getClass_name() {
return class_name;
}
public void setClass_name(String class_name) {
this.class_name = class_name;
}
public String getClass_address() {
return class_address;
}
public void setClass_address(String class_address) {
this.class_address = class_address;
}
public String getClass_manager() {
return class_manager;
}
public void setClass_manager(String class_manager) {
this.class_manager = class_manager;
}
public Set<StuInfo> getStuInfos() {
return stuInfos;
}
public void setStuInfos(Set<StuInfo> stuInfos) {
this.stuInfos = stuInfos;
}
public ClassInfo() {
super();
}
@Override
public String toString() {
return "ClassInfo [class_id=" + class_id + ", class_name=" + class_name + ", class_address=" + class_address
+ ", class_manager=" + class_manager + ", classId=" + stuInfos + "]";
}
}
創建一個學生類StuInfo.java
package com.zb.entity;
public class StuInfo {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Integer class_id;
// 關聯關系保存在多的一端(多對一)
//private ClassInfo classInfo;
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
/*
public ClassInfo getClassInfo() {
return classInfo;
}
public void setClassInfo(ClassInfo classInfo) {
this.classInfo = classInfo;
}
public StuInfo(String stu_name, String stu_sex, Integer stu_age, ClassInfo classInfo) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
this.stu_age = stu_age;
this.classInfo = classInfo;
}
*/
public Integer getClass_id() {
return class_id;
}
public StuInfo(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public void setClass_id(Integer class_id) {
this.class_id = class_id;
}
public StuInfo() {
super();
}
/*
@Override
public String toString() {
return "StuInfo [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_sex=" + stu_sex + ", stu_age=" + stu_age
+ ", classInfo=" + classInfo + "]";
}
*/
}
配置全域cfg.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 資料庫連接 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8</property>
<!-- 資料庫方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<!-- 列印SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 表生成策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入映射 -->
<mapping resource="class-mapping.hbm.xml"/>
<mapping resource="stu-mapping.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置hbm.xml檔案
stu-mapping.hbm.xml
<?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">
<hibernate-mapping>
<class name="com.zb.entity.StuInfo" table="stu_info">
<id name="stu_id" column="stu_id">
<generator class="native"></generator>
</id>
<property name="stu_name" column="stu_name"></property>
<property name="stu_sex" column="stu_sex"></property>
<property name="stu_age" column="stu_age"></property>
<property name="class_id" column="class_id"></property>
<!--
關聯關系映射
name:關聯的屬性名稱
class:關聯的屬性型別
column:關聯的列名
-->
<!-- 多對一 -->
<!-- <many-to-one name="classInfo" class="com.zb.entity.ClassInfo" column="class_id"></many-to-one> -->
</class>
</hibernate-mapping>
class-mapping.hbm.xml
<?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">
<hibernate-mapping>
<class name="com.zb.entity.ClassInfo" table="class_info">
<id name="class_id" column="class_id">
<generator class="native"></generator>
</id>
<property name="class_name" column="class_name"></property>
<property name="class_address" column="class_address"></property>
<property name="class_manager" column="class_manager"></property>
<!--
配置集合(Set-><set>;List-><list>)
name:集合的名稱
table:關聯的表的表名
-->
<set name="stuInfos" table="stu_info">
<!--
配置集合對應的
column:多端關聯的一端的列名
-->
<key column="class_id"/>
<!--
集合元素的型別,多端全類名
-->
<one-to-many class="com.zb.entity.StuInfo"/>
</set>
</class>
</hibernate-mapping>
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
//多對一
@Test
public void testMethod01() {
List<StuInfo> listStuInfos = new ArrayList<StuInfo>();
listStuInfos.add(session.get(StuInfo.class, 1));
listStuInfos.add(session.get(StuInfo.class, 2));
listStuInfos.add(session.get(StuInfo.class, 3));
listStuInfos.add(session.get(StuInfo.class, 4));
listStuInfos.add(session.get(StuInfo.class, 5));
listStuInfos.add(session.get(StuInfo.class, 6));
System.out.println(listStuInfos);
}
//一對多
@Test
public void testMethod02() {
ClassInfo ci1 = session.get(ClassInfo.class, 1);
ClassInfo ci2 = session.get(ClassInfo.class, 2);
System.out.println(ci1);
System.out.println(ci2);
}
}
案例2:多對多
匯入相應的jar包
創建物體類
創建學生類StuInfo2.java
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class StuInfo2 {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Set<CourseInfo> courseInfos = new HashSet<CourseInfo>();
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
public Set<CourseInfo> getCourseInfos() {
return courseInfos;
}
public void setCourseInfos(Set<CourseInfo> courseInfos) {
this.courseInfos = courseInfos;
}
public StuInfo2(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public StuInfo2() {
super();
}
@Override
public String toString() {
return "StuInfo2 [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_sex=" + stu_sex + ", stu_age=" + stu_age
+ ", courseInfos=" + courseInfos + "]";
}
}
創建課程物體類CourseInfo.java
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class CourseInfo {
private Integer course_id;
private String course_name;
private String course_tname;
private Set<StuInfo2> stuInfos = new HashSet<StuInfo2>();
public Integer getCourse_id() {
return course_id;
}
public void setCourse_id(Integer course_id) {
this.course_id = course_id;
}
public String getCourse_name() {
return course_name;
}
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
public String getCourse_tname() {
return course_tname;
}
public void setCourse_tname(String course_tname) {
this.course_tname = course_tname;
}
public Set<StuInfo2> getStuInfos() {
return stuInfos;
}
public void setStuInfos(Set<StuInfo2> stuInfos) {
this.stuInfos = stuInfos;
}
/*
@Override
public String toString() {
return "CourseInfo [course_id=" + course_id + ", course_name=" + course_name + ", course_tname=" + course_tname
+ ", stuInfos=" + stuInfos + "]";
}
*/
}
配置全域cfg.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 資料庫連接 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8</property>
<!-- 資料庫方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<!-- 列印SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 表生成策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入映射 -->
<mapping resource="stu2-mapping.hbm.xml"/>
<mapping resource="course-mapping.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置hbm.xml檔案
stu2-mapping.hbm.xml
<?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">
<hibernate-mapping>
<class name="com.zb.entity.StuInfo2" table="stu_info2">
<id name="stu_id" column="stu_id">
<generator class="native"></generator>
</id>
<property name="stu_name" column="stu_name"></property>
<property name="stu_sex" column="stu_sex"></property>
<property name="stu_age" column="stu_age"></property>
<set name="courseInfos" table="stu_course_info">
<!-- 我們提供給中間表的關聯列 -->
<key column="stu_id"/>
<!-- 我們關聯的中間表的關聯列 -->
<many-to-many class="com.zb.entity.CourseInfo" column="course_id"/>
</set>
</class>
</hibernate-mapping>
course-mapping.hbm.xml
<?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">
<hibernate-mapping>
<class name="com.zb.entity.CourseInfo" table="course_info">
<id name="course_id" column="course_id">
<generator class="native"></generator>
</id>
<property name="course_name" column="course_name"></property>
<property name="course_tname" column="course_tname"></property>
<!--
對多的映射關系
name:集合名稱
table:因為兩邊都不是直接關聯的,依賴的是中間表,所以此處寫中間表的表名
-->
<set name="stuInfos" table="stu_course_info">
<key column="course_id"/>
<many-to-many class="com.zb.entity.StuInfo2" column="stu_id"/>
</set>
</class>
</hibernate-mapping>
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
@Test
public void testMethod03() {
StuInfo2 si1 = session.get(StuInfo2.class, 2);
for(CourseInfo ci : si1.getCourseInfos()) {
System.out.println(ci.getCourse_name());
}
System.out.println(si1);
}
}
案例3:HQL(面向物件的查詢陳述句)
創建物體類
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class StuInfo2 {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Set<CourseInfo> courseInfos = new HashSet<CourseInfo>();
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
public Set<CourseInfo> getCourseInfos() {
return courseInfos;
}
public void setCourseInfos(Set<CourseInfo> courseInfos) {
this.courseInfos = courseInfos;
}
public StuInfo2(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public StuInfo2() {
super();
}
@Override
public String toString() {
return "StuInfo2 [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_sex=" + stu_sex + ", stu_age=" + stu_age
+ ", courseInfos=" + courseInfos + "]";
}
}
package com.zb.entity;
public class NameAndSex {
private String stu_name;
private String stu_sex;
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public NameAndSex() {
super();
}
public NameAndSex(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
@Override
public String toString() {
return "NameAndSex [name=" + stu_name + ", sex=" + stu_sex + "]";
}
}
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
@Test
public void testMethod04() {
//創建HQL陳述句,它與SQL陳述句幾乎相同,將其中的表名替換成對應的類名,列名替換為欄位名
String hql = " FROM StuInfo2 ";
//創建Query物件
Query query = session.createQuery(hql);
//執行查詢方法getResultList/list:查詢一個list型別的結果
List<StuInfo2> sis = query.getResultList();
System.out.println(sis);
}
@Test
public void testMethod05() {
//創建HQL陳述句,它與SQL陳述句幾乎相同,將其中的表名替換成對應的類名,列名替換為欄位名
String hql = " FROM StuInfo2 WHERE stu_age IN (15,18) ";
//創建Query物件
Query query = session.createQuery(hql);
//執行查詢方法getResultList/list:查詢一個list型別的結果
List<StuInfo2> sis = query.getResultList();
for(StuInfo2 si : sis) {
System.out.println(si.getStu_name());
}
}
@Test
public void testMethod06() {
//創建HQL陳述句,它與SQL陳述句幾乎相同,將其中的表名替換成對應的類名,列名替換為欄位名
String hql = " FROM StuInfo2 WHERE stu_age IN (?0,?1) ";
//創建Query物件
Query query = session.createQuery(hql);
//如果有引數
query.setParameter(0, 16);
query.setParameter(1, 18);
//執行查詢方法getResultList/list:查詢一個list型別的結果
List<StuInfo2> sis = query.getResultList();
for(StuInfo2 si : sis) {
System.out.println(si.getStu_name());
}
}
@Test
public void testMethod07() {
//創建HQL陳述句,它與SQL陳述句幾乎相同,將其中的表名替換成對應的類名,列名替換為欄位名
String hql = " FROM StuInfo2 WHERE stu_sex = :sex ";
//創建Query物件
Query query = session.createQuery(hql);
//如果有引數
//query.setParameter(0, 16);
//query.setParameter(1, 18);
query.setParameter("sex", "女");
//執行查詢方法getResultList/list:查詢一個list型別的結果
List<StuInfo2> sis = query.getResultList();
for(StuInfo2 si : sis) {
System.out.println(si.getStu_name());
}
}
//條件查詢
@Test
public void testMethod08() {
//創建HQL陳述句,它與SQL陳述句幾乎相同,將其中的表名替換成對應的類名,列名替換為欄位名
String hql = " FROM StuInfo2 WHERE stu_sex = :sex AND stu_age = :age ";
//創建Query物件
Query query = session.createQuery(hql);
//如果有引數
query.setParameter("sex", "女");
query.setParameter("age", 18);
//執行查詢方法getResultList/list:查詢一個list型別的結果
List<StuInfo2> sis = query.getResultList();
for(StuInfo2 si : sis) {
System.out.println(si.getStu_name());
}
}
//條件查詢
@Test
public void testMethod09() {
List<StuInfo2> sis = session.createQuery(" FROM StuInfo2 WHERE stu_sex = :sex AND stu_age = :age ").
setParameter("sex", "女").
setParameter("age", 18).
getResultList();
for(StuInfo2 si : sis) {
System.out.println(si.getStu_name());
}
}
//投影查詢(只查詢結果中的部分內容)
@Test
public void testMethod10() {
List<Object[]> sis = session.createQuery(" SELECT stu_name,stu_sex FROM StuInfo2 ").
getResultList();
for(Object[] os : sis) {
System.out.println(Arrays.asList(os));
}
}
//投影查詢(只查詢結果中的部分內容)
@Test
public void testMethod11() {
List<StuInfo2> sis = session.createQuery(" SELECT new StuInfo2(stu_name,stu_sex) FROM StuInfo2 ").
getResultList();
for(StuInfo2 os : sis) {
System.out.println(os);
}
}
//投影查詢(只查詢結果中的部分內容)
@Test
public void testMethod12() {
List<NameAndSex> sis = session.createQuery(" SELECT new NameAndSex(stu_name,stu_sex) FROM StuInfo2 ").
getResultList();
for(NameAndSex os : sis) {
System.out.println(os);
}
}
}
案例4:HQL(分頁查詢)
創建物體類
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class StuInfo2 {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Set<CourseInfo> courseInfos = new HashSet<CourseInfo>();
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
public Set<CourseInfo> getCourseInfos() {
return courseInfos;
}
public void setCourseInfos(Set<CourseInfo> courseInfos) {
this.courseInfos = courseInfos;
}
public StuInfo2(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public StuInfo2() {
super();
}
@Override
public String toString() {
return "StuInfo2 [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_sex=" + stu_sex + ", stu_age=" + stu_age
+ ", courseInfos=" + courseInfos + "]";
}
}
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
@Test
public void testMethod13() {
List<StuInfo> sis = session.createQuery(" FROM StuInfo ").
setFirstResult(4).
setMaxResults(2).
getResultList();
for(StuInfo os : sis) {
System.out.println(os.getStu_name());
}
}
}
案例5:HQL連接查詢(迫切)
創建物體類
package com.zb.entity;
public class StuInfo {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Integer class_id;
// 關聯關系保存在多的一端(多對一)
//private ClassInfo classInfo;
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
/*
public ClassInfo getClassInfo() {
return classInfo;
}
public void setClassInfo(ClassInfo classInfo) {
this.classInfo = classInfo;
}
public StuInfo(String stu_name, String stu_sex, Integer stu_age, ClassInfo classInfo) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
this.stu_age = stu_age;
this.classInfo = classInfo;
}
*/
public Integer getClass_id() {
return class_id;
}
public StuInfo(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public void setClass_id(Integer class_id) {
this.class_id = class_id;
}
public StuInfo() {
super();
}
/*
@Override
public String toString() {
return "StuInfo [stu_id=" + stu_id + ", stu_name=" + stu_name + ", stu_sex=" + stu_sex + ", stu_age=" + stu_age
+ ", classInfo=" + classInfo + "]";
}
*/
}
package com.zb.entity;
import java.util.HashSet;
import java.util.Set;
public class ClassInfo {
private Integer class_id;
private String class_name;
private String class_address;
private String class_manager;
// 關聯關系配置在一段(一對多,資料庫中怎么記錄跟我們沒有關系)
private Set<StuInfo> stuInfos = new HashSet<StuInfo>();//初始化集合
public Integer getClass_id() {
return class_id;
}
public void setClass_id(Integer class_id) {
this.class_id = class_id;
}
public String getClass_name() {
return class_name;
}
public void setClass_name(String class_name) {
this.class_name = class_name;
}
public String getClass_address() {
return class_address;
}
public void setClass_address(String class_address) {
this.class_address = class_address;
}
public String getClass_manager() {
return class_manager;
}
public void setClass_manager(String class_manager) {
this.class_manager = class_manager;
}
public Set<StuInfo> getStuInfos() {
return stuInfos;
}
public void setStuInfos(Set<StuInfo> stuInfos) {
this.stuInfos = stuInfos;
}
public ClassInfo() {
super();
}
@Override
public String toString() {
return "ClassInfo [class_id=" + class_id + ", class_name=" + class_name + ", class_address=" + class_address
+ ", class_manager=" + class_manager + ", classId=" + stuInfos + "]";
}
}
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
//迫切查詢
@Test
public void testMethod14() {
//XXXX JOIN FETCH
List<Object[]> sis = session.createQuery(" SELECT SI.stu_name,SI.stu_sex,CI.class_name FROM StuInfo AS SI INNER JOIN ClassInfo AS CI ON SI.class_id = CI.class_id").
getResultList();
for(Object[] os : sis) {
System.out.println(Arrays.toString(os));
}
}
//報表查詢(GROUP BY HAVING ,SUM,AVG,MAX,MIN,COUNT)
@Test
public void testMethod15() {
Object[] sis = (Object[]) session.createQuery(" SELECT SUM(stu_age),AVG(stu_age) FROM StuInfo ").
getSingleResult();
for(Object os : sis) {
System.out.println(os);
}
}
//報表查詢
@Test
public void testMethod16() {
Object sis = session.createQuery(" SELECT SUM(stu_age) FROM StuInfo ").
getSingleResult();
System.out.println(sis);
}
//動態SQL
@Test
public void testMethod17() {
NativeQuery nq = session.createSQLQuery(" INSERT INTO stu_info VALUES (DEFAULT,'老李','女',15,1) ");
nq.executeUpdate();
}
}
案例6:二級快取的使用
配置二級快取 加入jar包:hibernate-release-5.4.22.Final\lib\optional\ehcache 加入EHCache組態檔:hibernate-release-5.4.22.Final\project\etc 開啟Hibernate外置二級快取的支持:<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property> 設定哪些內容加入二級快取:<class-cache usage="快取策略" class="被快取的類"/>
匯入二級快取相應的jar包
創建物體類
package com.zb.entity;
public class StuInfo {
private Integer stu_id;
private String stu_name;
private String stu_sex;
private Integer stu_age;
private Integer class_id;
public Integer getStu_id() {
return stu_id;
}
public void setStu_id(Integer stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public Integer getStu_age() {
return stu_age;
}
public void setStu_age(Integer stu_age) {
this.stu_age = stu_age;
}
public Integer getClass_id() {
return class_id;
}
public StuInfo(String stu_name, String stu_sex) {
super();
this.stu_name = stu_name;
this.stu_sex = stu_sex;
}
public void setClass_id(Integer class_id) {
this.class_id = class_id;
}
public StuInfo() {
super();
}
}
配置cfg.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 資料庫連接 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8</property>
<!-- 資料庫方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<!-- 列印SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 表生成策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 設定Hibernate使用的二級快取的快取插件(插件全類名) -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
<!-- 引入映射 -->
<mapping resource="stu-mapping.hbm.xml"/>
<!-- 設定要快取的類 有多個類需要設定二級快取方法同理,在class屬性寫上對應類的包名 -->
<class-cache usage="read-only" class="com.zb.entity.StuInfo"/>
<!-- 注意:class-cache標簽必須寫在映射檔案之后,否則會報錯. -->
</session-factory>
</hibernate-configuration>
配置hbm.xml檔案
<?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">
<hibernate-mapping>
<class name="com.zb.entity.StuInfo" table="stu_info">
<id name="stu_id" column="stu_id">
<generator class="native"></generator>
</id>
<property name="stu_name" column="stu_name"></property>
<property name="stu_sex" column="stu_sex"></property>
<property name="stu_age" column="stu_age"></property>
<property name="class_id" column="class_id"></property>
</class>
</hibernate-mapping>
ehcache.xml(匯入二級快取包會有此檔案)
<ehcache>
<!-- 當記憶體快取滿了,則保存到磁盤的目標位置 -->
<diskStore path="D://cache"/>
<!--
maxElementsInMemory:記憶體快取該物件的最大數量
eternal:快取的物件是否永久存在
timeToIdleSeconds:最大空閑時間s
timeToLiveSeconds:最大快取時間s
overflowToDisk:超出最大大小之后是否存放到磁盤中
-->
<defaultCache
maxElementsInMemory="2"
eternal="false"
timeToIdleSeconds="20"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
Test類
public class TestClass {
SessionFactory sessionFactory = null;
Session session = null;
Transaction t = null;
@Before
public void qianZhi() {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
session = sessionFactory.openSession();
t = session.beginTransaction();
System.out.println("----------程式開始----------");
}
@After
public void houZhi() {
t.commit();
session.close();
System.out.println("----------程式結束----------");
}
//測驗二級快取
@Test
public void testMethod18() {
StuInfo si1 = session.get(StuInfo.class, 1);
StuInfo si2 = session.get(StuInfo.class, 2);
StuInfo si3 = session.get(StuInfo.class, 3);
StuInfo si4 = session.get(StuInfo.class, 4);
StuInfo si5 = session.get(StuInfo.class, 5);
StuInfo si6 = session.get(StuInfo.class, 6);
StuInfo si7 = session.get(StuInfo.class, 7);
}
}
案例中使用到的資料庫
CREATE TABLE class_info
(
class_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
class_name VARCHAR(32) NOT NULL,
class_address VARCHAR(32) NOT NULL,
class_manager VARCHAR(32) NOT NULL
)
INSERT INTO class_info
VALUES
(DEFAULT,"Java53班","401","劉艷"),
(DEFAULT,"挖掘機1班","山東藍翔","挖掘機")
CREATE TABLE stu_info
(
stu_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
stu_name VARCHAR(32) NOT NULL,
stu_sex VARCHAR(32) NOT NULL,
stu_age INT NOT NULL,
class_id INT NOT NULL,
FOREIGN KEY (class_id) REFERENCES class_info(class_id)
)
INSERT INTO stu_info
VALUES
(DEFAULT,"小明","女",15,1),
(DEFAULT,"小黑","男",16,1),
(DEFAULT,"小白","女",18,1),
(DEFAULT,"老張","男",55,2),
(DEFAULT,"老王","女",66,2),
(DEFAULT,"老劉","男",88,2)
SELECT * FROM stu_info INNER JOIN class_info ON stu_info.class_id = class_info.class_id
CREATE TABLE course_info
(
course_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(32) NOT NULL,
course_tname VARCHAR(32) NOT NULL
)
INSERT INTO course_info
VALUES
(DEFAULT,"語文","語文老師"),
(DEFAULT,"數學","體育老師"),
(DEFAULT,"英語","美術老師")
CREATE TABLE stu_info2
(
stu_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
stu_name VARCHAR(32) NOT NULL,
stu_sex VARCHAR(32) NOT NULL,
stu_age INT NOT NULL
)
INSERT INTO stu_info2
VALUES
(DEFAULT,"小明","女",15),
(DEFAULT,"小黑","男",16),
(DEFAULT,"小白","女",18)
CREATE TABLE stu_course_info
(
stu_id INT NOT NULL,
course_id INT NOT NULL,
FOREIGN KEY (stu_id) REFERENCES stu_info2(stu_id),
FOREIGN KEY (course_id) REFERENCES course_info(course_id)
)
INSERT INTO stu_course_info
VALUES
(1,1),
(1,2),
(1,3),
(2,2),
(2,3),
(3,1),
(3,3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/243908.html
標籤:其他
下一篇:作業流第六章之用戶組與用戶
