创建一个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配置文件