zoukankan      html  css  js  c++  java
  • Hibernate框架简介(二)基本使用增、删、改、查

    一、Hibernate框架简介

    Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具

    1.1、理解持久化

    • 瞬时状态:在程序运行的时候,有些程序数据是保存在内存中,当程序退出后,这些数据就不复存在了,所以称这些数据的状态为瞬时状态
    • 持久状态:在使用一此软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘或者数据库中,称这些数据的状态是持久状态
    • 持久化:持久化就是将程序中的数据在瞬时状态和持久状态之间转换的机制。(如:JDBC)

    1.2、对象-关系映射(ORM)

    Java是一种面象对象的设计语言。在程序运行时的数据是以对象形式存在内存中,而保存数据时,又要以对象的形式存在关系型数据库中。

    ORM简单讲:就是能在对象和关系型数据库两者之间进行数据转换的机制。Hibernate就是这样一个中间的解决方案。关系如下图

    1.3、ORM框架综述

    ORM:对象关系映射(Object Relation Mapping)

    Hibernate框架:能够实现ORM框架

    Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMap

    Hibernate框架对JDBC时行和封装,简化了数据访问层。可应用在任何使用JDBC的场合如:Servlet、JSP的WEB应用,JAVA客户端等。

     二、Hibernate下载

    官网:http://sourceforge.net/projects/hibernate/files/hibernate3/

    这里下载的是3.3.2GA,

    解压后,将根目录下的hibernate3.jar和将lib目录下全部的jar导入项目中

    同时将数据库驱动也导入这里使用Oracle 11g

    其中加入了一些其它的jar包如:JSTL包

    当然也可以用MyEclipse完全集成,不用下载

    三、Hibernate配置

     3.1、创建hibernate.cfg.xml文件.

    这是配置文件默认名.一般放在src目录下:作用指定数据库连接的信息及映射文件路径

    获取配置文件进行修改。当然如果记得了就全写也可以。在下载的Hibernate解压目录下就有配置文件模板

    hibernate-distribution-3.3.2.GA-disthibernate-distribution-3.3.2.GAproject utorialswebsrcmain esources此目录下就有,将其复制到src目录下进行修改

    <?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>
    
            <!-- Database connection settings -->
            <!-- 数据库驱动 不同的数据库不一样-->
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <!-- 数据库访问url 不同的数据库不一样-->
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <!-- 数据库连接用户名 -->
            <property name="connection.username">sa</property>
            <!--数据库连接用户名的密码  -->
            <property name="connection.password"></property>
    
            <!-- JDBC connection pool (use the built-in) -->
            <!--数据库连接池默认连接数量  -->
            <property name="connection.pool_size">2</property>
    
            <!-- SQL dialect -->
            <!--方言,不同的数据不同的版都有所不同  -->
            <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    
            <!-- Enable Hibernate's current session context -->
            <!-- Session设置 -->
            <property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property>
    
            <!-- Disable the second-level cache  -->
            <!--二级缓存  -->
            <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    
            <!-- Echo all executed SQL to stdout -->
            <!-- 在执行数据操作时,是不是在控制台显示SQL语句,true为显示 -->
            <property name="show_sql">true</property>
    
            <!-- Drop and re-create the database schema on startup -->
            <!--根据数据库表得到类,根据类到表  -->
            <property name="hbm2ddl.auto">create</property>
            <!--对类的配置文件映射  -->
            <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>
            <mapping resource="org/hibernate/tutorial/domain/Person.hbm.xml"/>
    
        </session-factory>
    
    </hibernate-configuration>

    这里暂时只做数据库的连接配置Oracle的

    <?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>
    
            <!-- Database connection settings -->
            <!-- 数据库驱动 不同的数据库不一样-->
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <!-- 数据库访问url 不同的数据库不一样-->
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <!-- 数据库连接用户名 -->
            <property name="connection.username">accp</property>
            <!--数据库连接用户名的密码  -->
            <property name="connection.password">accp</property>
    
        </session-factory>
    
    </hibernate-configuration>

    3.2、创建持久化类和映射文件

    也就是创建实体类的配置文件如:Login.hbm.xml(Login为类名),并在hibernate.cfg.xml文件下方</session-factory>前面中添加映射文件路径

    1、在数据库中创建一张表

    create table login
    (
           username   varchar2(20)  primary key,
           password   varchar2(20)
    );

    2、创建Login实体类

    package com.pb.entity;
    /*
     * 登录实体类
     */
    public class Login {
            private String username;
            private String password;
            
            
            public String getUsername() {
                return username;
            }
            public void setUsername(String username) {
                this.username = username;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            
            
            
    }

    3、在实体类的同一个包下创建实体类的配置文件

    <?xml version='1.0' encoding='utf-8'?>
     <!-- 这里与hibernate.cfg.xml配置文件不一样注意 -->
    <!DOCTYPE hibernate-mapping PUBLIC    
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 这里与hibernate.cfg.xml配置文件不一样注意 -->
    
    
    <hibernate-mapping>
     <!--类名和数据库中的表名相对应 哪个用户 -->
        <class name="com.pb.entity.Login" table="LOGIN" schema="accp">
          <!-- id代表主键  column列表 type代表数据类型-->
            <!-- 类中的属性 -->
            <id name="username" type="java.lang.String">
             <!-- 表中哪一个字段或者是列名 -->
                <column name="USERNAME" length="20" />
                <!--生成的方式  assigned代表由外部外部程序负责生成,在 save() 之前必须指定一个-->
            <!--  native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。-->
                <generator class="assigned" />
            </id>
            <!-- 密码段设置 -->
            <!--类中的名字和数据类型  -->
            <property name="password" type="java.lang.String">
            <!-- 表中的字段名,长度可心不要,是不为空true为不能为空,false是可以为空 -->
                <column name="PASSWORD" length="20" not-null="true"/>
            </property>
            <!--如果还有其它的属性,设置方式与password一样设置  -->
        </class>
    </hibernate-mapping>

    在src下的配置文件中添加映射

    <?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>
    
            <!-- Database connection settings -->
            <!-- 数据库驱动 不同的数据库不一样-->
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <!-- 数据库访问url 不同的数据库不一样-->
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <!-- 数据库连接用户名 -->
            <property name="connection.username">accp</property>
            <!--数据库连接用户名的密码  -->
            <property name="connection.password">accp</property>
            <!--为实体类配置文件添加映射  -->
            <mapping resource="com/pb/entity/Login.hbm.xml"/>
        </session-factory>
    
    </hibernate-configuration>

    3.3、创建Hibernate连接工具类

    Hibernater主要接口和类:

    Configuration

    SessionFactory:DriverManager

    Session:Connection

    Transaction

    Query:Statement和PreparedStatement

    在下载的包中有提供好的一个比较简单的工具类

    package com.pb.until;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    
        private static final SessionFactory sessionFactory;
    
        static {
            try {
                // Create the SessionFactory from hibernate.cfg.xml
                sessionFactory = new Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
    }

    这个比较,也可以增加一功能

    相比较MyEclipse提供的一个比较完美

    package com.pb.until;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Configures and provides access to Hibernate sessions, tied to the
     * current thread of execution.  Follows the Thread Local Session
     * pattern, see {@link http://hibernate.org/42.html }.
     */
    public class HibernateSessionFactory {
    
        /** 
         * Location of hibernate.cfg.xml file.
         * Location should be on the classpath as Hibernate uses  
         * #resourceAsStream style lookup for its configuration file. 
         * The default classpath location of the hibernate config file is 
         * in the default package. Use #setConfigFile() to update 
         * the location of the configuration file for the current session.   
         */
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
        private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private  static Configuration configuration = new Configuration();    
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
    
        static {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
        private HibernateSessionFactory() {
        }
        
        /**
         * Returns the ThreadLocal Session instance.  Lazy initialize
         * the <code>SessionFactory</code> if needed.
         *
         *  @return Session
         *  @throws HibernateException
         */
        public static Session getSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
    
            if (session == null || !session.isOpen()) {
                if (sessionFactory == null) {
                    rebuildSessionFactory();
                }
                session = (sessionFactory != null) ? sessionFactory.openSession()
                        : null;
                threadLocal.set(session);
            }
    
            return session;
        }
    
        /**
         *  Rebuild hibernate session factory
         *
         */
        public static void rebuildSessionFactory() {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    
        /**
         *  Close the single hibernate session instance.
         *
         *  @throws HibernateException
         */
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
    
            if (session != null) {
                session.close();
            }
        }
    
        /**
         *  return session factory
         *
         */
        public static org.hibernate.SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        /**
         *  return session factory
         *
         *    session factory will be rebuilded in the next call
         */
        public static void setConfigFile(String configFile) {
            HibernateSessionFactory.configFile = configFile;
            sessionFactory = null;
        }
    
        /**
         *  return hibernate configuration
         *
         */
        public static Configuration getConfiguration() {
            return configuration;
        }
    
    }

    根据需要选择

    四、Hibernate的持久化操作的步骤

    4.1、读取并散板配置文件

    Configuration config=new Configuration().configure();

    4.2、读取并解析映射信息,创建SessionFactory

    SessionFactory factory=config.buildSessionFactory();

    4.3、打开session

    Session session=factory.openSessin();

    4.4、开始一个事务(增、删、改操作必须,查询操作可选)

    Transaction tran=session.beginTransaction();

    4.5、操作化操作

    session.save(对象);
    session.update(对象);
    session.delete(对象);
    session.get(主键之类的);

    4.6、提交事务

    tran.commit();

    4.7、关闭session

    session.close();

    五、Hibernate使用

     实现增、删、改、查的类

    package com.pb.LoginDao;
    
    import java.util.List;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import com.pb.entity.Login;
    import com.pb.until.HibernateSessionFactory;
    import com.pb.until.HibernateUtil;
    
    public class LoginDao {
    
        /*
         * 增加
         */
        public void save(Login login) {
            // 得到Session
            Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction tran = null;
            // 也可以
            // Session session=new
            // Configuration().configure().buildSessionFactory().openSession();
            try {
                // 打开事务
                tran = session.beginTransaction();
                // 执行数据添加
                session.save(login);
                // 提交事务
                tran.commit();
                System.out.println("用户信息添加成功");
            } catch (HibernateException e) {
                // 事务回滚
                tran.rollback();
                e.printStackTrace();
                System.out.println("用户信息添加失败");
            } finally {
                // 关闭session
                session.close();
            }
    
        }
    
        /*
         * 修改根据用户名
         */
        public void update(Login login) {
            // 得到Session
            Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction tran = null;
            // 也可以
            // Session session=new
            // Configuration().configure().buildSessionFactory().openSession();
            try {
                // 打开事务
                tran = session.beginTransaction();
                // 执行数据添加
                session.update(login);
                // 提交事务
                tran.commit();
                System.out.println("用户信息修改成功");
            } catch (HibernateException e) {
                // 事务回滚
                tran.rollback();
                e.printStackTrace();
                System.out.println("用户信息修改失败");
            } finally {
                // 关闭session
                session.close();
            }
        }
    
        /*
         * 修改根据用户名修改密码
         */
        public void delte(Login login) {
            // 得到Session
            Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction tran = null;
            // 也可以
            // Session session=new
            // Configuration().configure().buildSessionFactory().openSession();
            try {
                // 打开事务
                tran = session.beginTransaction();
                // 执行数据添加
                session.delete(login);
                // 提交事务
                tran.commit();
                System.out.println("用户信息删除成功");
            } catch (HibernateException e) {
                // 事务回滚
                tran.rollback();
                e.printStackTrace();
                System.out.println("用户信息删除失败");
            } finally {
                // 关闭session
                session.close();
            }
        }
    
        /*
         * 查询一查询全部用户
         */
        public List<Login> QueryALL() {
            // 使用myeclipse提供的工具类来得到session
            Session session = HibernateSessionFactory.getSession();
            // 建立查询
            Query query = session.createQuery("from Login");
            // 查询重到List集合
            List<Login> list = query.list();
            // 关闭session
            session.close();
            // 返回结果集合
            return list;
        }
    
        /*
         * 查询二 查询指定的用户名的
         */
        public Login QueryByName(String username) {
            // 使用myeclipse提供的工具类来得到session
            Session session = HibernateSessionFactory.getSession();
            // 建立查询
            Query query = session.createQuery("from Login l where l.username=?");
            // 占位
            query.setString(0, username);
    
            // 查询返回唯一
            Login login = (Login) query.uniqueResult();
            // 关闭session
            session.close();
            // 返回结果集合
            return login;
        }
    
        /*
         * 查询三,模糊查询
         */
        public List<Login> QueryLikeName(String username) {
            // 使用myeclipse提供的工具类来得到session
            Session session = HibernateSessionFactory.getSession();
            // 建立查询
            Query query = session
                    .createQuery("from Login l where l.username like ?");
            // 占位
            query.setString(0, "%" + username + "%");
            // 查询重到List集合
            List<Login> list = query.list();
            // 关闭session
            session.close();
            // 返回结果集合
            return list;
        }
    
    }

    测试类:

    package com.pb.test;
    
    import java.util.List;
    
    import com.pb.LoginDao.LoginDao;
    import com.pb.entity.Login;
    
    public class Test {
    
        public static void main(String[] args) {
            //声明LoginDao对象
            LoginDao loginDao=new LoginDao();
    //声明对象并赋初始值
            Login login=new Login();
            login.setUsername("Jack");
            login.setPassword("blue");
            //执行添加
            loginDao.save(login);
            //执行修改
            login.setUsername("Jack");
            login.setPassword("while");
            loginDao.update(login);
            //执行删除
            loginDao.delte(login);
            
            System.out.println("=========查询全部========");
            //查询全部
            List<Login> list=loginDao.QueryALL();
            for (Login log : list) {
                System.out.println("用户名:"+log.getUsername()+"    密码:"+log.getPassword());
            }
            
            System.out.println("=========精确查询========");
            //查询一个用户
            Login lg=loginDao.QueryByName("ffff");
            if(lg!=null){
                System.out.println("用户名:"+lg.getUsername()+"   密码:"+lg.getPassword());
            }else{
                System.out.println("没有此用户");
            }
            System.out.println("=========模糊查询========");
            //模糊查询
            List<Login> likelist=loginDao.QueryLikeName("t");
            for (Login lo : likelist) {
                System.out.println("用户名:"+ lo.getUsername()+"    密码:"+ lo.getPassword());
            }
        }
    
    }
  • 相关阅读:
    计算十位数以内的数的反数
    用Python做一个简单的小游戏
    Python的发展历史及其前景
    监控相关总结
    前端css学习_Day15
    常用命令总结
    mysql常用命令总结
    Python之Paramiko、前端之html学习_Day14
    Python操作redis、memcache和ORM框架_Day13
    Python连接msyql、redis学习_Day12
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4325961.html
Copyright © 2011-2022 走看看