05.Hibernate中的关联关系映射,对象查询,二级缓存

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)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值