zoukankan      html  css  js  c++  java
  • Hibernate入门

    本文主要是Hibernate的简单入门

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装.

    优点

    1、比较简单
    2、数据缓存:一级缓存 二级缓存 查询缓存
    3、移植性比较好

    缺点

    1、因为sql语句是hibernate内部生成的,所以程序员干预不了,不可控
    2、如果数据库特别大,不适合用hibernate

    hibernate加载流程

    • 创建对象,获得hibernate配置文件
    /**
             * 创建configuration对象
             */
            Configuration configuration = new Configuration();
            configuration.configure();
            /**
             * 加载hibernate的配置文件
             */
            //configuration.configure("");
            sessionFactory = configuration.buildSessionFactory()

    序列化类

    package cn.itcast.hibernate.sh.domain;
    
    import java.io.Serializable;
    
    
    /**
     * 对象的序列化的作用:让对象在网络上传输,以二进制的形式传输
     * @author Think
     * Serializable标示接口
     */
    public class Person implements Serializable{
        private Long pid;
        private String pname;
    
        public Person(){}
    
        public Person(String pname){
            this.pname = pname;
        }
    
        public Long getPid() {
            return pid;
        }
        public void setPid(Long pid) {
            this.pid = pid;
        }
        public String getPname() {
            return pname;
        }
        public void setPname(String pname) {
            this.pname = pname;
        }
        public String getPsex() {
            return psex;
        }
        public void setPsex(String psex) {
            this.psex = psex;
        }
        private String psex;
    }

    映射文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <!-- 
            用来描述一个持久化类
            name  类的全名
            table 可以不写  默认值和类名一样 
            catalog  数据库的名称  一般不写
         -->
    
        <class name="cn.itcast.hibernate.sh.domain.Person">
            <!-- 
                id描述标示属性  和数据库中的主键对应
                name  属性的名称
                column 列的名称
             -->
            <id name="pid" column="pid" length="200" type="java.lang.Long">
                <!-- 
                    主键的产生器
                      就该告诉hibernate容器用什么样的方式产生主键
                 -->
                <generator class="increment"></generator>
            </id>
            <!-- 
                property描述一般属性
             -->
            <property name="pname" column="pname" length="20" type="string">
            </property>
    
            <property name="psex" column="psex" length="10" type="java.lang.String"></property>
        </class>
    </hibernate-mapping>

    hibernate配置文件

    <?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只能连接一个数据库
        -->
    <session-factory>
        <!-- 
            数据库的用户名
        -->
        <property name="connection.username">root</property>
        <!-- 
            密码
        -->
        <property name="connection.password">root</property>
        <!-- 
            url
        -->
        <property name="connection.url">
            jdbc:mysql://localhost:3306/hibernate
        </property>
        <!-- 
            作用:根据持久化类和映射文件生成表(动态生成表)
            validate      只验证不生成
            create-drop   启动时生成表,结束时删除表
            create           启动时生成
            update           启动时判断是否对应,不对应则创建,对应则验证(常用)
        -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 
            显示hibernate内部生成的sql语句
        -->
        <property name="show_sql">true</property>
        <mapping resource="cn/itcast/hibernate/sh/domain/Person.hbm.xml" />
    
    </session-factory>
    </hibernate-configuration>

    获得sessionFactory,进行CRUD操作

    /**
    1、hibernate把数据库的链接信息、把映射文件的信息、持久化类的信息
    2、sessionFactory是由单例模式产生的
    3、一般情况下一个hibernate应该有一个数据库链接
    4、该类本身是线程安全的
    5、是一个重量级类
    **/
    sessionFactory = configuration.buildSessionFactory();
    //  打开了一个数据库的链接,准备进行数据库的操作
    sessionFactory.openSession();
    
    //用session进行CRUD操作 

    CRUD实现

    package cn.itcast.hibernate.sh.test;
    
    import java.io.Serializable;
    import java.util.List;
    
    
    
    
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.itcast.hibernate.sh.domain.Person;
    import cn.itcast.hibernate.sh.utils.HiberanteUtils;
    
    
    public class PersonTest extends HiberanteUtils{
        @Test
        public void testSavePerson(){
            Session session=sessionFactory.openSession();
            Transaction transaction=session.beginTransaction();
    
            Person person=new Person();
            person.setPname("zj");
            person.setPsex("girl");
            session.save(person);
    
            transaction.commit();
            session.close();
        }
    
        @Test
        public void testQueryPerson()
        {
            Session session=sessionFactory.openSession();
            List<Person> personList=session.createQuery("from Person").list();
            for(Person person:personList)
            {
                System.out.println(person.getPname());
            }
            session.close();
        }
    
        @Test
        public void testQueryPersonByID()
        {
            Session session=sessionFactory.openSession();
            /**
             * 按照主键的方式查询数据库中的记录
             * 第二个参数的类型必须与持久类中标示符的类型一致
             */
    
            Person person=(Person) session.get(Person.class,1L);
            System.out.println(person.getPsex());
            session.close();
        }
    
        /**
         * hibernate内部会检查标示符,看标示符中的值在数据库相应的表中有没有对应的记录,如果有,则删除
         */
        @Test
        public void testDeletePerson(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
            /**
             * 方法一
             * 1、根据id把值从数据库中查找出来
             * 2、把对象删除掉
             */
            Person person = (Person)session.get(Person.class, 2L);
            session.delete(person);
    
            /**
             * 方法二
             * 1、新创建一个person对象
             * 2、给person对象的标示符赋值
             * 3、调用session.delete方法删除
             */
            //Person person = new Person();
            //person.setPid(2L);
            //session.delete(person);
            transaction.commit();
            session.close();
        }
    
        @Test
        public void testUpdatePerson(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            /**
             * 1、根据id把持久化对象提取出来
             * 2、进行修改
             * 3、执行upate操作
             */
            Person person = (Person)session.get(Person.class, 1L);
            person.setPsex("不详");
    //      Person person = new Person();
    //      person.setPid(1L);
            session.update(person);
            transaction.commit();
            session.close();
        }
    
        @Test
        public void testIdentity(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
            Person person = (Person)session.get(Person.class, 1L);
            Person person2 = new Person();
            //person2.setPid(1L);
            session.update(person2);
            transaction.commit();
            session.close();
        }
    
    }

    注意

    利用session.get方法产生一个对象,调用的是默认的构造函数,所以一个持久化类中必须有一个默认的构造函数

    各种主键生成器

    package cn.itcast.hibernate.sh.generator;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.hibernate.sh.domain.Person;
    import cn.itcast.hibernate.sh.utils.HiberanteUtils;
    
    public class GeneratorTest extends HiberanteUtils{
        /**
         *  Hibernate: select max(pid) from Person
            Hibernate: insert into Person (pname, psex, pid) values (?, ?, ?)
    
            说明:
               1、主键的类型必须是数字
               2、主键的生成是由hibernate内部完成的,程序员不需要干预
               3、这种生成机制效率比较低
         */
        @Test
        public void testIncrement(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            Person person = new Person();
            person.setPname("上海第一期班长");
            person.setPsex("女");
    
            /**
             * 参数必须持久化对象
             */
            session.save(person);
    
            transaction.commit();
            session.close();
        }
    
        /*
         * Hibernate: insert into Person (pname, psex) values (?, ?)
         * 说明
         *   1、新的主键的产生是由数据库完成的,并不是由hibernate或者程序员完成的
         *   2、该表必须支持自动增长机制
         *   3、效率比较高
         */
        @Test
        public void testIdentity(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            Person person = new Person();
            person.setPname("上海第一期班长");
            person.setPsex("女");
    
            /**
             * 参数必须持久化对象
             */
            session.save(person);
    
            transaction.commit();
            session.close();
        }
    
        /**
         * 由程序设置主键
         */
        @Test
        public void testAssigned(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            Person person = new Person();
            person.setPname("上海第一期班长");
            person.setPsex("女");
    
            /**
             * 参数必须持久化对象
             */
            session.save(person);
    
            transaction.commit();
            session.close();
        }
    
        /**
         * 1、UUID是由hibernate内部生成的
         * 2、主键的类型必须是字符串
         */
        @Test
        public void testUUID(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
    
            Person person = new Person();
            person.setPname("上海第一期班长");
            person.setPsex("女");
    
            /**
             * 参数必须持久化对象
             */
            session.save(person);
    
            transaction.commit();
            session.close();
        }
    
    
        /**
         * hibernate内部是根据主键生成器来生成主键的,在客户端设置主键不一定起作用,在assigned的时候起作用
         */
        @Test
        public void testIdentity_ID(){
            Session session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
            Person person = new Person();
            person.setPid(1L);
            person.setPname("aa");
            person.setPsex("aa");
            session.save(person);
            transaction.commit();
            session.close();
        }
    }

    完成

  • 相关阅读:
    【刷题】洛谷 P1501 [国家集训队]Tree II
    【刷题】BZOJ 2816 [ZJOI2012]网络
    【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测
    【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
    【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
    【刷题】BZOJ 2190 [SDOI2008]仪仗队
    【刷题】BZOJ 2005 [Noi2010]能量采集
    【刷题】BZOJ 3262 [HNOI2008]GT考试
    (74)Wangdao.com第十三天_Object 对象_属性描述对象
    (73)Wangdao.com第十二天_JavaScript consol 对象与控制台
  • 原文地址:https://www.cnblogs.com/jjx2013/p/6223684.html
Copyright © 2011-2022 走看看