Hibernate学习笔记初级

1、hibernate.cfg.xml常用配置:
    1.1 hibernate.show_sql:运行时的sql语句输出到控制台,编码阶段便于测试
    1.2 hibernate.format_sql:输出控制台的sql是否需要排版格式化
    1.3 hbm2ddl.auto:可以帮助由java代码生成数据库脚本,进而生成具体的表结构。
        (
        create(常用):每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类
        再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
        update(常用):最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构
        但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,
        是要等 应用第一次运行起来后才会。
        create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,
        表就自动删除。
        validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,
        不会创建新表,但是会插入新值。
        )
    1.4 hibernate.default_schema:默认的数据库前缀
    1.5 hibernate.dialect:配置Hibernate的数据库方言,Hibernate针对特殊数据库优化  
    参考链接:https://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html

2、session
    2.1 hibernate执行流程:
        ![这里写图片描述](http://img.blog.csdn.net/20171225163958253?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamo1NDY2MzA1NzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    2.2 session简介:可以理解为操作数据库的一个对象,相当于之前的jdbc对象,但是不建议直接操作jdbc,
    session与connection是多对一的关系,每个session都有一个与之对应的connection,一个connection
    不同时刻可以被多个session使用。

    2.3 session常用操作数据库方法:save()、update()、delete()、createQuery()等。

    2.4 session详解:
        2.4.1:获得session:
            2.4.1.1 openSession
            2.4.1.2 getCurrentSession
            [注]:如果使用getCurrentSession,需要在hibernate.cfg.xml中配置:
            如果是本地事务(jdbc事务)
            <property name="hibernate.current_session_context_class">thread</property>
            如果是全局事务(jta事务)
            <property name="hibernate.current_session_context_class">jta</property>
            【如果不配置就会抛出异常:org.hibernate.HibernateException: No CurrentSessionContext configured!】

        2.4.2 :openSession与getCurrentSession区别:
            2.4.2.1:getCurrentSession在事务提交或回滚后都会自动关闭,openSession需要手动来关闭,
            如果使用openSession多次之后而没有关闭,会使连接池溢出。

            2.4.2.2:openSession每次创建新的session,而getCurrentSession使用现有的session,
            getCurrentSession有点像单例模式,而openSession每次都是新new对象



3、transaction:
    3.1 hibernate对数据库操作默认都是封装在事务中的,默认都是不自动提交事务的。所以用session保存对象
    时候,如果不开启事务并手动提交事务,对象并不会真正保存在数据库。如果你想让hibernate像jdbc那样自动
    提交事务,必须调用save、update之前调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式,并且要session.flush(),不设置session.flush()也不行
    (注:通常并不推荐这样做,如下:)
        User user = new User(3,"lxj","pass");
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setAutoCommit(true);
            }
        });
        session.save(user)
        session.flush();//表示将sql真正输出



4、关系映射文件(hbm)常用配置:
    <hibernate-mapping
        schema="schemaName"   //模式名字
        catalog="catalogName"  //目录名称
        default-cascade = "cascade_style"  //级联风格
        default-access = "field|property|ClassName"  //访问策略
        default-lazy="true|false"  //加载策略
        package="packagename"       //默认包名
    />

    <class
        name="ClassName"   //对象关系映射,映射的是哪个类
        table="tableName"  //把这个类映射成数据库哪张表
        batch-size="N" //一次可以抓取多少条记录
        where="condition"  //某些条件,比如在抓取的时候根据某些条件去抓取
        entity-name="EntityName"   //实体类可以映射成很多表,一般很少用
    />

    <id   //主键
        name="propertyName"  //映射哪个属性
        type="typeName"  // 属性类型
        column="columnName"  //对应数据库字段名称
        length="length"  //长度
        <generator class="generatorClass"/> //主键生成策略
        ![这里写图片描述](http://img.blog.csdn.net/20171225181610549?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamo1NDY2MzA1NzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    />


5、单表操作
    5.1 单一主键assigned(由java应用程序负责生成主键):
               native(mysql:自增,oracle:序列..):
        例:
         <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="assigned" />
        </id>
         <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="native" />
        </id>   

    5.2 基本类型:
        ![这里写图片描述](http://img.blog.csdn.net/20171225183041254?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamo1NDY2MzA1NzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

        ![这里写图片描述](http://img.blog.csdn.net/20171225183129966?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamo1NDY2MzA1NzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

        <property name="birthday" type="java.util.Date">   //2017-12-25 18:30:00
            <column name="birthday" />
        </property>
        <property name="birthday" type="timestamp">   //2017-12-25 18:30:00
            <column name="birthday" />
        </property>
        <property name="birthday" type="date">   //2017-12-25
            <column name="birthday" />
        </property>
        <property name="birthday" type="time">   //18:33:00
            <column name="birthday" />
        </property>

   5.3  对象类型
       ![这里写图片描述](http://img.blog.csdn.net/20171225204334390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamo1NDY2MzA1NzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

     @Test //写入数据库Blog
    public void testWriteBlob(){

        transaction = session.beginTransaction();
        User user = new User();
        user.setUsername("张三丰");
        user.setPassword("张三丰的密码");
        File f = new File("E:"+File.separator+"4545.jpg");
        try {
            InputStream input = new FileInputStream(f);
            Blob picture = Hibernate.getLobCreator(session).
            createBlob(input,input.available());
            user.setPicture(picture);
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Test  //从数据库读出blob写到磁盘
    public void testReadBlog(){
        User user = session.get(User.class,1);
        Blob picture = user.getPicture();
        try{
            InputStream input = picture.getBinaryStream();
            File f = new File("E:"+File.separator+"test.jpg");
            OutputStream out = new FileOutputStream(f);
            byte[] buffer = new byte[input.available()];
            input.read(buffer);
            out.write(buffer);
            input.close();
            out.close();
        }catch (Exception e){
            e.printStackTrace();
        }


    5.4 组件属性
        5.4.1 定义:实体类中的某个属性属于用户自定义的类的对象
        <component name="address" class="Address">
            <property name="postcode" column="POSTCODE"></property>
            <property name="phone" column="PHONE"></property>
        </component>
        上面表示:在User实体类中有一个address这个属性,address是Address类的一个对象,
        Address这个类中有3个成员变量:postcode、phone对应表中POSTCODE、PHONE字段。
        那就把User实体类中的address这个属性称为组件属性。


    5.5 单表CRUD:
    @Test
    public void save(){

        User user = new User(1,"张三丰","密码");
        session.save(user);
    }

    @Test
    public void get(){
        User user = session.get(User.class,1);
        System.out.println(user.getId());
    }

    @Test
    public void load(){
        User user = session.load(User.class,1);
        System.out.println(user.getId());
    }

    @Test
    public void update(){
        User user = session.get(User.class,1);
        user.setUsername("张三丰改变了");
        session.update(user);
    }


    @Test
    public void delete(){
        User user = session.get(User.class,1);
        session.delete(user);
    }

    获取单条数据get、load区别:
        区别一
        get :在不考虑缓存情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象,
        不管你是否使用这个对象,都会像数据库发出。(恶汉)
        load:在调用后返回一个代理对象,代理对象实际只保存了主键id,直到使用该对象非主键时,才会

        区别二
        查询数据库数据不存在,get返回null,load抛异常(ObjectNotFoundException)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值