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外置二级缓存的支持:
org.hibernate.cache.ehcache.internal.EhcacheRegionFactoryproperty>
				设置哪些内容加入二级缓存:<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文件



<hibernate-configuration>
    <session-factory>
    	
    	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>
		<property name="hibernate.connection.username">rootproperty>
		<property name="hibernate.connection.password">123456property>
		<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8property>
    	
    	<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialectproperty>
    	
    	<property name="hibernate.show_sql">trueproperty>
    	<property name="hibernate.format_sql">trueproperty>
    	
    	<property name="hibernate.hbm2ddl.auto">updateproperty>  
    	
    	
    	<mapping resource="class-mapping.hbm.xml"/>
    	<mapping resource="stu-mapping.hbm.xml"/>
    session-factory>
hibernate-configuration>

配置hbm.xml文件

stu-mapping.hbm.xml



<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>

class-mapping.hbm.xml



<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 name="stuInfos" table="stu_info">
			
			<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文件



<hibernate-configuration>
    <session-factory>
    	
    	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>
		<property name="hibernate.connection.username">rootproperty>
		<property name="hibernate.connection.password">123456property>
		<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8property>
    	
    	<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialectproperty>
    	
    	<property name="hibernate.show_sql">trueproperty>
    	<property name="hibernate.format_sql">trueproperty>
    	
    	<property name="hibernate.hbm2ddl.auto">updateproperty>
    	
    	
    	<mapping resource="stu2-mapping.hbm.xml"/>
    	<mapping resource="course-mapping.hbm.xml"/>
    session-factory>
hibernate-configuration>

配置hbm.xml文件

stu2-mapping.hbm.xml



<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



<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>
		
		<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.EhcacheRegionFactoryproperty>
			设置哪些内容加入二级缓存:<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文件



<hibernate-configuration>
    <session-factory>
    	
    	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>
		<property name="hibernate.connection.username">rootproperty>
		<property name="hibernate.connection.password">123456property>
		<property name="hibernate.connection.url">jdbc:mysql:///user_db?characterEncoding=UTF-8property>
    	
    	<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialectproperty>
    	
    	<property name="hibernate.show_sql">trueproperty>
    	<property name="hibernate.format_sql">trueproperty>
    	
    	<property name="hibernate.hbm2ddl.auto">updateproperty>
    	
    	
    	<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactoryproperty>
    	
    	
    	<mapping resource="stu-mapping.hbm.xml"/>
    	
    	
    	<class-cache usage="read-only" class="com.zb.entity.StuInfo"/>
        
    session-factory>
hibernate-configuration>

配置hbm.xml文件



<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"/>
    
    <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)

你可能感兴趣的:(Hibernate学习,hibernate)