hibernate 基本步骤 <一>
工程结构:
所有实验步骤:
建立java工程
1.导入包
2.建立一个对应与数据库的类Student。里面的属性和数据库中的字段对应。
3.在上面Student类所在的目录下建立映射文件。配置对象-关系映射文件:Student.hbm.xml //名称不确定,随意!最好放在bean中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.huasoft.domain">
<!-- 不指定table默认以类为依据,创建student表 (第一个字母小写)-->
<class name="Student">
<id name="id" >
<generator class="native"></generator> <!-- 自动增长 -->
</id>
<property name="name" length="20" column="myname"></property> <!--类的属性和数据库字段对应关系,默认不写column就以属性为数据库字段列-->
<property name="sex"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
4.在src下加入Hibernate配置文件(指定数据库连接密码和用户):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 >
<!--指定方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--指定数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hbm_first</property>
<!-- 指定数据用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 指定数据库密码 -->
<property name="hibernate.connection.password">ai2212935</property>
<!-- 中断输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 加载指定映射文件 -->
<mapping resource="com/huasoft/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.引入mysql的驱动包,hibernate只能生成表,不能生成数据库,打开sql自己创建数据库。
6.建立一个类Client.java,用来生成表(读取配置文件,连接,)。
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
//生成表
public class Client {
public static void main(String[] args){
try {
Configuration cfg=new Configuration().configure();
//根据配置信息生成表的工具类
SchemaExport export=new SchemaExport(cfg);
//工具类产生表:第一个参数,创建表显示在控制台,第二个参数:允许将脚本配置导入数据库。
export.create(true, true);
} catch (Exception e) {
}
}
}
7.创建一个带有主函数类Test,用来对数据库进行操作,获取增删该查
i
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
import com.huasoft.domain.Student;
//对生成的数据库进行底层操作
public class Test {
public static void main(String[] args) {
try {
Configuration cfg=new Configuration().configure();//读取配置文件
/**
* hibernate 4.0之后版本获取方式,使用带有参数的buildSessionFactory()获取sessionFactory对象
*/
ServiceRegistryBuilder srb = new ServiceRegistryBuilder();
SessionFactory factory=cfg.buildSessionFactory(srb.applySettings(cfg.getProperties()).buildServiceRegistry());
/**老版本获取sessionFactory对象,buildSessionFactory()
SessionFactory factory=cfg.buildSessionFactory();
*/
Session session=factory.openSession();
Transaction tx=session.getTransaction();
tx.begin();
Student student=new Student();
student.setAge(20);
student.setName("艾广然 ");
student.setSex("男");
session.save(student);
tx.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.单元测试(允许建立多个方法,每一个方法作为程序的运行接口,不再局限于main,做测试用):
引入架包junit.jar
为了区分,建立一个source src,建立一个com.huasoft.test包,包中的HbmTest类extends TestCase类 。
方法名必须以test开头,可以实现多个方法的测试。
由于我们不需要每次执行其中的方法都去建立一个SessionFactory,所以我们把
Configuration cfg=new Configuration().configure();//读取配置文件
SessionFactory factory=cfg.buildSessionFactory();//创建factory对象。
这两句话创建的factory在hbmUtil中单例模式建立,在HbmTest类中就不需要每次都创建对象了。
hbmUtil单例模式:
package com.huasoft.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
public class hbmUtil {
private static final SessionFactory sesionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
/*
* 4.0之后新版本获取方式。sessionFactory对象
*/
Configuration cfg = new Configuration().configure();
ServiceRegistryBuilder srb = new ServiceRegistryBuilder();
return cfg.buildSessionFactory(srb.applySettings(cfg.getProperties()).buildServiceRegistry());
/*
* 老版本获取方式 sessionFactory对象
* Configuration().configure().buildSessionFactory();
*/
} catch (Throwable ex) {
System.out.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sesionFactory;
}
}
HbmTest类中(对底层的操作):
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.huasoft.domain.Student;
import com.huasoft.util.hbmUtil;
import junit.framework.TestCase;
public class HbmTest extends TestCase {
//插入保存
public void testSave(){
SessionFactory factory=null;
Session session=null;
Transaction tx=null;
try {
factory=hbmUtil.getSessionFactory();
session=factory.openSession();
tx=session.getTransaction();
//开启事物
tx.begin();
Student student=new Student();
student.setAge(21);
student.setName("艾广然 ");
student.setSex("男");
session.save(student);
//提交事物
tx.commit();
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
e.printStackTrace();
}finally{
session.close();
}
}
//查询某一个,使用get或者load方法
public void testLoad(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
//要加载的类型, 序列化(基本类型都实现了序列化,id)
Student student=(Student) session.load(Student.class, 1);
System.out.println(student.getName()+" "+student.getAge());
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//查询多个
public void testQuery(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
//操作的是对象 ,from 类名
Query query=session.createQuery("from Student");
List list=query.list();
for (Iterator<Student> iterator = list.iterator(); iterator.hasNext();) {
Student student = iterator.next();
System.out.println(student.getName()+" "+student.getAge());
}
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//更新
public void testUpdate(){
try {
SessionFactory factory=hbmUtil.getSessionFactory();
Session session=factory.openSession();
Transaction tx=session.getTransaction();
tx.begin();
Student student=(Student) session.get(Student.class, 1);
student.setName("小狗1");
session.update(student);
tx.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}