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进行持久化操作。这将大大简化我们对时间类型数据的处理,使我们能够更加高效地进行开发。