[Hibernate] 基本增删查改
本文记录,Java 应用通过 Hibernate 对数据库 MySQL 进行基本的增删改查操作,即CRUD。
本例子的目录结构如下
hibernate.cfg.xml 存储数据库信息,如数据库类型,账号密码,数据库名称
Empoyee.hbm.xml,声明 java 简单对象和数据库表结构的对应关系
Employee.java,java 简单对象,用于声明数据结构
ManageEmployee,管理 Employee,并对外提供操作 Employee 对象数据的接口。
App.java,演示本案例
代码详情
在数据库中,创建表结构
create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) );
创建简单对象类, POJO(Plain Old Java Object)。在 Java 中定义 Employee 的数据结构。
package tony.hibernateTest; public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee(){ } public Employee(String fname, String lname, int salary){ this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId(int 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 int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } }
在 xml 文件中,将 java 的简单类 Employee 和数据库 employee 的表结构建立映射关系。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="tony.hibernateTest.Employee" table="employee"> <id name="id" type="int" column="id"> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping>
hibernate.cfg.xml,提供数据库相关信息,例如数据类型,账号密码等。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume test is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/hibernateTest </property> <property name="hibernate.connection.username"> username </property> <property name="hibernate.connection.password"> password </property> <!-- List of XML mapping files --> <mapping resource="Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
ManageEmployee,Employee 的操作工具类。对业务层提供操作 Employee 的接口。
package tony.hibernateTest; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; { factory = new Configuration().configure().buildSessionFactory(); } /** * Add an employee record into database. * @param fname * @param lname * @param salary * @return */ public Integer addEmployee( String fname, String lname, int salary ){ Session session = factory.openSession(); Transaction tx = null; Integer employeeId = null; tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employeeId = (Integer)session.save(employee); tx.commit(); return employeeId; } public void listEmployees(){ Session session = factory.openSession(); Transaction tx = null; tx = session.beginTransaction(); List<Employee> employees = session.createQuery("FROM Employee").list(); for (Employee ee : employees){ System.out.println(ee.getId() + ", " + ee.getFirstName() + ", " + ee.getLastName() + ", " + ee.getSalary()); } tx.commit(); } public List<Employee> getAllEmployees(){ Session session = factory.openSession(); Transaction tx = null; tx = session.beginTransaction(); List<Employee> employees = session.createQuery("FROM Employee").list(); tx.commit(); return employees; } /** * update salary of the specified employee in database * @param employeeId * @param salary */ public void updateEmployee(Integer employeeId, int salary){ Session session = factory.openSession(); Transaction tx = null; tx = session.beginTransaction(); Employee ee = session.get(Employee.class, employeeId); ee.setSalary(salary); tx.commit(); } public void deleteEmployee(Integer employeeId){ Session session = factory.openSession(); Transaction tx = null; tx = session.beginTransaction(); Employee ee = session.get(Employee.class, employeeId); session.delete(ee); tx.commit(); } }
App.java,Hibernate 增删该查功能演示类。创建 employee 的功能类 ManageEmployee,通过 ManageEmployee 提供的接口,进行增加、更新、删除 MySQL 中数据。
package tony.hibernateTest; import java.util.List; public class App { public static void main( String[] args ) { ManageEmployee me = new ManageEmployee(); int empId1 = me.addEmployee("aa", "bb", 11); int empId2 = me.addEmployee("cc", "ff", 22); List<Employee> employees = me.getAllEmployees(); Employee firstEmp = employees.get(0); me.updateEmployee(firstEmp.getId(), firstEmp.getSalary() + 10); Employee lastEmp = employees.get(employees.size() - 2); me.deleteEmployee(lastEmp.getId()); me.listEmployees(); } }
在 pom.xml 中,声明使用到的依赖,通过 maven 进行加载。
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.3.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>
参考资料
Hibernate - Examples, tutorialspoint