在MySQL数据库中使用hibernate进行CRUD操作的详细步骤

166 阅读5分钟

在这篇文章中,我们将学习如何使用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项目,请按以下步骤操作

  1. 进入文件>新建>项目
    step1
  2. 在过滤框中输入maven,选择Maven项目并点击下一步
    step2
  3. 点击下一步
    step3
  4. 在目录对话框中选择'内部',从原型列表中选择'maven-archetype-quickstart',点击下一步
    step4
  5. 输入 "Group Id"、"Artifact Id "和 "Package "的值,然后点击完成
    step5

等待项目被创建。

✋✋✋

默认情况下,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;
	}
}

记住把USERPASS的值替换成你的数据库凭证。在我的例子中,它分别是'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应用程序运行。现在你应该能看到下面的输出: output

现在,试着执行这个应用程序中的所有操作。

继续探索吧! 隳(◕‿-)/
快乐编码! 🙂🙂