Hibernate 是一個開源的 ORM(對象關係映射)框架,它可以將 Java 對象與資料庫表進行映射,從而實現面向對象的數據持久化。使用 Hibernate,可以避免手動編寫 SQL 語句,從而提高開發效率,並且可以輕鬆地切換不同的資料庫。 ## 基礎概念 entity 實體類是映射到資料庫表中 ...
Hibernate 是一個開源的 ORM(對象關係映射)框架,它可以將 Java 對象與資料庫表進行映射,從而實現面向對象的數據持久化。使用 Hibernate,可以避免手動編寫 SQL 語句,從而提高開發效率,並且可以輕鬆地切換不同的資料庫。
基礎概念
entity 實體類是映射到資料庫表中的 Java 類,它包含了與資料庫表中列相對應的屬性,並且可以使用註解或 XML 文件進行映射。
MySql table 關係型資料庫中的表格
hibernate負責互相轉換兩者。將entity存入資料庫,將資料庫中的數據取出並創建實體類的實例提使用者。
依賴
<dependencies>
<!-- hibernate 核心 -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.7.Final</version>
</dependency>
<!-- jdbc 實現 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
配置類
maven項目將配置文件hibernate.cfg.xml
放置再resource
目錄下即可
<?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.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jpa_study?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">a1b2c3</property>
<!-- 顯示sql語句 -->
<property name="show_sql">true</property>
<!-- 格式化sql -->
<property name="format_sql">true</property>
<!-- sql方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 自動操作:創建-刪除 -->
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<!-- 配置sessionFactory.getCurrentSession()的上下文 -->
<property name="current_session_context_class">thread</property>
<mapping class="org.example.entity.User"/>
</session-factory>
</hibernate-configuration>
工具類
package org.example.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import java.util.function.Consumer;
import java.util.function.Function;
public class SessionFactoryUtil {
private static final SessionFactory sessionFactory;
static {
// 構建會話工廠(configure未指定參數預設查找classpath:hibernate.cfg.xml)
sessionFactory = new Configuration().configure().buildSessionFactory();
}
/**
* 執行sql操作
* @param callback 回調函數
*/
public static void execute(Consumer<Session> callback) {
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
try {
callback.accept(session);
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
}
transaction.commit();
}
/**
* 執行sql查詢操作
* @param callback 回調函數
* @return 回調函數的返回值
* @param <R> 回調函數的返回值
*/
public static <R> R query(Function<Session, R> callback) {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
R r = callback.apply(session);
transaction.commit();
return r;
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
return null;
}
}
}
Dao層
package org.example.dao;
import org.example.entity.User;
import org.example.util.SessionFactoryUtil;
import java.util.List;
public class UserDao {
public void save(User user) {
SessionFactoryUtil.execute(session -> session.persist(user));
}
public void update(User user) {
SessionFactoryUtil.execute(session -> session.merge(user));
}
public void delete(User user) {
SessionFactoryUtil.execute(session -> session.remove(user));
}
public User findById(Long id) {
return SessionFactoryUtil.query(session -> session.get(User.class, id));
}
public List<User> findAll() {
return SessionFactoryUtil.query(session -> session.createQuery("from User", User.class).list());
}
}
測試
package org.example;
import org.example.dao.UserDao;
import org.example.entity.User;
public class Main {
public static void main(String[] args) {
User user = new User();
user.setName("zhangsan");
user.setEmail("[email protected]");
UserDao userDao = new UserDao();
userDao.save(user);
System.out.println(userDao.findById(user.getId()));
userDao.findAll().forEach(System.out::println);
}
}