hibernate 基本步骤

来源:互联网 发布:从程序员到软件工程师 编辑:程序博客网 时间:2024/05/06 04:08

工程结构:

所有实验步骤:

建立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();
        }
    }

}

一对一主键关联:

就是工资卡IdCare表的id既是主键,也是作为关联Person表的外键(id非自动增长)。

Person表主键id自动增长。

 

bean关系:

 

正向工程:

 反向工程(通过建立表来生成配置文件):

 

逆向生成步骤:

 

最终生成的xml:


0 0
原创粉丝点击