美文网首页
Hibernate学习日记(一)

Hibernate学习日记(一)

作者: SherlockBlaze | 来源:发表于2017-02-28 17:18 被阅读0次

    hibernate4的优势:

    对跨数据库、事务封装、ORM映射、延迟加载等细节技术提供了完善的解决方案,同时也对一些在程序开发中容易忽略的问题进行了良好的封装和规划。

    1. 通过使用ORM(Object-Relational Mapping)映射,以Bean的形式操作数据库中的记录
    2. 强大的一级、二级缓存机制结合数据库连接池POOL,使CURD的操作效率得到很大提升
    3. 可以将系统中大量的SQL语句放入XML中进行统一管理,方便项目的总体设计及维护修改
    4. 项目融入Hibernate后,可以更加地面向OOP编程,以面向对象的方式思考程序的结构框架

    可以点击链接下载hibernate最新版: hibernate官网

    持久化、持久层、ORM

    持久化就是把数据保存在可掉电的存储介质上。持久层的设计目标是为整个项目提供一个衔接高低层、统一、安全和并发的数据持久机制,完成对各种数据库进行持久化的编程工作,并为系统业务逻辑层提供服务。数据持久层提供了数据访问的方法,不需要程序员手动写程序去访问数据持久层,专注于业务逻辑的开发。并且能在不同的项目中重用映射框架,大大简化了数据增、删、改、查等功能的开发。而ORM的概念是数据持久层的一种子实现,它通过映射的机制,把数据库中的一条记录当成一个java的一个class(Bean)处理。在CURD的处理上真正实现了面向对象开发,大大缩短了后期软件的维护周期。

    Hibernate实战小程序

    假设数据库中有一个用户表,有如下几个字段:ID,name,sex,address,school,email
      我们需要这样一个实体类:

    class MyBean implements Serializable{
      private String id;
      private String name;
      private String sex;
      private String address;
      private String school;
      private String email;
    
      public MyBean(){}
    
      //...省略getter、setter方法
    }
    

    需要注意的是:实体类必须要继承java.io.serializable方法,而且需要有个参数为空的构造方法。

    实战小程序的起点:

    本文使用的IDEA构建Java程序,然后使用Hibernate的方式操控Mysql数据库

    首先新建一个表,下面是我所建表的结构,表名为userinfo
        +---------+--------------+------+-----+---------+----------------+
        | Field   | Type         | Null | Key | Default | Extra          |
        +---------+--------------+------+-----+---------+----------------+
        | id      | int(11)      | NO   | PRI | NULL    | auto_increment |
        | name    | varchar(40)  | NO   |     | NULL    |                |
        | sex     | char(4)      | NO   |     | NULL    |                |
        | address | varchar(100) | YES  |     | NULL    |                |
        | school  | varchar(100) | YES  |     | NULL    |                |
        | email   | varchar(50)  | YES  |     | NULL    |                |
        +---------+--------------+------+-----+---------+----------------+
    
    创建与数据库表表项对应的Bean,也就是类
    import java.io.Serializable;
    
    /**
     * Created by Sherlock on 2/28/2017.
     */
    public class UserBean implements Serializable{
        /*ID,name,sex,address,school,email*/
        private int user_id;
        private String user_name;
        private String sex;
        private String address;
        private String school;
        private String email;
    
        public UserBean(){
    
        }
    
        public void setUser_id(int id){
            this.user_id = id;
        }
        public void setUser_name(String name){
            this.user_name = name;
        }
        public void setSex(String sex){
            this.sex = sex;
        }
        public void setAddress(String address){
            this.address = address;
        }
        public void setSchool(String school){
            this.school = school;
        }
        public void setEmail(String email){
            this.email = email;
        }
    
        public int getUser_id(){
            return this.user_id;
        }
        public String getUser_name(){
            return this.user_name;
        }
        public String getSex(){
            return this.sex;
        }
        public String getAddress(){
            return this.address;
        }
        public String getSchool(){
            return this.school;
        }
        public String getEmail(){
            return this.email;
        }
    }
    
    配置数据库信息,注意数据库连接数据的正确性,也就是hibernate.cfg.xml文件
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
        <property
                name="hibernate.connection.username">root</property>
        <property
                name="hibernate.connection.password">sa</property>
        <property
                name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property
                name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_stu?useSSL=true</property>
        <property
                name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
        <mapping resource="hibernate.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>
    
    然后配置相应的hibernate.hbm.xml
    <?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>
        <class name="com.blaze.hibernate_stu.beans.UserBean" table="userinfo">
            <id name="user_id" type="java.lang.Integer">
                <column name="id"/>
            </id>
            <property name="user_name" type="java.lang.String">
                <column name="name"/>
            </property>
            <property name="sex" type="java.lang.String">
                <column name="sex"/>
            </property>
            <property name="address" type="java.lang.String">
                <column name="address"/>
            </property>
            <property name="school" type="java.lang.String">
                <column name="school"/>
            </property>
            <property name="email" type="java.lang.String">
                <column name="email"/>
            </property>
        </class>
        <!--ID,name,sex,address,school,email-->
    </hibernate-mapping>
    
    再然后通过一个类来生成Configuration对象,并且构建出SessionFactory对象最后得到Session。我们通过Transaction事务对象来完成进行事务操作,注意使用Session对象来进行save操作,使用Transaction对象来提交事务。
    import com.blaze.hibernate_stu.beans.UserBean;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Created by Sherlock on 2/28/2017.
     */
    public class GetSession {
        private Configuration configuration = null;
        private SessionFactory sessionFactory = null;
        private Session session = null;
        private Transaction transaction = null;
    
        private SessionFactory getSessionFactory(){
            configuration = new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
            return sessionFactory;
        }
    
        public Session backSession(){
            return getSessionFactory().openSession();
        }
    
        public void saveUserInfo(UserBean user){
            backSession();
            try{
                session = backSession();
                //开启事务
                transaction = session.beginTransaction();
                //存储数据
                session.save(user);
                //提交事务
                transaction.commit();
            }catch(Exception e){
                transaction.rollback();
                e.printStackTrace();
            }finally{
                if(session != null){
                    session.close();
                }
            }
    
        }
    }
    

    一定要注意的是,如果在添加过程中出现异常,我们必须通过Transaction对象对上面操作进行滚回,所以rollback的操作是很必要的。而且要在finally中添加关闭Session对象的程序段,以保证可用资源的正常回收,避免资源的浪费。

    一个Main类来启动上面的程序
    import com.blaze.hibernate_stu.beans.UserBean;
    import com.blaze.hibernate_stu.factory_class.GetSession;
    
    /**
     * Created by Sherlock on 2/28/2017.
     */
    public class Main {
        public static void main(String[] args){
             UserBean user = new UserBean();
             user.setUser_name("Sherlock");
             user.setAddress("address");
             user.setEmail("sherlockblaze@gmail.com");
             user.setSex("男");
             user.setSchool("jilin University");
    
             new GetSession().saveUserInfo(user);
        }
    }
    
    总结:
    因为程序很简单,我们主要注意SessionFactory是线程安全,而Session不是线程安全这两个问题。也就是说我们在程序中对Session对象的访问要特别注意,如果盲目用多个线程访问Session对象,那么会导致Session对象存储紊乱。然后就是对本文的说明,最后的小程序我没有使用逆向工程生成什么DAO等等一些原先应该有的类,理由是因为我不会用IDEA来逆向,也许我后面会百度补上一篇博客。结束。

    相关文章

      网友评论

          本文标题:Hibernate学习日记(一)

          本文链接:https://www.haomeiwen.com/subject/ttzxgttx.html