Java Hibernate使用方法及整合查询

下面我将详细讲解"Java Hibernate使用方法及整合查询"的完整攻略。

什么是Hibernate

Hibernate是Java语言中一个开放源代码的对象关系映射框架,它对JDBC进行了封装,使Java程序员可以使用面向对象的思维来操作数据库。Hibernate可以自动将Java中的对象和关系数据库之间进行映射,使数据库的表结构和Java中的类结构相同,从而可以实现对象的持久化存储。

Hibernate使用方法

配置Hibernate环境

配置Hibernate环境需要以下三个步骤:

  1. 引入Hibernate jar 包。可以从https://hibernate.org/orm/releases/下载最新的Hibernate版本,并将其加入项目的依赖中。
  2. 配置Hibernate.cfg.xml。这是Hibernate的核心配置文件,其中需要配置数据库的连接信息等。示例配置如下:

```xml

 <hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root123</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

```

  1. 配置HibernateUtil类。这个类负责初始化Hibernate框架,以及获取Session对象。示例代码如下:

```java
public class HibernateUtil {
private static final SessionFactory sessionFactory;

  static {
    try {
      Configuration cfg = new Configuration().configure();
      sessionFactory = cfg.buildSessionFactory();
    } catch (Throwabl ex) {
      throw new ExceptionInInitializerError(ex);
    }
  }

  public static Session getSession() throws HibernateException {
    return sessionFactory.openSession();
  }
}

```

实体类定义

在Hibernate中,实体类需要满足以下要求:

  1. 必须有一个标识属性,通常是id。
  2. 必须有一个默认的构造函数。
  3. 属性必须用private修饰。
  4. 对象需要提供公共的Getter和Setter方法。

下面是一个Java实体类的示例:

@Entity
@Table(name = "product")
public class Product {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  private Double price;

  public Product() {}

  // Getter and Setter ...
}

定义DAO层数据访问接口

DAO全称是Data Access Object,它是一个抽象的数据访问接口,用于定义CRUD操作,与数据库进行交互。下面是一个DAO的示例:

public interface ProductDao {
  void save(Product product);
  void update(Product product);
  void delete(Long id);
  Product findById(Long id);
  List<Product> findAll();
}

定义DAO层数据访问实现类

定义了DAO接口之后,需要编写DAO实现类来实现接口中定义的方法。下面是一个DAO实现类的示例:

public class ProductDaoImpl implements ProductDao {
  private Session session;

  public ProductDaoImpl(Session session) {
    this.session = session;
  }

  @Override
  public void save(Product product) {
    session.save(product);
  }

  @Override
  public void update(Product product) {
    session.update(product);
  }

  @Override
  public void delete(Long id) {
    Product product = session.get(Product.class, id);
    session.delete(product);
  }

  @Override
  public Product findById(Long id) {
    return session.get(Product.class, id);
  }

  @Override
  public List<Product> findAll() {
    return session.createQuery("from Product", Product.class).list();
  }
}

整合查询

Hibernate提供了一种灵活的查询方式:Criteria查询,它可以通过对象属性,在不需要写SQL语句的情况下实现复杂查询。下面是一个Criteria查询的示例:

public List<Product> findProductsByNameAndPrice(String name, double price) {
  Criteria criteria = session.createCriteria(Product.class);
  if (StringUtils.isNotBlank(name)) {
    criteria.add(Restrictions.like("name", name + "%"));
  }
  if (price > 0) {
    criteria.add(Restrictions.lt("price", price));
  }
  return (List<Product>) criteria.list();
}

测试Hibernate

编写完Hibernate相关的代码之后,可以编写单元测试方法来验证Hibernate的正确性。下面是一个单元测试的示例:

public class HibernateTest {
  private Session session;
  private ProductDao productDao;

  @Before
  public void setUp() {
    session = HibernateUtil.getSession();
    productDao = new ProductDaoImpl(session);
  }

  @After
  public void tearDown() {
    session.close();
  }

  @Test
  public void addProductTest() {
    Product product = new Product();
    product.setName("Java入门到精通");
    product.setPrice(88.5);
    productDao.save(product);

    Product result = productDao.findById(product.getId());
    Assert.assertEquals(product.getName(), result.getName());
    Assert.assertEquals(product.getPrice(), result.getPrice(), 0);
  }

  // ... Other Test Methods ...
}

示例代码

下面提供两个示例代码:

示例1:新增用户并级联新增订单

public class UserOrderTest {
  private Session session;

  @Before
  public void setUp() {
    session = HibernateUtil.getSession();
  }

  @After
  public void tearDown() {
    session.close();
  }

  @Test
  public void addUserAndOrderTest() {
    // Save User
    User user = new User();
    user.setName("Ben");
    user.setEmail("ben@example.com");
    user.setPhone("13912345678");

    Order order1 = new Order();
    order1.setOrderNo("201808200001");
    order1.setAmount(100.0);
    order1.setUser(user);

    Order order2 = new Order();
    order2.setOrderNo("201808200002");
    order2.setAmount(200.0);
    order2.setUser(user);

    session.save(user);
    session.save(order1);
    session.save(order2);

    // Check User and Orders Exist
    User resultUser = session.get(User.class, user.getId());
    Assert.assertEquals(user.getName(), resultUser.getName());
    Assert.assertEquals(user.getEmail(), resultUser.getEmail());
    Assert.assertEquals(user.getPhone(), resultUser.getPhone());

    Order resultOrder1 = session.get(Order.class, order1.getId());
    Assert.assertEquals(order1.getOrderNo(), resultOrder1.getOrderNo());
    Assert.assertEquals(order1.getAmount(), resultOrder1.getAmount(), 0);
    Assert.assertEquals(order1.getUser().getId(), resultOrder1.getUser().getId());

    Order resultOrder2 = session.get(Order.class, order2.getId());
    Assert.assertEquals(order2.getOrderNo(), resultOrder2.getOrderNo());
    Assert.assertEquals(order2.getAmount(), resultOrder2.getAmount(), 0);
    Assert.assertEquals(order2.getUser().getId(), resultOrder2.getUser().getId());
  }
}

示例2:动态查询用户信息

public class UserDynamicTest {
  private Session session;

  @Before
  public void setUp() {
    session = HibernateUtil.getSession();
  }

  @After
  public void tearDown() {
    session.close();
  }

  @Test
  public void findUserTest() {
    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.like("name", "Tom"));
    criteria.addOrder(Order.asc("id"));
    List<User> users = (List<User>) criteria.list();
    Assert.assertEquals(2, users.size());
  }
}

以上就是"Java Hibernate使用方法及整合查询"的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Hibernate使用方法及整合查询 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 类卸载的作用是什么?

    类卸载是Java虚拟机在进行垃圾回收时的一个重要步骤。其主要作用是释放已加载类的方法区内存,以便腾出更多的空间来供后续的类加载使用。 类卸载的作用有以下几点: 节约内存空间:随着应用程序的运行,不断有新的类被加载到JVM的方法区中。如果不及时对已加载的类进行卸载,这些类占用的内存空间会越来越多,直到导致JVM无法再加载新类为止。通过类卸载可以及时释放已加载类…

    Java 2023年5月11日
    00
  • Java日期时间操作的方法

    下面就给您介绍Java日期时间操作的方法的完整攻略。 1. 日期时间类 Java中有多种日期时间类,包括Date、Calendar、DateFormat、SimpleDateFormat、Instant等。其中,Date和Calendar是Java SE 1.1版本引入的,而Instant是Java SE 8版本新增的类。 1.1 Date类 java.ut…

    Java 2023年5月20日
    00
  • Spring和SpringBoot之间的区别

    让我们开始讲解“Spring和SpringBoot之间的区别”的完整攻略。 1. Spring 和 Spring Boot 的概念 Spring 是一个开源的 JavaEE(现在叫 Jakarta EE)应用程序框架,它提供了一个容器的概念,即框架内部的 Ioc(控制反转)容器,还提供了很多实用的模块,如 AOP、JPA、JDBC 等,可以帮助开发人员快速构…

    Java 2023年5月15日
    00
  • JAVA实现连接本地打印机并打印文件的实现代码

    Java实现连接本地打印机并打印文件的实现代码需要以下步骤: 步骤一:导入打印相关的依赖库 Java中的javax.print包提供了打印相关的API,需要在项目中导入此包相关的依赖,可以使用Maven等方式进行导入。 步骤二:获取系统中支持的打印机 可以通过javax.print.PrintServiceLookup类的lookupPrintService…

    Java 2023年5月19日
    00
  • 图解Spring Security 中用户是如何实现登录的

    首先需要说明的是,Spring Security 是一个安全框架,其中的用户登录功能是整个框架的核心功能之一。可以通过了解 Spring Security 的认证流程和操作过程来了解用户登录的实现方式。 认证流程 用户登录的认证流程可以概括为以下步骤: 用户在登录页面输入用户名和密码,点击“登录”按钮。 系统获取用户输入的用户名和密码,进行认证。 系统会获取…

    Java 2023年5月20日
    00
  • JSP加载JS文件不起作用的有效解决方法

    下面是关于“JSP加载JS文件不起作用的有效解决方法”的完整攻略: 问题背景 在JSP中使用JavaScript是非常常见的,但是有时候我们可能会遇到这样的问题:在JSP中引用的JS文件并没有起作用,也就是说JS代码没有被执行。这种情况下我们该怎么解决呢? 解决方法 具体的方法是在JSP文件中使用<script>标签引入JS文件时,要注意添加ty…

    Java 2023年6月15日
    00
  • Java虚拟机之对象创建过程与类加载机制及双亲委派模型

    Java虚拟机之对象创建过程 Java中的对象在内存中的实现是由Java虚拟机(JVM)负责完成的。对象的创建过程分为三步: 分配内存空间:JVM为对象在堆内存中分配一块连续的内存空间。 初始化对象:JVM为对象的成员变量赋初始值。 调用构造函数:JVM调用对象的构造函数来完成对象的初始化。 例子说明 public class Person { privat…

    Java 2023年5月26日
    00
  • java进行error捕获和处理示例(java异常捕获)

    Java异常获取及处理示例 在Java程序开发过程中,难免会遇到各种异常情况,为避免异常程序的崩溃并使程序更加健壮,Java提供了异常处理机制。 异常基本概念 Java中异常指的是程序运行时错误信息,可以分为三种: 可检查异常(Checked Exceptions): 由Java提供的异常类派生而来,程序在编译阶段就必须明确如何处理这类异常,否则编译器会提示…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部