学习三种检索策略
目的:学习三种检索策略的使用情况及配置。
内容:立即检索策略,延迟检索策略,迫切左外连接检索策略。
延迟检索策略
使用延迟检索策略的场合:
(1)一对多或者多对多关联。(2)应用程序不需要立即访问或者根本不会访问的对象。
优点:
由应用程序决定需要加载哪些对象,可以避免执行多余的select,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。
实验步骤:
(1)配置具有一对多的关联关系的表
新建一个Student类
package domain;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "student_table")
public class Student {
@Id
@Column(name = "student_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String studentNo;
private String name;
@OneToMany(targetEntity = Course.class, mappedBy = "student", fetch = FetchType.LAZY)
private Set<Course> courses = new HashSet<>();
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
public Set<Course> getCourses() {
return courses;
}
public void setId(Integer id) { this.id = id; }
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public String getStudentNo() {
return studentNo;
}
public String getName() {
return name;
}
public Student(){}
}
新建一个Course类
package domain;
import javax.persistence.*;
@Entity
@Table(name = "course_table")
public class Course {
@Id
@Column(name = "course_no")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer courseNo;
private String courseName;
@ManyToOne(targetEntity = Student.class)
@JoinColumn(name = "student_id", referencedColumnName = "student_id", nullable = true)
private Student student;
public void setStudent(Student student) {
this.student = student;
}
public Student getStudent() {
return student;
}
public Integer getCourseNo() {
return courseNo;
}
public void setCourseNo(Integer courseNo) {
this.courseNo = courseNo;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
public Course(){ }
public Course(String courseName){
this.courseName = courseName;
}
}
在配置文件中配置lazy属性为true
为两个表写入一些数据:
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setName("lyq");
student.setStudentNo("1901030086");
session.save(student);
Course course1 = new Course("java开发框架");
course1.setStudent(student);
session.persist(course1);
Course course2 = new Course("项目实战");
course2.setStudent(student);
session.persist(course2);
transaction.commit();
HibernateUtil.closeSession();
运行测试
package domain;
import hibernateUtil.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import java.util.Iterator;
public class RetrievalTest {
public static void main(String[] args) {
RetrievalTest rt = new RetrievalTest();
rt.lazy();
}
private void lazy() {
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
// Student student = new Student();
// student.setName("lyq");
// student.setStudentNo("1901030086");
// session.save(student);
//
// Course course1 = new Course("java开发框架");
// course1.setStudent(student);
// session.persist(course1);
//
// Course course2 = new Course("项目实战");
// course2.setStudent(student);
// session.persist(course2);
Student student = (Student) session.load(Student.class, 1);
System.out.println("student name: " + student.getName());
transaction.commit();
HibernateUtil.closeSession();
// Iterator course = student.getCourses().iterator();
}
}
把private void lazy()方法里的
Iterator course = student.getCourses().iterator();
去掉注释,执行结果如下:
立即检索策略
在Student类中设置fetch属性为EAGER即为立即检索策略
运行结果如下:
把private void lazy()方法里的
Iterator course = student.getCourses().iterator();
去掉注释,执行结果如下:
左外连接检索策略
在Course类中进行左外连接的设置:
测试RetrievalTest类里添加explicitOuterJoin()方法:
public void explicitOuterJoin(){
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
List result = (List) session.createQuery(
"FROM Student AS s LEFT JOIN FETCH s.courses WHERE s.id = 1").getResultList();
System.out.println("result's size" + result.size());
transaction.commit();
HibernateUtil.closeSession();
}
运行结果如下:
测试类里添加outerJoin()方法
public void outerJoin(){
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
Course course = (Course) session.load(Course.class, 1);
System.out.println("course name: " + course.getCourseName());
transaction.commit();
HibernateUtil.closeSession();
}
学习三种检索方式
目的:学习三种检索方式。
内容: HQL检索方式,QBC检索方式,SQL检索方式。
在RetrievalTest类中添加hql方法:
public void hql(){
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
List result = (List) session.createQuery(
"FROM Student AS s WHERE s.name = :studentName").setParameter("studentName", "lyq").getResultList();
System.out.println("lsit's size" + result.size());
transaction.commit();
HibernateUtil.closeSession();
}
运行结果为:
在RetrievalTest类中添加qbc方法:
public void qbc(){
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
Criterion criterion = Expression.like("name", "lyq");
criteria.add(criterion);
List result = criteria.list();
System.out.println("lsit's size" + result.size());
transaction.commit();
HibernateUtil.closeSession();
}
运行结果:
在RetrievalTest类中添加sql方法:
public void sql(){
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
String sql = "SELECT s.id, s.name FROM Student s WHERE s.name like:studentName";
List result = (List) session.createQuery(sql).setParameter("studentName", "lyq").getResultList();
System.out.println("lsit's size" + result.size());
transaction.commit();
HibernateUtil.closeSession();
}
运行结果: