Hibernate的学习一__简单的小例子

来源:互联网 发布:根据姿态角求旋转矩阵 编辑:程序博客网 时间:2024/06/03 01:31

        Hibernate是一个ORM框架,主要的作用就是将数据持久化.

       做一个小例子,演示Hibernate如何进行ORM,对象关系映射和数据持久化.

        主要的步骤介绍下,建立实体类User,然后给User建立Hibernate的映射文件,然后在核心配置文件中添加该配置文件,接着新建数据库,创建表,然后写测试代码saveload(get),保存和查询.

        建立实体类很简单,就是建一个普通的类,不需要继承任何类和接口,因为Hibernate没有侵入性.User类有5个属性,id,namepassword,还有createTimeexpireTime,名字,密码,创建日期和失效日期.然后就生成getset方法即可.

public class User {private String id;private String name;private String password;private Date createTime;private Date expireTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExpireTime() {return expireTime;}public void setExpireTime(Date expireTime) {this.expireTime = expireTime;}}

      创建hbm.xml配置文件才是重头戏.新建User.hbm.xml映射文件.标签主要是在<hibernate-mapping>中编写,然后有<class>标签还配置类和表的映射,其中包含主键和普通属性,<id>配置主键,<property>配置普通的属性.对于主键还有生成策略,N,常用的是nativeuuid.

<hibernate-mapping> <class name="com.lyl.hibernate.User"> <id name="id"> <generator class="uuid"></generator> </id> <property name="name"></property> <property name="password"></property> <property name="createTime"></property> <property name="expireTime"></property> </class> </hibernate-mapping>

        User的配置文件就这样配置好了.然后放进核心hibernate.cfg.xml文件中.需要配置在<hibernate-configuration>标签中,<session-factory>标签中,配置连接的数据库,包括驱动,路径,用户名和密码,最后就是mapping,将之前配置好的User.hbm.xml添加到<mapping>标签中.还有就是dialect方言,MySQL,所以生成的SQL语句都是MySQL.以及为了查看方便将show_sql改为true,这样就可以看到hibernate生成的sql语句.

<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">lyl</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  <property name="hibernate.show_sql">true</property> <mapping resource="com/lyl/hibernate/User.hbm.xml"/> </session-factory></hibernate-configuration>

        然后就是在MySQL中建立库hibernate_session,create databasehibernate_session;就可以建立库了,然后usehibernate_session;就可以转到该库.之后就是创建表,根据配置好的User.hbm.xml,读取标签,然后生成表.

         建立ExportDB.java工具类用它来生成表.

public class ExportDB {public static void main(String[] args){//需要解析xml文件Configuration cfg = new Configuration().configure();SchemaExport export = new SchemaExport(cfg);export.create(true,true);}}

       new Configuration().configure()获取hibernate.cfg.xml文件,然后将获取到的配置文件给位于org.hibernate.tool.hbm2ddl.SchemaExport;路径下的方案导入,用它的create(true,true)创建表.

       然后执行,表就可以建立了.建表的SQL语句就是这样的,创建表User,id,name,password,creatTime,expireTime,主键是id.

drop table if existsUsercreate table User(id varchar(255) not null, name varchar(255), password varchar(255), createTimedatetime, expireTime datetime, primary key (id))

      表也建立完了,可以去试试将数据保存到数据库中了.利用sessionsave将赋好值的User对象存入数据库中.建立单元测试类SessionTest,继承TestCase来存储.

      新建User对象,然后给Name,Password,赋值,然后保存,提交,hiberante发出一条sql语句(Hibernate: insert into User (name, password, createTime, expireTime,id) values (?, ?, ?, ?, ?))就可以在数据库中插入一条记录,并查询出来了.

public void testSave1(){Session session = null;try{session = HibernateUtils.getSession();session.beginTransaction();User user = new User();user.setName("流逝");user.setPassword("123");session.save(user);session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}}

       为了复用,session的获取,close写在了HibernateUtils的工具类中.对于获取,因为session是从sessionFactory中获取的,hibernate.cfg.xml的配置文件就配置了session-factory,所以读取hibernate.cfg.xml的配置文件,获取sessionFactory,然后factory打开session,就可以了.而关闭,只要传入的session是否不为null,并且isOpen,就可以关了.

//Hibernate的工具类public class HibernateUtils { private static SessionFactory factory;static{ try {//创建Configuration对象,读取hiberante.cfg.xml文件Configuration cfg = new Configuration().configure();//利用cfg,获取SessionFactoryfactory = cfg.buildSessionFactory(); }catch(Exception e) { e.printStackTrace(); } }public static Session getSession(){return factory.openSession();}public static void closeSession(Session session){if(session != null){if(session.isOpen()){session.close();}}} }

        Load的代码就是

public void testLoad1(){Session session = null;try{session = HibernateUtils.getSession();session.beginTransaction();    User user=(User)session.get(User.class, "8a82a71b482b29a301482b29a43d0001");    System.out.println("user.Name = "+user.getName()+"  user.password = "+user.getPassword()); session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}}

   运行效果

Hibernate: selectuser0_.id as id0_0_, user0_.name as name0_0_, user0_.password as password0_0_,user0_.createTime as createTime0_0_, user0_.expireTime as expireTime0_0_ fromUser user0_ where user0_.id=?user.Name = 流逝  user.password = 123

        根据id查询User表中记录,得出结果.load改为get此段代码的运行效果一样.只是load是支持延迟加载的,若是User中存在集合类型的数据,那么load是不会加载出来的,get则会.因为load是延迟加载,只有用的时候才会去查的.而默认就是lazytrue,支持延迟加载.

        以上就是一个Hiberante的简单小例子,建立的实体类是个Pojo对象,因为没有继承任何类,只是一个简单的java对象.所以移植性会很好.而Hiberante主要的功能是将OR映射,使我们更加彻底的面向对象,可以看到代码中并没有写任何一句的select,insert语句,就可以将数据进行查询和保存.我们只是写了一个类,然后对这个类的对象继续操作,save的是对象,load的也是对象.而唯一要做的就是写个映射文件,让hibernate知道是如何映射对应表的.

0 0
原创粉丝点击