詳解Java的Hibernate框架中的set映射集與SortedSet映射
Set
集合Set是一個(gè)java集合不包含任何重復(fù)的元素。更正式地說(shuō),Set不包含任何元素對(duì)e1和e2,使得e1.equals(e2),和至多一個(gè)空元素。所以被添加到一組對(duì)象必須實(shí)現(xiàn)equals()和hashCode()方法,使Java可以判斷任何兩個(gè)元素/對(duì)象是否是相同的。
集被映射到與映射表中<set>元素,并在java.util.HashSet中初始化。可以使用Set集合在類(lèi)時(shí),有一個(gè)集合中不需要重復(fù)的元素。
定義RDBMS表:
考慮一個(gè)情況下,我們需要我們的員工記錄存儲(chǔ)在EMPLOYEE表,有以下結(jié)構(gòu):
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) );
此外,假設(shè)每個(gè)員工都可以有一個(gè)或多個(gè)與他/她相關(guān)的證書(shū)。因此,我們將存儲(chǔ)證書(shū)的相關(guān)信息在一個(gè)單獨(dú)的表,該表具有以下結(jié)構(gòu):
create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) );
將有一個(gè)對(duì)多EMPLOYEE和證書(shū)對(duì)象之間的關(guān)系:
定義POJO類(lèi):
讓我們實(shí)現(xiàn)我們的POJO類(lèi)員工將被用于保存與EMPLOYEE表中的對(duì)象和有憑證的設(shè)置變量的集合。
import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private Set certificates; 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 first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Set getCertificates() { return certificates; } public void setCertificates( Set certificates ) { this.certificates = certificates; } }
現(xiàn)在讓我們定義另一個(gè)POJO類(lèi)對(duì)應(yīng)的表的證書(shū),這樣的證書(shū)對(duì)象可以存儲(chǔ)和檢索到的CERTIFICATE表。這個(gè)類(lèi)還應(yīng)該同時(shí)實(shí)現(xiàn)了equals()和hashCode()方法,使Java可以判斷任意兩個(gè)元素/對(duì)象是否相同。
public class Certificate { private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getName() { return name; } public void setName( String name ) { this.name = name; } public boolean equals(Object obj) { if (obj == null) return false; if (!this.getClass().equals(obj.getClass())) return false; Certificate obj2 = (Certificate)obj; if((this.id == obj2.getId()) && (this.name.equals(obj2.getName()))) { return true; } return false; } public int hashCode() { int tmp = 0; tmp = ( id + name ).hashCode(); return tmp; } }
定義Hibernate映射文件:
讓我們開(kāi)發(fā)指定Hibernate如何定義的類(lèi)映射到數(shù)據(jù)庫(kù)表的映射文件。<SET>元素將被用來(lái)定義用于設(shè)置集合的規(guī)則。
<?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="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="all"> <key column="employee_id"/> <one-to-many class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping>
應(yīng)該保存的映射文件中的格式<classname>.hbm.xml。保存映射文件中的文件Employee.hbm.xml。已經(jīng)熟悉了大部分的映射細(xì)節(jié),映射文件中的所有元素:
映射文檔是具有<hibernate-mapping>為對(duì)應(yīng)于每個(gè)類(lèi)包含2個(gè)<class>元素的根元素的XML文檔。
在<class>元素被用于定義數(shù)據(jù)庫(kù)表從一個(gè)Java類(lèi)特定的映射。 Java類(lèi)名指定使用class元素的name屬性和使用表屬性數(shù)據(jù)庫(kù)表名指定。
<meta>元素是可選元素,可以用來(lái)創(chuàng)建類(lèi)的描述。
<id>元素映射在類(lèi)中的唯一ID屬性到數(shù)據(jù)庫(kù)表的主鍵。 id元素的name屬性是指屬性的類(lèi)和column屬性是指在數(shù)據(jù)庫(kù)表中的列。 type屬性保存了Hibernate映射類(lèi)型,這種類(lèi)型的映射將會(huì)從Java轉(zhuǎn)換為SQL數(shù)據(jù)類(lèi)型。
id元素內(nèi)的<generator>元素被用來(lái)自動(dòng)生成的主鍵值。將生成元素的class屬性設(shè)置為原始的讓Hibernate拾取,無(wú)論是identity,sequence或者h(yuǎn)ilo的算法來(lái)創(chuàng)建主鍵根據(jù)底層數(shù)據(jù)庫(kù)的支持能力。
<property>元素用于一個(gè)Java類(lèi)的屬性映射到數(shù)據(jù)庫(kù)表中的列。元素的name屬性是指屬性的類(lèi)和column屬性是指在數(shù)據(jù)庫(kù)表中的列。 type屬性保存了Hibernate映射類(lèi)型,這種類(lèi)型的映射將會(huì)從Java轉(zhuǎn)換為SQL數(shù)據(jù)類(lèi)型。
<SET>元素是新的,已被引入到設(shè)置CERTIFICATE 和Employee類(lèi)之間的關(guān)系。我們使用cascade屬性中的<set>元素來(lái)告訴Hibernate來(lái)保存CERTIFICATE 對(duì)象,同時(shí)為Employee對(duì)象。name屬性被設(shè)置為在父類(lèi)中的定義設(shè)置變量,在我們的情況下,它是CERTIFICATE 。對(duì)于每一組變量,我們需要定義在映射文件中單獨(dú)的一組元素。
<key>元素是包含外鍵的父對(duì)象,即在certificate表中的列。表EMPLOYEE。
<one-to-many>元素表示一個(gè)Employee對(duì)象涉及到很多證書(shū)的對(duì)象,并因此,證書(shū)對(duì)象必須有與父Employee有關(guān)??梢愿鶕?jù)需要使用任何和<one-to-one>,<many-to-one>進(jìn)行或<many-to-many>這個(gè)元素。
創(chuàng)建應(yīng)用程序類(lèi):
最后,我們將創(chuàng)建應(yīng)用程序類(lèi)的main()方法來(lái)運(yùn)行應(yīng)用程序。我們將使用這個(gè)應(yīng)用程序,以節(jié)省一些員工的記錄地連同憑證,然后我們將申請(qǐng)CRUD操作上的記錄。
import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ HashSet set1 = new HashSet(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ HashSet set2 = new HashSet(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Set cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Set certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } }
編譯和執(zhí)行:
下面是步驟來(lái)編譯并運(yùn)行上述應(yīng)用程序。請(qǐng)確保已在進(jìn)行的編譯和執(zhí)行之前,適當(dāng)?shù)卦O(shè)置PATH和CLASSPATH。
- 創(chuàng)建hibernate.cfg.xml配置文件中配置章節(jié)解釋。
- 創(chuàng)建Employee.hbm.xml映射文件,如上圖所示。
- 創(chuàng)建Employee.java源文件,如上圖所示,并編譯它。
- 創(chuàng)建Certificate.java源文件,如上圖所示,并編譯它。
- 創(chuàng)建ManageEmployee.java源文件,如上圖所示,并編譯它。
- 執(zhí)行ManageEmployee二進(jìn)制文件來(lái)運(yùn)行程序。
會(huì)在屏幕上獲得以下結(jié)果,并同時(shí)記錄會(huì)在員工和證書(shū)表被創(chuàng)建。
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MBA Certificate: PMP Certificate: MCA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MBA Certificate: PMP Certificate: MCA
如果檢查員工和證書(shū)表,就應(yīng)該記錄下了:
mysql> select * from employee;
+----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec)
mysql> select * from certificate;
+----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+ | 1 | MBA | 1 | | 2 | PMP | 1 | | 3 | MCA | 1 | +----+------------------+-------------+ 3 rows in set (0.00 sec)
mysql>
SortedSet
SortedSet是java集合,該集合不包含任何重復(fù)的元素和元素使用提供他們的自然順序,或由一個(gè)比較器進(jìn)行排序。
一個(gè)SortedSet映射,在映射表<set>元素和java.util.TreeSet中初始化。排序?qū)傩钥梢员辉O(shè)置為一個(gè)比較器或自然順序。如果使用自然順序,那么它的迭代器遍歷的集合元素升序排列。
我們依然使用上面示例中所定義的RDBMS表,將有一個(gè)對(duì)多EMPLOYEE和證書(shū)對(duì)象之間的關(guān)系,POJO類(lèi)也是如上定義。
讓我們實(shí)現(xiàn)POJO類(lèi)員工將被用于保存EMPLOYEE表中的對(duì)象和有證書(shū)的SortedSet變量的集合。
現(xiàn)在讓我們定義另一個(gè)POJO類(lèi)對(duì)應(yīng)的表的證書(shū),這樣的證書(shū)對(duì)象可以存儲(chǔ)和檢索到的證書(shū)表。這個(gè)類(lèi)還應(yīng)該實(shí)現(xiàn)Comparable接口和compareTo方法將被用來(lái)設(shè)置sort="natural" 在映射文件(見(jiàn)下面的映射文件)的情況下,元素進(jìn)行排序。
public class Certificate implements Comparable <Certificate>{ private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getName() { return name; } public void setName( String name ) { this.name = name; } public int compareTo(Certificate that){ final int BEFORE = -1; final int AFTER = 1; if (that == null) { return BEFORE; } Comparable thisCertificate = this.getName(); Comparable thatCertificate = that.getName(); if(thisCertificate == null) { return AFTER; } else if(thatCertificate == null) { return BEFORE; } else { return thisCertificate.compareTo(thatCertificate); } } }
定義Hibernate映射文件:
讓我們開(kāi)發(fā)指定Hibernate如何定義的類(lèi)映射到數(shù)據(jù)庫(kù)表的映射文件。該<set>元素將被用來(lái)定義所使用的SortedSet集合的規(guī)則。
<?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="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="all" sort="MyClass"> <key column="employee_id"/> <one-to-many class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping>
映射文件中的格式<classname>.hbm.xml,保存映射文件中的文件Employee.hbm.xml。前面已經(jīng)熟悉了大部分的映射細(xì)節(jié),但讓我們看到了映射文件中的所有元素:
映射文檔是具有<hibernate-mapping>為對(duì)應(yīng)于每一個(gè)類(lèi)包含2個(gè)<class>元素的根元素的XML文檔。
<class>元素被用于定義數(shù)據(jù)庫(kù)表從一個(gè)Java類(lèi)特定的映射。 Java類(lèi)名指定使用class元素的name屬性和使用表屬性數(shù)據(jù)庫(kù)表名指定。
<meta>元素是可選元素,可以用來(lái)創(chuàng)建類(lèi)的描述。
<id>元素映射在類(lèi)中的唯一ID屬性到數(shù)據(jù)庫(kù)表的主鍵。 id元素的name屬性是指屬性的類(lèi)和column屬性是指在數(shù)據(jù)庫(kù)表中的列。 type屬性保存了Hibernate映射類(lèi)型,這種類(lèi)型的映射將會(huì)從Java轉(zhuǎn)換為SQL數(shù)據(jù)類(lèi)型。
id元素內(nèi)的<generator>元素被用來(lái)自動(dòng)生成的主鍵值。將生成元素的class屬性設(shè)置為原生讓Hibernate拿起無(wú)論是identity,sequence或者h(yuǎn)ilo中的算法來(lái)創(chuàng)建主鍵根據(jù)底層數(shù)據(jù)庫(kù)的支持能力。
<property>元素用于一個(gè)Java類(lèi)的屬性映射到數(shù)據(jù)庫(kù)表中的列。元素的name屬性是指屬性的類(lèi)和column屬性是指在數(shù)據(jù)庫(kù)表中的列。 type屬性保存了Hibernate映射類(lèi)型,這種類(lèi)型的映射將會(huì)從Java轉(zhuǎn)換為SQL數(shù)據(jù)類(lèi)型。
<set>元素用于設(shè)置證書(shū)和Employee類(lèi)之間的關(guān)系。我們使用cascade屬性中的<set>元素來(lái)告訴Hibernate來(lái)保存證書(shū)的對(duì)象,同時(shí)為Employee對(duì)象。 name屬性被設(shè)置為在父類(lèi)中的定義的SortedSet的變量,在我們的情況下,它是證書(shū)。排序?qū)傩钥梢栽O(shè)置為自然有自然排序,也可以設(shè)置為自定義類(lèi)實(shí)現(xiàn)為java.util.Comparator。我們已經(jīng)使用了一個(gè)類(lèi)MyClass,它實(shí)現(xiàn)為java.util.Comparator扭轉(zhuǎn)證書(shū)類(lèi)實(shí)現(xiàn)的排序順序。
<key>元素是包含外鍵的父對(duì)象,即在證書(shū)表中的列。表EMPLOYEE。
該<one-to-many>元素表示一個(gè)Employee對(duì)象涉及到很多證書(shū)的對(duì)象,并因此,證書(shū)對(duì)象必須有與父Employee有關(guān)??梢愿鶕?jù)需要使用任何和<one-to-one>,<many-to-one>進(jìn)行或<many-to-many>這個(gè)元素。
如果使用sort="natural"的設(shè)置,并不需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的類(lèi),因?yàn)樽C書(shū)類(lèi)已經(jīng)實(shí)現(xiàn)了Comparable接口和hibernate會(huì)使用compareTo(在證書(shū)類(lèi)定義為比較證書(shū)名稱(chēng))方法。但是,我們使用的是在我們的映射文件自定義的比較器類(lèi)MyClass,所以必須創(chuàng)建這個(gè)類(lèi)的基礎(chǔ)上實(shí)現(xiàn)排序算法。降序時(shí)使用這個(gè)類(lèi)在這個(gè)類(lèi)排序。
import java.util.Comparator; public class MyClass implements Comparator<Certificate>{ public int compare(Certificate o1, Certificate o2) { final int BEFORE = -1; final int AFTER = 1; /* To reverse the sorting order, multiple by -1 */ if (o2 == null) { return BEFORE * -1; } Comparable thisCertificate = o1.getName(); Comparable thatCertificate = o2.getName(); if(thisCertificate == null) { return AFTER * 1; } else if(thatCertificate == null) { return BEFORE * -1; } else { return thisCertificate.compareTo(thatCertificate) * -1; } } }
創(chuàng)建應(yīng)用程序類(lèi):
最后,我們將創(chuàng)建應(yīng)用程序類(lèi)的main()方法來(lái)運(yùn)行應(yīng)用程序。我們將使用這個(gè)應(yīng)用程序,以節(jié)省一些員工的記錄地連同證書(shū),然后我們將申請(qǐng)CRUD操作上的記錄。
import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ TreeSet set1 = new TreeSet(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ TreeSet set2 = new TreeSet(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, SortedSet cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); SortedSet certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } }
編譯和執(zhí)行后,會(huì)在屏幕上獲得以下結(jié)果,并同時(shí)記錄會(huì)在員工和證書(shū)表被創(chuàng)建??梢钥吹阶C書(shū)已排序順序相反。可以通過(guò)改變映射文件試試,只需設(shè)置sort="natural"和執(zhí)行程序,并比較結(jié)果。
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: PMP Certificate: MCA Certificate: MBA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: PMP Certificate: MCA Certificate: MBA
如果檢查員工和證書(shū)表,就應(yīng)該記錄下了:
mysql> select * from employee;
+----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec)
mysql> select * from certificate;
+----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+ | 1 | MBA | 1 | | 2 | PMP | 1 | | 3 | MCA | 1 | +----+------------------+-------------+ 3 rows in set (0.00 sec)
相關(guān)文章
詳解Java的堆內(nèi)存與棧內(nèi)存的存儲(chǔ)機(jī)制
這篇文章主要介紹了Java的堆內(nèi)存與棧內(nèi)存的存儲(chǔ)機(jī)制,包括JVM的內(nèi)存優(yōu)化和GC等相關(guān)方面內(nèi)容,需要的朋友可以參考下2016-01-01Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解
這篇文章主要為大家介紹了Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Elasticsearch QueryBuilder簡(jiǎn)單查詢(xún)實(shí)現(xiàn)解析
這篇文章主要介紹了Elasticsearch QueryBuilder簡(jiǎn)單查詢(xún)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08解決mybatis一對(duì)多查詢(xún)r(jià)esultMap只返回了一條記錄問(wèn)題
小編接到領(lǐng)導(dǎo)一個(gè)任務(wù)需求,需要用到使用resultMap相關(guān)知識(shí),在這小編記錄下這個(gè)問(wèn)題的解決方法,對(duì)mybatis一對(duì)多查詢(xún)r(jià)esultMap項(xiàng)目知識(shí)感興趣的朋友一起看看吧2021-11-11淺談Spring與SpringMVC父子容器的關(guān)系與初始化
這篇文章主要介紹了淺談Spring與SpringMVC父子容器的關(guān)系與初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08