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配置文件

原文地址:https://www.cnblogs.com/xiaobaizhiqian/p/7921615.html