1.所用软件:
(1)eclipse java ee IDE
(2)MySQL数据库
2.eclipse中引入相应jar包:
1)build path中引入hibernate的jar包
2)引入mysql连接java的jar包
3.写hibernate配置文件
将文件命名为hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE hibernate-configuration PUBLIC 4 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 5 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 6 7 <hibernate-configuration> 8 <session-factory> 9 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="connection.username">root</property> 11 <property name="connection.password"></property> 12 <property name="connection.url">jdbc:mysql:///hibernate</property> 13 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 14 <property name="show_sql">true</property> 15 <property name="format_sql">true</property> 16 <property name="hbm2ddl.auto">update</property> 17 <mapping resource="com/denise/hibernate/model/Student.hbm.xml" /> 18 <mapping class="com.denise.hibernate.model.Teacher" /> 19 </session-factory> 20 </hibernate-configuration>
session-factory的属性中,connection.username以及connection.password是MySQL数据库中自己的用户名和密码,比如我的用户名是root,密码没有设置;而connection.url指明数据库的地址,写法可以有多种形式,因为我连接的数据库是localhost下的hibernate数据库,所以可以简写地址如上。
最后两项mapping,是对模型的映射,resource是传统的映射方式,后面跟类文件的地址;class是使用注解的方式映射,后面跟类名。为方便理解,可以先创建好模型类再写该条语句。
4.数据库建立相应的表
在连接的数据库中建立两张表,分别名为student和teacher。student的字段有id name age,teacher 的字段有 id name title,两张表的id都设为主键。
如果使用的是命令行客户端的MySQL,可以用如下sql语句创建:
use hibernate;
create table student(id int primary key, name varchar(20), age int);
create table teacher(id int primary key, name varchar(20), title varchar(10));
如果使用的是图形化界面的MySQL,则创建过程更简单。
5.创建对应数据库表的model类
先说明,创建与数据库表对应的java类后的步骤,是将数据库与java类连接,即映射。有两种映射方式,一是用映射文件映射,二是使用注解映射。Student类采用的是前者,Teacher采用的是后者。注意看两者的不同。
Student类:
1 package com.denise.hibernate.model; 2 3 public class Student { 4 private int id; 5 private String name; 6 private int age; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getAge() { 20 return age; 21 } 22 public void setAge(int age) { 23 this.age = age; 24 } 25 26 }
Teacher类:
1 package com.denise.hibernate.model; 2 3 import javax.persistence.Entity; 4 import javax.persistence.Id; 5 6 @Entity 7 public class Teacher { 8 private int id; 9 private String name; 10 private String title; 11 12 @Id 13 public int getId() { 14 return id; 15 } 16 public void setId(int id) { 17 this.id = id; 18 } 19 public String getName() { 20 return name; 21 } 22 public void setName(String name) { 23 this.name = name; 24 } 25 public String getTitle() { 26 return title; 27 } 28 public void setTitle(String title) { 29 this.title = title; 30 } 31 32 }
每个属性对应表中每个字段,此处字段名与表名相同。再添加setter getter方法。
6.映射
1)映射文件映射
在Student类同个包下,创建Student.hbm.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 2015-7-19 11:31:50 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.denise.hibernate.model.Student" table="STUDENT"> <!-- 数据库表名不区分大小写 --> <id name="id" type="int"> <!-- 映射主键 --> <column name="ID" /> <generator class="assigned" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="age" type="int"> <column name="AGE" /> </property> </class> </hibernate-mapping>
事实上,此处type可以省略。colume name和表名一致,也可省略。
2)注解映射
不需要添加其他文件。
7.编写测试类测试
public void mainTest(){ Student s = new Student(); s.setId(002); s.setName("Lily"); s.setAge(33); Teacher t = new Teacher(); t.setId(2011); t.setName("Kim"); t.setTitle("中级"); Configuration cfg = new Configuration(); SessionFactory sf = cfg.configure().buildSessionFactory(); Session session = sf.openSession(); session.beginTransaction(); session.save(s); session.getTransaction().commit(); session.close(); sf.close(); }
当前,buildSessionFactory其实已被弃用,最新办法可以很轻易查到。
用junit运行该方法,并在数据库中查看表中数据是否有更新。
另,当前的顺序为,先建表,再写模型类,最后映射。实际上顺序可以任调,主要看开发者自身的意愿。