zoukankan      html  css  js  c++  java
  • Hibernate---数据操作示例BY实体映射文件

    创建一个Student.java类:该类需要一个无参的构造函数,以及属性的get/set方法

    public class Student implements Serializable {
    
        private static final long serialVersionUID = 2257468553009291835L;
        
        private int id;
        private String name;
        private int age;
        
        public Student() { }
        
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
    }

    创建一个Student.java类的映射文件Student.hbm.xml:该xml文件需要与实体类放在同一个包下

    <?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-11-29 14:45:28 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
        <class name="com.hibernate.study.entity.Student" table="STUDENT" dynamic-insert="true" dynamic-update="true">
            <id name="id" type="int">
                <column name="ID" />
                <generator class="identity" />
            </id>
            <property name="name" type="java.lang.String">
           <!-- not-null属性,true表示不能为空,false表示可以为空 -->
    <column name="NAME"default="''" /><!-- 此处default中的两个表示字符串的单引号千万不能省略 --> </property> <property name="age" type="int"> <column name="AGE" not-null="false" /> </property> </class> </hibernate-mapping>

     dynamic-insert=true、dynamic-update=true:class标签中这两个属性用于动态生成sql语句,即优化sql代码,提高执行sql效率。默认值为false

    举例说明:

    添加对象时

    没有设置dynamic-insert值,如果该例子中添加的student对象没有name值,SQL语句仍然是insert into students (age, name)  values (?, ?),并且保存到数据库中的student记录没有保存name默认值。

    若设置dynamic-insert值为true如果该例子中添加的student对象没有name值,那么SQL语句则是insert into students (age)  values (?),并且保存到数据库中的student记录保存了name默认值。

    修改对象时

    没有设置dynamic-insert值,如果该例子中只修改了student对象的name值,SQL语句仍然是update students set name=?, age=? where id = ?;

    若设置dynamic-insert值为true如果该例子中只修改了student对象的name值,那么SQL语句则是update students set name=? where id = ?;

    特别注意:dynamic-insert添加记录时,设置了default="' '默认值的字段(属性)不能设置not-null非空属性。not-null=true则表示该字段不能为空,在运行时,dynamic-insert不生效,非空字段为空,会报错。

    generator属性值:

    • assigned

    主键由外部程序负责生成,在   save()   之前指定一个。

    • hilo

    通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

    • seqhilo

    与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。

    • increment

    主键按数值顺序递增。适用于Oracle。

    • identity

    主键按数值顺序递增。适用于DB2、SQL   Server、MySQL。

    • sequence

    采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。

    • native

    由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。

    • uuid.hex

    由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。

    • uuid.string

    与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。

    • foreign

    使用另外一个相关联的对象的标识符作为主键。

    <id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现。

    Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。

    identity :由底层数据库生成标识符(自动增长),返回的标识符是 long, short 或者int类型的。

    sequence :hibernate根据底层数据库序列生成标识符,返回的标识符 是long, short或者 int类型的。

    hilo     :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符。

    uuid.hex :用一个128-bit的UUID算法生成32位字符串类型的标识符。

    native   :根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

    assigned :让应用程序在save()之前为对象分配一个标示符。

    foreign :使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

    配置Hibernate配置文件hibernate.cfg.xml(数据库连接信息),将该文件放到src目录下

    <!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License: 
        GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the 
        lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. -->
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!-- 配置数据库的方言 -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
            <!-- 驱动程序名 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <!-- 数据库名称 -->
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateTest</property>
            <!-- 用户名 -->
            <property name="hibernate.connection.username">root</property>
            <!-- 密码 -->
            <property name="hibernate.connection.password">123456</property>
    
            <!-- 显示SQL语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化输出SQL语句 -->
            <property name="format_sql">true</property>
            
            <property name="hbm2ddl.auto">create</property><!-- 在实际情况中,该值应为update -->
            <!-- 与实体映射文件关联 -->
            <mapping resource="com/hibernate/study/entity/Student.hbm.xml" />
            
        </session-factory>
    </hibernate-configuration>

    一个测试类

    public class StudyTest {
    
        private static SessionFactory sessionFactory; // 会话工厂对象
        private static Session session;
        private static Transaction transcction;
    
        public static void main(String[] args) {
            // 创建配置对象
            Configuration config = new Configuration().configure();
            // 创建会话工厂对象
            sessionFactory = config.buildSessionFactory();
            // 会话对象
            session = sessionFactory.openSession();
            // 开启事务
            transcction = session.beginTransaction();
            // 生成学生对象
            Student stu = new Student("疾风剑豪", 10);
            session.save(stu); // 保存对象到数据库
            transcction.commit(); // 提交事务
            session.close(); // 关闭会话
            sessionFactory.close(); // 关闭会话工厂
        }
    
    }

    至此还需要一个log4j.properties配置文件

  • 相关阅读:
    微服务负载均衡技术
    dubbo 协议注册中心
    dubbo 元数据中心
    @Autowired 写在构造方法上
    onchange事件 is not defined
    转:JNDI的本质及作用
    The valid characters are defined in RFC 7230 and RFC 3986报错处理
    FOR XML PATH 简单介绍
    ROW_NUMBER() OVER函数的基本用法
    java和js中JSONObject,JSONArray,Map,String之间转换
  • 原文地址:https://www.cnblogs.com/xiaobaizhiqian/p/7921615.html
Copyright © 2011-2022 走看看