zoukankan      html  css  js  c++  java
  • Hibernate5配置与使用具体解释

    转载请注明出处:http://blog.csdn.net/tyhj_sf/article/details/51851163

    引言

    Hibernate是一个轻量级的持久层开源框架,它是连接java应用程序和关系数据库的中间件,负责java对象和关于Hibernate内部对JDBC API进行封装,负责java对象的持久化。由于他封装了所有的数据訪问细节,使的业务逻辑层开发专注于实现,它是一种优秀的ORM映射工具,提供了完好的对象–关系映射服务。开发过程不依赖容器。灵活性非常大,开源无缝集成到不论什么一个java系统中。

    Hibernate5配置

    版本号

    这里写图片描写叙述
    这里是下载地址:http://hibernate.org/orm/
    涉及到訪问数据库还须要数据库驱动器相关的jar包:
    这里写图片描写叙述

    搭建使用hibernate的开发环境

    你能够创建一个Java project或者一个web project。以上的方式创建的项目均可測试hibernate环境。
    本次以创建一个web工程的方式演示搭建开发环境的具体步骤。


    1)创建一个web项目。
    这里写图片描写叙述
    2)将相关hibernate的包和数据库驱动器的包导入到例如以下图路径:
    这里写图片描写叙述
    注意:hibernate的jar包,选择例如以下指定路径下的所有jar将其导入。
    这里写图片描写叙述

    3)(在线安装eclipse的插件:hibernate tools。方便编辑”.cfg.xml”和“hbm.xml”格式的文件。安装方法若不熟可自行Google或百度,非本文重点。不再细说。


    在src目录创建hibernate.cfg.xml文件:

    <?xml version="1.0" encoding="UTF-8"?

    > <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="com/example/domain/User.hbm.xml"/> </session-factory> </hibernate-configuration>

    上面这个配置文件主要是数据库连接的相关配置,仅仅要配置成你自己的数据库设置就可以。


    对于这个maping属性:

    <mapping resource="com/example/domain/User.hbm.xml"/>

    在你创建完以下的步骤 4和5后,就能够补上,假设有多个javabean类及相应的 **.hbm.xml文件。就须要加入多个这种maping属性。

    4)创建你的项目中的javabean类,如User.java

    public class User implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 2015771159L;
    
    //  @Id
    //  @Basic(fetch=FetchType.EAGER)
    //  @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    //  @Basic(fetch=FetchType.LAZY)
    //  @Column(length=50)
        private String emailName;
    //  @Basic(fetch=FetchType.LAZY)
    //  @Column(length=50)
        private String emailPassword;
    
        public User() {
            // TODO Auto-generated constructor stub
        }
    
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getEmailName() {
            return emailName;
        }
        public void setEmailName(String emailName) {
            this.emailName = emailName;
        }
        public String getEmailPassword() {
            return emailPassword;
        }
        public void setEmailPassword(String emailPassword) {
            this.emailPassword = emailPassword;
        }
        @Override
        public int hashCode() {
            return id != null ?

    id.hashCode() : 0; } @Override public boolean equals(Object o) { if ( this == o ) { return true; } if ( !( o instanceof User ) ) { return false; } if ( id == null ) { return false; } return id.equals( ((User) o).id ); } @Override public String toString() { // TODO Auto-generated method stub return super.toString()+"[id="+id+"EmailName="+emailName+"EmailPassword="+emailPassword+"]"; }

    5)编写数据库表及字段到javabean类User的映射文件。

    这个样例中必须创建为文件名称:User.hbm.xml,能够放User类所在包中。

    <?xml version="1.0"?

    > <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-7-8 1:31:59 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.example.domain.User" table="USER"> <id name="id" type="java.lang.Long"> <column name="ID" not-null="true"/> <generator class="increment"/> </id> <property generated="never" lazy="false" name="emailName" type="java.lang.String"> <column length="50" name="EMAILNAME" not-null="false"/> </property> <property generated="never" lazy="false" name="emailPassword" type="java.lang.String"> <column name="EMAILPASSWORD"/> </property> </class> </hibernate-mapping>

    Hibernate5的使用

    接着上述的几节内容。我来说说做关键部分,hibernate的使用。

    这一部分我建议看看hibernate的官方文档。毕竟网上的样例各种hibernate版本号的样例都有。不同版本号提供的接口不同,用法也有非常多差别,并且最新的hibernate版本号的使用demo非常难找到。

    基本使用思路

    **在使用Hibernate运行持久化操作前。须要得到一个Session对象。有了Session对象,就能够以面向对象的方式保存、获取、更新和删除对象。
    Session对象能够通过SessionFactory(会话工厂类)的openSession方法来获得。


    因此还须要获取SessionFactory对象**,它通过例如以下方式获得:

    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()  
                .configure() // 默认使用src目录下的hibernate.cfg.xml进行配置,若更改了路径,要附加上包路径如:"/com/example/hibernate.cfg.xml" 
                .build();  
        try {  
            sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();  
        }  
        catch (Exception e) {  
            StandardServiceRegistryBuilder.destroy( registry );  
        } 

    或者通过例如以下方式获得:

    Configuration configuration = new Configuration();// 默认使用src目录下的hibernate.cfg.xml进行配置,若更改了路径。要附加上包路径如:"/com/example/hibernate.cfg.xml" 
            SessionFactory sf = configuration.configure().buildSessionFactory();
            Session session = sf.openSession();

    使用Junit測试搭建的hibernate开发环境

    注意測试function中示范了hibernate的用法,这能够用在实际的开发项目中。
    Userdao.java的完整源代码:

    public class UserDao {
    
        public UserDao() {
            // TODO Auto-generated constructor stub
        }
        public static SessionFactory getSessionFactoryInstance(){
            if (sessionFactory==null) {
                synchronized (SessionFactory.class) {
                    if (sessionFactory==null){
                        config=new Configuration().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml");//若不指定。默认在目录src下
                        //使用默认配合文件。hibernate.cfg.xml
                        return config.buildSessionFactory();
                        //另外一种写法。
    //                  StandardServiceRegistry standardServiceRegistry=new StandardServiceRegistryBuilder().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml").build();
    //                  Metadata metadata = new MetadataSources( standardServiceRegistry ).getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE).build();
    //                  return metadata.getSessionFactoryBuilder().build();
    
                    }
                }
            }
            return sessionFactory;
        }
    
        /**
         * @param id
         * @return
         * @throws Exception
         */
        public User queryById(long id) throws Exception {
            SessionFactory sessionFactory = HibernateConfigContext
                    .getSessionFactoryInstance();
            Session session = sessionFactory.openSession();
            Transaction transaction = null;
            User user = null;
            try {
                transaction = session.beginTransaction();
                user = (User) session.get(User.class, id);
                transaction.commit();
            } catch (Exception e) {
                // TODO: handle exception
                if (transaction != null) {
                    transaction.rollback();
                }
                throw e;
            } finally {
                session.close();
                sessionFactory.close();
            }
    
            return user;
        }
    
        /**
         * @param user
         *            首次保存会生成id
         * @throws Exception
         */
        public void save(User user) throws Exception {
            System.out.println("保存User数据");
            SessionFactory sessionFactory = HibernateConfigContext
                    .getSessionFactoryInstance();
            Session session = sessionFactory.openSession();
            Transaction transaction = null;
            try {
                transaction = session.beginTransaction();
                session.save(user);
                transaction.commit();
            } catch (Exception e) {
                // TODO: handle exception
                if (transaction != null) {
                    transaction.rollback();
                }
                throw e;
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        /**
         * @param user
         *            已知id的User实例。

    * @throws Exception */ public void update(User user) throws Exception { SessionFactory sessionFactory = HibernateConfigContext .getSessionFactoryInstance(); Session session = sessionFactory.openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); session.update(user); transaction.commit(); } catch (Exception e) { // TODO: handle exception if (transaction != null) { transaction.rollback(); } throw e; } finally { session.close(); sessionFactory.close(); } } /** * @param user * 要删除的user,已经保存到数据库的,id分配 * @throws Exception */ public void delete(User user) throws Exception { SessionFactory sessionFactory = HibernateConfigContext .getSessionFactoryInstance(); Session session = sessionFactory.openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); session.delete("User", user); transaction.commit(); } catch (Exception e) { // TODO: handle exception if (transaction != null) { transaction.rollback(); } throw e; } finally { session.close(); sessionFactory.close(); } } }

    Junit測试程序:

    public class UserTest extends TestCase {
    
        public UserTest(String name) {
            super(name);
        }
    
        protected void setUp() throws Exception {
            super.setUp();
        }
    
        protected void tearDown() throws Exception {
            super.tearDown();
        }
    
    
        public void testSave() {
            UserDao userDao=new UserDao();
            User user=new User();
            user.setEmailName("tyhj_sf@163.com");
            user.setEmailPassword("ty123456789");
            try {
                userDao.save(user);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public void testQueryById() {
            UserDao userDao=new UserDao();
            User user=new User();
            user.setId(1L);
            user.setEmailName("tyhj_sf@163.com");
            user.setEmailPassword("ty123456789");
            try {
                assertEquals(user,userDao.queryById(1));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    
        public void testUpdate() {
            UserDao userDao=new UserDao();
            User user=new User();
            user.setId(1L);
            user.setEmailName("tyhj_sf@163.com");
            user.setEmailPassword("aaasss");
            try {
                userDao.update(user);
                assertEquals(user,userDao.queryById(1));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public void testDelete() {
            UserDao userDao=new UserDao();
            User user=new User();
            user.setId(1L);
            user.setEmailName("tyhj_sf@163.com");
            user.setEmailPassword("aaasss");
            try {
                userDao.delete(user);
                assertNull(userDao.queryById(1));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    

    很多其它的数据库其它操作參照以上測试用例写就可以。Session类提供了大量方便的操作方法接口,能够參考javadoc文档使用。

  • 相关阅读:
    修改iptables防火墙规则解决vsftp登录后不显示文件目录的问题
    error: Refusing to undefine while domain managed save image exists
    linux 禁止ping
    Android图片加载框架Picasso最全使用教程3
    Android图片加载框架Picasso最全使用教程2
    Android图片加载框架Picasso最全使用教程1
    Android studio怎么修改文件名
    Android_Kotlin 代码学习
    Android Studio设置行宽、格式化断行
    使用Kotlin进行Android开发
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8413871.html
Copyright © 2011-2022 走看看