当前位置: 首页 > article >正文

JPA、Hibernate入门及实战

一、JPA

概念:
  • JPA(Java Persistence API):对象持久化API,是官方定制的一套ORM规范
  • ORM(Object Relational Mapping):对象关系映射,通过实体类操作数据库表的一种设计思想
JPA作用:
  • 简化数据库访问
  • 屏蔽下层不同数据库的SQL差异,做到一套代码兼容多套数据库
JPA实现过程
  • 首先通过注解或xml描述实现实体类与数据库表的映射关系
  • 然后通过对实体类的操作进行CRUD(通过映射关系生成SQL语句操作数据库)
JPA主要实现
  • Hibernate (性能最好,最常用实现)、EclipseLink、OpenJPA、TopLink
JPA核心
核心介绍
实体类(Entity)JPA中的实体类是与数据库表对应的Java类。它使用注解来标识实体类与数据库表之间的映射关系,包括表名、字段名、关系等
实体管理器(EntityManager)实体管理器是JPA的核心接口之一,它负责管理实体类的生命周期,包括插入、更新、查询、删除等操作。通过实体管理器,开发人员可以进行数据库操作
持久化上下文(Persistence Context)实体对象与数据库之间的中间缓存,可管理实体对象的变化并将变化持久化到数据库中。在JPA中,每个实体管理器都有一个持久化上下文
数据访问对象(DAO)数据访问对象是一个用于封装数据库操作的接口。通过DAO,开发人员可定义CRUD操作数据库

二、Hibernate

Hibernate概念
  • Hibernate:是JPA的主要实现,实体对象与表的关系映射框架
Hibernate重要特点
  1. 简化数据库操作:绑定好实体对象与表的映射关系后,可通过提供的简易API直接操作数据库,不用写SQL
  2. 跨数据库支持:屏蔽不同的数据库SQL差异,可做到一套代码兼容多套数据库
  3. 高性能:采用了如缓存,延迟加载等一系列的性能优化策略,可提高数据访问效率
  4. 事务管理:Hibernate提供了事务管理机制,可通过简单API来管理事务,确保数据的一致性和完整性
  5. 易于扩展:提供了灵活的对象与表的映射策略,支持自定义SQL,支持插件,提供了拦截器,事件监听器等扩展点
Hibernate结合Spring Boot深入实践
1)pom.xml文件中添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2)配置数据库连接信息。在application.properties文件中添加以下内容:
spring.datasource.url=jdbc:mysql://localhost:3306/example_db
spring.datasource.username=root
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=create

3)创建一个User实体类,包括映射关系及懒加载:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

// 不指定表名,默认与数据库的user表映射
@Entity
public class User {

	// 指定主键生成策略,主键自增长
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
    // 实体关系映射一对多,懒加载,数据会在使用时再读到内存中
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Address> addresses;

    // getters and setters

}
4)创建一个用于访问数据库的UserRepository接口,包含多种查询方式:
import org.springframework.data.repository.JpaRepository;

// 此接口只操作user对应的数据库表, User是实体,Long为实体的主键类型
public interface UserRepository extends CrudRepository<User, Long> {

	// 通过定义接口方法名来自动生成查询逻辑
    User findByName(String name);

	// JPQL查询
    @Query("SELECT u FROM User u WHERE u.name = :name")
    List<User> findByName(@Param("name") String name);
	
	// 原生SQL查询
	@Query(value = "SELECT * FROM user WHERE name = :name", nativeQuery = true)
    List<User> findByName(@Param("name") String name);
}

Criteria 示例,user信息查询,名称模糊匹配,年龄完全匹配

@Repository
public class UserRepository {

    @Autowired
    private EntityManager entityManager;

    public List<User> searchUsers(String name, int age) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
        Root<User> root = criteriaQuery.from(User.class);

        List<Predicate> predicates = new ArrayList<>();
        if (name != null && !name.isEmpty()) {
            predicates.add(criteriaBuilder.like(root.get("name"), "%" + name + "%"));
        }
        if (age > 0) {
            predicates.add(criteriaBuilder.equal(root.get("age"), age));
        }

        criteriaQuery.select(root).where(predicates.toArray(new Predicate[0]));

        TypedQuery<User> query = entityManager.createQuery(criteriaQuery);
        return query.getResultList();
    }
}
 
5)创建一个UserService类,使用UserRepository接口,包括缓存,事务示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Cacheable("userCache")
    public User getUserByName(String name) {
        return userRepository.findByName(name);
    }

    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);
    }

    public List<User> getUsersByAgeGreaterThan(int age) {
        return userRepository.findByAgeGreaterThan(age);
    }

}

@Cacheable注解:启用缓存。当调用getUserByName方法时,它会首先检查缓存中是否存在对应的结果,如果存在,则直接返回缓存中的数据,否则从数据库中查询并将结果放入缓存中。

@Transactional注解:开启事务。当调用saveUser方法时,它会在方法执行前自动开启一个事务,并在方法执行结束后自动提交或回滚事务。

6) 创建一个UserController类使用UserService类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{name}")
    public User getUserByName(@PathVariable String name) {
        return userService.getUserByName(name);
    }

    @PostMapping("/")
    public void saveUser(@RequestBody User user) {
        userService.saveUser(user);
    }

}
此时示例完成,最后可以通过访问get或post请求验证整条链路。

http://www.kler.cn/news/356507.html

相关文章:

  • Vmware一步安装win7系统
  • 从零开始搭建:基于在线教育系统源码的线上网校开发详解
  • 软考-软件设计师(10)-专业英语词汇汇总与新技术知识点
  • 基于x86_64汇编语言简单教程1: 环境预备与尝试
  • 25计软新增考研院校!或可捡漏上岸!
  • 「C++」内存管理
  • linux centos7系统ARM架构下安装最新版docker 27.3.1及docker-compose v2.3.4
  • 【ESP32】Arduino开发 | LED PWM控制器+呼吸灯例程
  • 《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
  • C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问
  • 从新手到高手:Spring AOP的进阶指南
  • 安防综合管理系统EasyCVR视频汇聚平台Linux环境下如何测试UDP端口是否正常开启?
  • 打印机出现线条和残影情况的主要原因和解决办法
  • 项目管理APP推荐_功能对比与用户评价
  • An.如何在an中截取音频片段
  • .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
  • C++ 算法学习——1.3 双向深度优先搜索
  • 将一个单向链表插入到一个循环链表尾部
  • vue element upload取消上传后终止请求
  • 滑铁卢大学大模型公开课资料来了,大模型入门到精通,非常详细收藏我这一篇就够了