首页 > 其他分享 >hibernate入门

hibernate入门

时间:2023-08-09 13:55:05浏览次数:27  
标签:hibernate 入门 session User import org public

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&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;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);
    }
}

标签:hibernate,入门,session,User,import,org,public
From: https://www.cnblogs.com/heirem/p/17616689.html

相关文章

  • 计算几何入门
    计算几何入门目录计算几何入门一向量1.叉积a.定义b.应用凸包寻找凸包算法1:Graham一向量我认为唯一比较有用的东西是向量的叉积1.叉积a.定义对于两个0起点开始,最终点为(a1,a2)和(b1,b2)的两个向量,其叉积为a1*b2-a2*b1。b.应用可以判断两个向量的旋转方向:假如A和B......
  • Pytorch框架CV开发-从入门到实战
    点击下载:Pytorch框架CV开发-从入门到实战课程分享,视频+源码+数据集下载!提取码:bbvaPyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多主流框架如......
  • nlp入门(三)基于贝叶斯算法的拼写错误检测器
    源码请到:自然语言处理练习:学习自然语言处理时候写的一些代码(gitee.com)数据来源:norvig.com/big.txt贝叶斯原理可看这里:机器学习算法学习笔记-过客匆匆,沉沉浮浮-博客园(cnblogs.com)一、数据预处理将输入的数据全部变为小写方便后续处理defwords(text):return......
  • python入门
    环境搭建:官网下载,pycharm编译器用于开发          Jupyter沙箱 变量:定义变量,变量名=变量  标识符(变量名)命名规则:变量名中,只能由数字字母划线三类组成,   不能以数字开头。不能使用内置关键字(函数名,定义函数的DEF)。  严格区分大小写(小写大写......
  • TypeChat入门指南:从安装到对话流程设计
    大家好,我是星辰编程理财,这篇文章可以作为TypeChat的入门指南。一、介绍TypeChat是一款基于人工智能技术的对话系统,旨在帮助开发者构建智能机器人,并与用户进行自然语言对话。无论是应用于在线客服、智能助手还是其他领域,TypeChat都能提供强大的对话交互能力,为用户提供优质的用户体验......
  • SpringBoot入门
    1.介绍:SpringBoot是一个基于Spring框架的开源项目,旨在简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。它通过自动......
  • Java入门题-查找一个字符串中,所有想查找短字符串的起始位置
    问题:就是长短两串字符串,从长字符串中查找所有短字符串在长字符串中的位置方法:用截取方式来规避已经查找过的内容,重复遍历来确定位置代码:需要引用importjava.util.Scanner; Scanners=newScanner(System.in);//新定义一个ScannerStringS=s.next();......
  • 数据库增删改查语句(入门)
    数据库增删改查语句一、增加insertinto...values1、insertinto表名(列名1,列名2,...列名n) values(值1,值2,...值n);(写列名插入数据)2、insertinto表名values(值1,值2,...值n);(不写列名插入数据)二、删除delete1、deletefrom表名;(删除表中所有数据)2、deletefrom表名where列=值;(根......
  • Redis入门
                  ......
  • [数字人] 从0开始的三维人脸重建入门 (三)
    近些年来人脸三维重建的发展主要围绕数据表示来进行,从一开始的显式表示到探索线性参数化表示,到后来非线形参数化表示和神经场表示,表示能力越来越强。此外,还有些方法结合了参数化模型表示和GAN等生成模型,以优化参数化模型对细节的缺失。从0开始的三维人脸重建入门(三)NPMs(NPMs......