最近公司要重新整一套可以供不同team的人上传测试虚拟寂摸版,在Lab中自动发现新build,自动部署,运行,发出通知的系统。原来的系统是在一个Web应用中包含了所有的逻辑,扩展性差,不够稳定。目前我负责把原来的Web层相关的内容剥离出来。
由于原来的系统在Web上使用了Spring+Hibernate来实现数据的持久化,本人这方面接触较少,所以正好乘此机会从头学习一下。
码工们都知道,计算机学习的最好方法就是找一些简单的例子,把程序包起来。所以首先就是通过搭一个简单的使用Hibernate的程序(针对MySQL)
要使用Hibernate,主要要用到以下一些包:
1:ejb3-persistence-1.0.jar
2:hibernate-3.6.1.jar
3:mysql-connector-java-5.1.15-bin.jar
4:slf4j-api-1.6.1.jar,slf4j-simple-1.6.1.jar
5:c3p0-0.9.1.jar
Hibernate,其实就是把数据库中的表结构映射为Java类,也就是常说的POJOs。首先我们建一个类:
package com.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
这个类和数据库中的student表对应:
Field | Type | Null | Key | Default
-------+-------------+------+-----+---------
id | int(4) | NO | PRI | 0
name | varchar(20) | YES | | NULL
age | int(4) | YES | | NULL
然后编辑Student.hbm.xml,用来把这个Java类和表建立映射关系
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.hibernate.model">
<class name="Student" table="student">
<id name="id"></id>
<property name="name"/>
<property name="age"/>
</class>
</hibernate-mapping>
下面就是编辑hibernate.cfg.xml,用来描述一些数据库连接等方面的问题。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password">abcd1234.</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="connection.autoReconnect">true</property>
<property name="connection.autoReconnectForPools">true</property>
<property name="connection.is-connection-validation-required">true</property>
<!-- JDBC connection pool c3p0-->
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.automaticTestTable">C3P0TestTable</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/hibernate/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
到这里,Hibernate的配置就基本已经完成了。接下来我们通过一个Test类来看一下简单的使用:
package com.hibernate.model;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import java.util.List;
import java.util.Iterator;
public class StudentTest {
public static void main(String[] args) {
StudentTest.AddUser();
StudentTest.ListUser();
}
public static void AddUser(){
Student s = new Student();
s.setId(2);
s.setAge(23);
s.setName("jack2");
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
sf.close();
}
public static void ListUser(){
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
List users = session.createQuery("from Student").list();
System.out.println("Found" + users.size() + "users");
Iterator i = users.iterator();
while(i.hasNext()){
Student s = (Student)i.next();
System.out.println(s.getName() + ":" + s.getAge());
}
session.close();
}
}
在输出屏幕上可以看到相应的执行过程。查看数据库,发现数据已经成功插入。