1.hibernate测试环境搭建
创建springboot项目,目录结构
2.pom.xml添加jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.31.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.创建实体类
学生
package test.hibernate.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "student")
@Data
public class Student {
/**
* 主键
*/
@Id
@GeneratedValue
private Long id;
/**
* 名称
*/
@Column(name = "name")
private String name;
/**
* 一对一
*/
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "student_id")
private Teacher teacher;
/**
* 一对多
*/
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "student_id")
private List<Teacher> teacher1;
/**
* 多对多
*/
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "student_teacher", joinColumns = {@JoinColumn(name = "student_id")}, inverseJoinColumns = {@JoinColumn(name = "teacher_id")})
private List<Teacher> teacher2;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
老师
package test.hibernate.entity;
import lombok.Data;
import javax.persistence.*;
@Entity
@Table(name = "teacher")
@Data
public class Teacher {
@Id
@GeneratedValue
private Long id;
@Column(name = "name")
private String name;
}
4.添加hibernate.xfg.xml配置
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--程序执行的时候是否显示真正的sql语句-->
<property name="show_sql">true</property>
<!--使用的mySQL对应的“方言”-->
<property name="dialect">org.hibernate.dialect.MySQL57Dialect
</property>
<!--连接数据库的Driver-->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!--数据库连接url-->
<property name="connection.url" >
jdbc:mysql://localhost:3306/hibernate-test?characterEncoding=utf-8
</property>
<!--用户名-->
<property name="connection.username">改成自己的</property>
<!--密码-->
<property name="connection.password">改成自己的</property>
<!-- 自动创建表-->
<property name="hbm2ddl.auto">update</property>
<!-- 设置mysql存储引擎-->
<property name="hibernate.dialect.storage_engine">innodb</property>
<!-- 引入的实体类,使用注解,不使用hbm.xml映射文件 -->
<mapping class="test.hibernate.entity.Student"></mapping>
<mapping class="test.hibernate.entity.Teacher"></mapping>
</session-factory>
</hibernate-configuration>
5.封装简单的hibernate工具类
package test.hibernate.util;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import java.io.Serializable;
/**
* @author loud
* @version V1.0
* @Package test.hibernate.util
* @date 2021/5/8 9:47
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory;
public static ThreadLocal<Session> sessionThreadLocal = new ThreadLocal<>();
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
if(sessionThreadLocal.get() == null){
sessionThreadLocal.set(getSessionFactory().openSession());
}
return sessionThreadLocal.get();
}
public static void close() {
getSession().close();
}
public static Long save(Object object) {
Long id = (Long) getSession().save(object);
return id;
}
public static <T> T selectById(Class<T> entity, Serializable serializable) {
T t = getSession().get(entity, serializable);
return t;
}
public static <T> void deleteById(Class<T> entity, Serializable serializable) {
getSession().delete(selectById(entity, serializable));
}
public static void init(Object subEntity) {
if(!Hibernate.isInitialized(subEntity)){
Hibernate.initialize(subEntity);
}
}
}
6.简单测试增删改查
package test.hibernate.test;
import org.hibernate.Transaction;
import org.junit.jupiter.api.Test;
import test.hibernate.entity.Student;
import test.hibernate.entity.Teacher;
import test.hibernate.util.HibernateUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author loud
* @version V1.0
* @Package test.hibernate.test
* @date 2021/5/8 8:37
*/
public class HibernateTest {
@Test
public void testHibernate(){
Student student = new Student();
student.setName("张三");
List<Teacher> teachers = new ArrayList<>();
Teacher teacher = new Teacher();
teacher.setName("李四");
Teacher teacher1 = new Teacher();
teacher.setName("王五");
teachers.add(teacher);
teachers.add(teacher1);
student.setTeacher(teacher);
student.setTeacher1(teachers);
student.setTeacher2(teachers);
Transaction transaction = HibernateUtil.getSession().beginTransaction();
//保存
Long id = HibernateUtil.save(student);
//查询
Student student1 = HibernateUtil.selectById(Student.class, id);
System.out.println(student1);
//删除
HibernateUtil.deleteById(Student.class, id);
transaction.commit();
HibernateUtil.close();
}
}