在这篇文章中,我们将学习如何使用hibernate开发一个在MySQL数据库中执行CRUD操作的应用程序。在这里,我们将开发一个命令行应用程序,但同样的程序也可以用于开发任何其他类型的应用程序,如GUI、Webapp等。
先决条件
学习者
- 应该熟悉Java的基础知识
- 应在各自的机器上安装Java
- 应安装有MySQL数据库
- 应该有一个现代的IDE,如Eclipse、IntelliJ Idea等。
- 应该有一个活跃的互联网连接
创建CRUD应用程序的步骤
第1步:创建一个maven项目
第2步:添加所需的依赖项
第3步:创建一个模型类
第4步:为hibernate配置创建Java类
第5步:创建一个doa层类来处理CRUD操作
第6步:开发CLI来测试该应用程序
注意:我在这里使用eclipse IDE,但也可以使用你选择的任何现代IDE来跟随。我将提供在eclipse IDE中执行该任务的步骤。
第1步:创建一个maven项目
要在eclipse IDE中创建一个maven项目,请按以下步骤操作
- 进入文件>新建>项目

- 在过滤框中输入maven,选择Maven项目并点击下一步

- 点击下一步

- 在目录对话框中选择'内部',从原型列表中选择'maven-archetype-quickstart',点击下一步

- 输入 "Group Id"、"Artifact Id "和 "Package "的值,然后点击完成

等待项目被创建。
✋✋✋
默认情况下,maven将项目与 "Java 1.5 "关联。因此,eclipse IDE会因此向你抱怨。要消除eclipse IDE发出的警告,请打开pom.xml文件,在属性元素中粘贴以下代码。
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
因为我的机器上安装的是Java 17,所以我在这里使用了17。你可以使用你的机器上安装的java版本。
第2步:添加所需的依赖项
在pom.xml文件中的dependencies元素下添加以下依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.9.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
第一个依赖带来了所有我们需要的hibernate的jar文件,包括hibernate-core,hibernate-common-annotations和其他。
第二个依赖带来了MySQL数据库的4型驱动的java jdbc连接器。
第3步:创建一个模型类
在com.gaurav.model包下创建User.java:
package com.gaurav.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String firstname;
private String lastname;
@Temporal(TemporalType.DATE)
private Date dob;
public User() {
super();
}
public User(String firstname, String lastname, Date dob) {
super();
this.firstname = firstname;
this.lastname = lastname;
this.dob = dob;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
@Override
public String toString() {
return "User [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname + ", dob=" + dob + "]";
}
}
第4步:为Hibernate配置创建Java类
在com.gaurav.util包下创建一个HibernateConf.java类:
package com.gaurav.util;
import java.util.Properties;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
import com.gaurav.model.User;
public class HibernateConf {
private static SessionFactory factory;
private HibernateConf() {}
public static SessionFactory getFactory() {
if(factory == null) {
Configuration configuration = new Configuration();
Properties settings = new Properties();
settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
settings.put(Environment.URL, "jdbc:mysql://localhost:3306/tutorial");
settings.put(Environment.USER, "root");
settings.put(Environment.PASS, "root");
settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL8Dialect");
settings.put(Environment.SHOW_SQL, "false");
settings.put(Environment.HBM2DDL_AUTO, "update");
configuration.setProperties(settings);
configuration.addAnnotatedClass(User.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
factory = configuration.buildSessionFactory(serviceRegistry);
}
return factory;
}
}
记住把USER和PASS的值替换成你的数据库凭证。在我的例子中,它分别是'root'和'root'。在mysql数据库中创建一个数据库教程,或者用另一个数据库的名字代替教程。
第5步:创建一个doa层类来处理CRUD操作
为了遵循标准,我们首先创建一个契约或接口,持有要实现的方法。
在com.gaurav.dao包下创建UserDao.java 接口:
package com.gaurav.doa;
import java.util.List;
import com.gaurav.model.User;
public interface UserDao {
void saveUser(User user);
User getUserById(long id);
List<User> getAllUsers();
void updateUser(User user);
void deleteUserById(long id);
}
现在,在com.gaurav.dao包下创建一个实现类UserDaoImpl.java:
package com.gaurav.doa;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.gaurav.model.User;
import com.gaurav.util.HibernateConf;
public class UserDaoImpl implements UserDao {
private SessionFactory factory = HibernateConf.getFactory();
@Override
public void saveUser(User user) {
Transaction transaction = null;
try(Session session = factory.openSession()) {
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}
}
@Override
public User getUserById(long id) {
Transaction transaction = null;
User user = null;
try(Session session = factory.openSession()) {
transaction = session.beginTransaction();
user = session.get(User.class, id);
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}
return user;
}
@Override
@SuppressWarnings("unchecked")
public List<User> getAllUsers() {
Transaction transaction = null;
List<User> users = null;
try(Session session = factory.openSession()) {
transaction = session.beginTransaction();
users = session.createQuery("from User").list();
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}
return users;
}
@Override
public void updateUser(User user) {
Transaction transaction = null;
try(Session session = factory.openSession()) {
transaction = session.beginTransaction();
session.saveOrUpdate(user);
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}
}
@Override
public void deleteUserById(long id) {
Transaction transaction = null;
try(Session session = factory.openSession()) {
transaction = session.beginTransaction();
User user = session.get(User.class, id);
session.delete(user);
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}
}
}
上述实现类负责数据库中所有的crud操作。
现在,为了测试该应用程序,我们将开发一个命令行应用程序。
第6步:开发CLI来测试该应用程序
com.gaurav包下必须有一个App.java文件。只要在同一文件中写下以下代码:
package com.gaurav;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Date;
import com.gaurav.doa.UserDao;
import com.gaurav.doa.UserDaoImpl;
import com.gaurav.model.User;
public class App
{
public static void main( String[] args )
{
UserDao dao = new UserDaoImpl();
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
System.out.println("==================MENU=================");
System.out.println("1. Create a new user");
System.out.println("2. See a user");
System.out.println("3. See all the users");
System.out.println("4. Update a user information");
System.out.println("5. Delete a user");
System.out.println("6. Exit");
System.out.print("Enter your choice: ");
int choice = Integer.valueOf(input.readLine());
switch(choice) {
case 1:
{
System.out.print("Enter the firstname: ");
String firstname = input.readLine().trim();
System.out.print("Enter the lastname: ");
String lastname = input.readLine().trim();
System.out.println();
System.out.println("Dob format will be yyyy-mm-dd");
System.out.print("Enter the dob: ");
String date = input.readLine().trim();
User user = new User(firstname, lastname, Date.valueOf(date));
System.out.println("\nAdding the user.........");
dao.saveUser(user);
System.out.println("User added successfully!");
break;
}
case 2:
{
System.out.print("Enter the userId: ");
long id = Long.valueOf(input.readLine());
System.out.println(dao.getUserById(id));
break;
}
case 3:
{
dao.getAllUsers().forEach(u -> System.out.println(u));
break;
}
case 4:
{
System.out.println("Enter the userId: ");
long id = Long.valueOf(input.readLine());
User user = dao.getUserById(id);
if(user == null) {
System.out.println("Sorry! The user does not exit.");
break;
}
System.out.println("Leave blank if don't want to change.");
System.out.print("Enter the firstname: ");
String firstname = input.readLine().trim();
if(firstname != "")
user.setFirstname(firstname);
System.out.print("Enter the lastname: ");
String lastname = input.readLine().trim();
if(lastname != "")
user.setLastname(lastname);
System.out.println();
System.out.println("Dob format will be yyyy-mm-dd");
System.out.print("Enter the dob: ");
String date = input.readLine().trim();
if(date != "")
user.setDob(Date.valueOf(date));
System.out.println("\nUpdating the user.........");
dao.updateUser(user);
System.out.println("User updated successfully!");
break;
}
case 5:
{
System.out.println("Enter the userId: ");
long id = Long.valueOf(input.readLine());
System.out.println("Deleting the user.......");
dao.deleteUserById(id);
System.out.println("User deleted successfully!");
break;
}
case 6:
System.exit(0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
现在,在App.java中点击右键,进入**Run As >**并作为java应用程序运行。现在你应该能看到下面的输出:

现在,试着执行这个应用程序中的所有操作。
继续探索吧! 隳(◕‿-)/
快乐编码! 🙂🙂