zoukankan      html  css  js  c++  java
  • (三)hibernate单表操作


    0. 贴上节hbm文件

    <?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 2017-3-6 16:43:30 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
        <class name="hibernate_01.Students" table="STUDENTS">
            <id name="sid" type="int">
                <column name="SID" />
                <generator class="assigned" />
            </id>
            <property name="sname" type="java.lang.String">
                <column name="SNAME" />
            </property>
            <property name="gender" type="java.lang.String">
                <column name="GENDER" />
            </property>
            <property name="birthday" type="java.util.Date">
                <column name="BIRTHDAY" />
            </property>
            <property name="address" type="java.lang.String">
                <column name="ADDRESS" />
            </property>
        </class>
    </hibernate-mapping>
    
    
    1.单一主键
     <id name="sid" type="int">
                <column name="SID" />
                <generator class="assigned" />
            </id>
    单一主键:指表中由某一列来充当主键
    assigned 由java应用程序负责生成(手工赋值)
    native 由底层数据库自动生成提示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。另外,即使手动赋值主键,也不会起作用。
    <generator class="native" />mysql 中为AUTO_INCREMENT PRIMARY KEY
    只要generator主键生成方式设置为native,即使设置了id,也是没有作用的。hibernate会调用数据库的ID增长方式
    assigned 当为int时 默认0 其他默认null
    2.基本类型(易出错)
         第一列是hibernate映射类型,  第二列是java类型的格式,    第三列是对应的标准sql类型的格式。
    需要注意的:

    <property name="birthday" type="java.util.Date">
                <column name="BIRTHDAY" />
            </property>
    date 表示日期:YYYY-MM-dd
    time 表示时间:hh:mm:ss
    tiemstamp 时间戳: yyyy-MM-dd hh:mm:ss
    另外,映射的数据类型设置会决定最后数据库中的类型。
    比如我们在Java程序中使用的是java.util.Date类型定义变量Birthday。但在映射关系的配置文档中对应的type改成date类型,那么最后保存在数据库
    的Birthday类型就是date,
    也就是YYYY-MM-dd,而非java.util.Date(或者timestamp)的YYYY-MM-dd hh:mm:ss。
     3.对象类型
    3.1 常见类型

    java中clob是大文本数据类型,blob是能存储大量二进制的数据类型
    3.2 hibernate写入对象类型数据
    3.2.1 演示用Blob类型将照片文件存储进数据库

         3.2.2 演示如何从数据库读取存入的图片,即Blob数据。(在此之前需要将配置文件中的create改为update,防止未读取就删除)
     <property name="hbm2ddl.auto">update</property>

     4.组件属性 
    组件属性:
    <component>标签表示,实体中成员变量的类型是用户自定义的类型。按hibernate的规则,基础类型使用<property>标签,而非基础类型就使用<component>标签。
    <component>标签中,name表示这个对象的名字,class表示这个对象是哪个用户自定义类型。其中的property是指,用户自定义类型中的成员变量。
    而声明了<component>的那个成员变量,在数据库中的表示方式是:这个用户自定义类型的成员变量中的成员变量,将以列的方式显示在数据库中。
    即有该变量有三个成员变量,那么数据库中的表就多出对应的三列。
    5.单表操作CRUD实例
    save& update& delete& get/load
        @Test
        public void testGetStudents(){
            Students s=(Students) session.get(Students.class, 1);  //.get(查询表对应的类对象, 查询对象的主键);
            System.out.println(s.toString());
            
        }
        
        @Test
        public void testLoadStudents(){
            Students s=(Students) session.load(Students.class, 1);  //.load(查询表对应的类对象, 查询对象的主键);
            System.out.println(s.toString());
            
        }
        
        @Test
        public void testUpdateStudents(){
            Students s=(Students) session.get(Students.class, 1);  
            s.setGender("女");
            session.update(s);
            session.flush();
        }
        
        @Test
        public void testDeleteStudents(){
            Students s=(Students) session.get(Students.class, 2);  
            System.out.println(s.toString());
            session.delete(s);
            session.flush();
        }
    get/load(查询单个记录)的区别:
    1.  在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
        load方法会在调用之后返回一个代理对象。该代理对象只保存了实体对象的主键ID,直到使用对象的非主键属性时才会发出sql语句。
    2.  查询数据库中不存在的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException
    查询所有记录:
     @Test
        public void testQueryAllStudents(){
             String hql="from Students";
            List<Students> studentsList=session.createQuery(hql).list();
            for(Students students:studentsList){
                System.out.println(students.toString());
            }
        
        }
        
    问题:查询能执行,但update&delete不能执行,后添加flush()强制输出sql语句也不成功。。(控制台输出删改语句,但表结构一直没变)
    解决办法:开启事务http://www.cnblogs.com/zjfjava/p/6593398.html
    小结:




  • 相关阅读:
    转自苦大师:移动测试Appium之API手册
    怨念与发飙
    Asp.Net 2.0新特性
    汉字是最优美的文字
    加入cnblog留念
    Thrift之TProtocol类体系原理及源码详细解析之其他协议类和总结
    Thrift之TProtocol类体系原理及源码详细解析之二进制协议类TBinaryProtocolT(TBinaryProtocol)
    linux内核bug问题排查过程详细报告
    Thrift之TProtocol类体系原理及源码详细解析之紧凑协议类TCompactProtocolT(TCompactProtocol)
    Thrift之TProcess类体系原理及源码详细解析
  • 原文地址:https://www.cnblogs.com/zjfjava/p/6593183.html
Copyright © 2011-2022 走看看