MySQL 如何将MySQL TIMESTAMP/DATETIME类型与Java 8中的LocalDateTime类型进行映射,并使用Hibernate 5来进行持久化

MySQL 如何将MySQL TIMESTAMP/DATETIME类型与Java 8中的LocalDateTime类型进行映射,并使用Hibernate 5来进行持久化

在本文中,我们将介绍如何将MySQL TIMESTAMP/DATETIME类型与Java 8中的LocalDateTime类型进行映射,并使用Hibernate 5来进行持久化。通过这种映射方式,我们可以方便地操作时间类型的数据,而无需手动转换。

阅读更多:MySQL 教程

1. MySQL TIMESTAMP/DATETIME类型

MySQL TIMESTAMP和DATETIME类型用于存储日期和时间的值。它们的区别在于,TIMESTAMP类型存储从“1970-01-01 00:00:01”以来的秒数,而DATETIME类型存储时间的实际值。

以下是一个示例,其中我们使用MySQL Workbench创建了一个名为“example”的数据库,并在其中创建了一个名为“person”的表格:

CREATE TABLE `example`.`person` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NULL,
  `birth_date_time` DATETIME NULL,
  `update_time` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`));

在上面的示例中,我们创建了一个包含四个字段的表格,“id”和“name”用于存储人员信息,“birth_date_time”用于存储生日日期和时间,“update_time”用于存储上次更新时间。

现在,我们已经创建了一个表格,下一步是创建一个Java对象,并将其与上面的表格进行映射。

2. Java对象与MySQL表格的映射

我们将创建一个名为“Person”的Java类,其中包含与上面表格中的列对应的属性。在这个Java类中,我们需要使用Java 8中的LocalDateTime类型来与MySQL TIMESTAMP/DATETIME类型进行映射。在下面的代码中,我们将使用javax.persistence包中的注解来指定属性与表格的映射方式:

import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "person")
public class Person {   
    @Id
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "birth_date_time")
    private LocalDateTime birthDateTime;

    @Column(name = "update_time", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private LocalDateTime updateTime;

    // getter and setter    
}

在上面的示例中,我们创建了一个名为“Person”的Java类,并使用@Entity注解来标记为一个实体类。@Table注解用于指定类名与表名之间的映射,在这里,它指定了“person”表格。@Column注解用于指定属性与列名之间的映射,在这里,它指定了“birth_date_time”列对应的属性为birthDateTime。我们还使用了@Column注解的“columnDefinition”属性,来指定“update_time”列的默认值为当前时间,并且在更新该行记录时自动更新该列。

现在,我们已经创建了一个Java对象,并将其与MySQL表格进行了映射。下一步是使用Hibernate 5来进行持久化。

3. 使用Hibernate 5进行持久化

我们将使用Hibernate 5来进行Person对象的持久化。在下面的示例中,我们创建了一个名为“PersonDAO”的类,它包含了Person对象的CRUD方法,并使用Hibernate 5中的SessionFactory和Transaction来管理数据库连接和事务。在PersonDAO类中,我们使用了Hibernate 5的Criteria API来创建查询条件,并使用LocalDateTime对应的Timestamp类型与表格中的时间类型进行比较:

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

public class PersonDAO {

    private SessionFactory sessionFactory;

    public PersonDAO() {
        Configuration configuration = new Configuration();
        configuration.configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    public void add(Person person) {
        Session session = sessionFactory.openSession();
       Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(person);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    public Person getByID(int id) {
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(Person.class);
        criteria.add(Restrictions.eq("id", id));
        Person person = (Person) criteria.uniqueResult();
        session.close();
        return person;
    }

    public List<Person> getAll() {
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(Person.class);
        List<Person> persons = criteria.list();
        session.close();
        return persons;
    }

    public void update(Person person) {
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.update(person);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    public void delete(Person person) {
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.delete(person);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

在上面的示例中,我们创建了一个名为“PersonDAO”的类,它包含了Person对象的CRUD方法,并使用SessionFactory和Transaction来管理数据库连接和事务。在add()方法中,我们使用session.save(person)将对象保存到数据库中。在getByID()方法中,我们使用Hibernate 5的Criteria API创建查询条件,并使用eq()方法来指定查询条件为”id = ?”,其中“?”是占位符。在getAll()方法中,我们使用criteria.list()方法来获取所有Person对象的列表。在update()方法中,我们使用session.update(person)将对象更新到数据库中。在delete()方法中,我们使用session.delete(person)将对象从数据库中删除。

现在我们已经学习了如何使用Hibernate 5来进行持久化操作,下一步是测试我们的代码。

4. 测试代码

在下面的示例中,我们创建了一个名为“App”的类,它对Person对象进行实例化,并调用PersonDAO的CRUD方法来进行持久化测试。

public class App {
    public static void main(String[] args) {
        PersonDAO personDAO = new PersonDAO();

        // create a person
        Person person = new Person();
        person.setId(1);
        person.setName("Tom");
        person.setBirthDateTime(LocalDateTime.of(1990, 1, 1, 0, 0));
        person.setUpdateTime(LocalDateTime.now());

        // add the person
        personDAO.add(person);

        // get the person by ID
        Person p = personDAO.getByID(1);
        System.out.println(p.getName());

        // get all persons
        List<Person> persons = personDAO.getAll();
        for (Person p1 : persons) {
            System.out.println(p1.getName());
        }

        // update the person
        p.setName("Jerry");
        personDAO.update(p);

        // delete the person
        personDAO.delete(p);
    }
}

在上面的示例中,我们首先创建了一个Person对象,并将其添加到数据库中。然后,我们使用getByID()方法来获取指定ID的Person对象,并使用getName()方法获取其姓名。接下来,我们使用getAll()方法获取所有Person对象的列表,并遍历列表来获取每个Person对象的姓名。然后,我们使用update()方法将Person对象更新为“Jerry”的姓名,并使用delete()方法将Person对象从数据库中删除。

总结

在本文中,我们学习了如何使用Java 8中的LocalDateTime类型与Hibernate 5来对MySQL TIMESTAMP/DATETIME类型进行映射。我们使用javax.persistence包中的注解来指定属性与表格的映射方式,并使用Hibernate 5的SessionFactory和Transaction来管理数据库连接和事务。我们还学习了如何使用Hibernate 5的Criteria API来创建查询条件,并进行持久化测试。通过这些知识,我们可以方便地操作时间类型数据,并使用Hibernate 5进行持久化操作。这将大大简化我们对时间类型数据的处理,使我们能够更加高效地进行开发。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程