主頁 > 資料庫 > 05.Hibernate中的關聯關系映射,物件查詢,二級快取

05.Hibernate中的關聯關系映射,物件查詢,二級快取

2021-01-03 10:51:06 資料庫

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

標籤:其他

上一篇:Neo4j Cypher如何比較日期

下一篇:作業流第六章之用戶組與用戶

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more