1. Hibernate简介
Hibernate 是一个持久层的 ORM 框架。ORM映射:Object Relational Mapping
O:面向对象领域的 Object(JavaBean 对象)
R:关系数据库领域的 Relational(表的结构)
M:映射 Mapping(XML 的配置文件)
2. Hibernate 快速入门
2.1 导入需要用的jar包:
- MySQL的驱动jar包
- Hibernate开发需要的jar包
- 日志jar包
2.2 编写 Hibernate 核心的配置文件
我们需要在源代码文件夹的根目录下在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.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/syf?useSSL=false</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/syf/hibernate/model/xml/Student.hbm.xml"/>
<mapping resource="com/syf/hibernate/model/xml/School.hbm.xml"/>
<mapping class="com.syf.hibernate.model.annotation.Teacher"/>
<mapping class="com.syf.hibernate.model.annotation.SchoolAnt"/>
</session-factory>
</hibernate-configuration>
2.1 基于注解和基于XML的对象关系映射
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式。本例中,两种方法都会被使用。
- hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改为引用实体类
即把<mapping resource="com/wsw/hibernate/model/Order.hbm.xml"/>改为<mapping class="com.wsw.hibernate.model.Order" /> - 获取SessionFactory方式发生了变化:即由SessionFactory sf = new Configuration().configure().buildSessionFactory() 改为:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()
- 注解方式不需要在xxx.hbm.xml把实体类与表进行映射。而采用在实体类中进行注解。
在这个例子中,基于XML的是下面两个:
<mapping resource="com/syf/hibernate/model/xml/Student.hbm.xml"/>
<mapping resource="com/syf/hibernate/model/xml/School.hbm.xml"/>
基于Annotation时, 在Hibernate全局配置文件中使用声明映射类的方式:
<mapping class="com.syf.hibernate.model.annotation.Teacher"/>
<mapping class="com.syf.hibernate.model.annotation.SchoolAnt"/>
2.3 编写映射的配置文件和POJO类
2.3.1 基于XML
基于XML的POJO是需要配置:实体类名.hbm.xml,在本例中,Student.hbm.xml为:
<?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 package="com.syf.hibernate.model.xml">
<class name="Student" table="xml_student">
<id name="id" column="_id" type="int">
<generator class="increment"/>
</id>
<property name="name" column="_name" type="string"/>
<property name="age" column="_age" type="int"/>
</class>
</hibernate-mapping>
POJO类:
package com.syf.hibernate.model.xml;
public class Student {
private int id;
private String name;
private int age;
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 getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.3.2 基于Annotation
@Entity
@Table(name="ant_teacher")
@SequenceGenerator(name = "teacherSEQ", sequenceName = "teacherSEQ_DB")
public class Teacher {
private int id;
private String name;
private String title;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "teacherSEQ")
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 String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
2.4 测试
2.4.1 基于XML
public class SchoolTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
Configuration cfg = new Configuration();
sf = cfg.configure().buildSessionFactory();
}
@AfterClass
public static void afterClass(){
sf.close();
}
@Test
public void test() {
School s = new School();
SchoolPK pk = new SchoolPK();
pk.setId(1);
pk.setName("syf");
s.setPk(pk);
s.setAddress("Pujiang");
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
public static void main(String[] args){
beforeClass();
}
}
2.4.2 基于注解
public class TeacherTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
Configuration cfg = new Configuration();
sf = cfg.configure().buildSessionFactory();
}
@AfterClass
public static void afterClass(){
sf.close();
}
@Test
public void test() {
Teacher t = new Teacher();
t.setName("Syf");
t.setTitle("master");
Session session = sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
public static void main(String[] args){
beforeClass();
}
}
3 集成Jenkins
Jenkins是一个广泛用于持续构建的可视化web工具,就是各种项目的的“自动化”编译、打包、分发部署,将以前编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址,将代码拉取到jenkins宿主机上,进行编译、打包和发布到web容器中。Jenkins可以支持多种语言(比如:java、c#、php等等),也兼容ant、maven、gradle等多种第三方构建工具,同时跟git、svn无缝集成,也支持直接与github直接集成。Jenkins+GitHub 环境构建可以参考下面的文章:Jenkins+GitHub 环境构建。
这里我们主要用Jenkins从GitHub上拖代码,一旦有更新,就构建一次,跑Ant脚本,实现清理,编译,测试等功能,build.xml具体实现如下:
<?xml version="1.0"?>
<project name="HibernateHelloworld" default="test" basedir=".">
<property name="build.dir" value="build"/>
<property name="src.dir" value="src"/>
<property name="test.dir" value="test"/>
<property name="src.build.dir" value="build/src"/>
<property name="test.build.dir" value="build/test"/>
<path id="compile.classpath">
<fileset dir="${basedir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<path id="test.classpath">
<path refid="compile.classpath"/>
<pathelement location="lib/junit.jar"/>
<pathelement location="${src.build.dir}"/>
</path>
<target name="clean" description="clean">
<delete dir="${build.dir}"/>
</target>
<target name="init" depends="clean" description="create folders">
<mkdir dir="${src.dir}"/>
<mkdir dir="${test.dir}"/>
<mkdir dir="${src.build.dir}"/>
<mkdir dir="${test.build.dir}"/>
<copy file="${src.dir}/hibernate.cfg.xml" tofile="${src.build.dir}/hibernate.cfg.xml"/>
<copy todir="${src.build.dir}">
<fileset dir="${src.dir}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="compile" depends="init" description="compile the source">
<javac srcdir="${src.dir}" destdir="${src.build.dir}" classpathref="compile.classpath"/>
</target>
<target name="test-compile" depends="compile">
<javac srcdir="${test.dir}" destdir="${test.build.dir}" classpathref="test.classpath"/>
</target>
<target name="test" depends="test-compile">
<junit printsummary="on" haltonfailure="yes" fork="true">
<classpath>
<path refid="test.classpath"/>
<pathelement location="${test.build.dir}"/>
</classpath>
<formatter type="brief" usefile="false"/>
<batchtest>
<fileset dir="${test.dir}" includes="**/*Test.java"/>
</batchtest>
</junit>
</target>
</project>
Jenkins的配置信息如下:
主要配置了Github的地址,构建触发条件以及Build.xml文件的地址。
4 补充
本例子中,SchoolPK.java,School.java和SchoolAnt.java,SchoolAntPK.java分别是Hibernate关于复合(联合)主键映射的实现,具体实现方法见Github代码。
目前有两个文件夹:
项目名称 | 描述 |
---|---|
Hibernate | Hibernate简单实现 |
HibernateHelloWorld | Demo |
HibernateHelloWorld | Demo |