Hibernate的功能体验在与数据库有关的事物上,主要有两种用法:一种是建立好映射表的类,配置完配置文件后通过Hibernate自动生成表;另一种是通过存在的表反向生成工程文件。
我们先讲第一种用法
第一步新建一个普通的Java工程比方说我把它叫HibernateDemo,下载完Hibernate以后将hibernate-release-5.3.6.Final/lib/required中的包以及数据库驱动包全部拷进lib然后add to build path,然后新建.java文件和hbm.xml映射文件,目录大概如下,Address.java/Student.java/*.hbm.xml四个文件同目录,cfg.xml在src下(ps:Hibernate版本不同包名可能不同,这里用的是5.3.6版本)
Address.java
package com.martin.entity;
public class Address {
private String province;
private String phone;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Address(String province, String phone) {
super();
this.province = province;
this.phone = phone;
}
@Override
public String toString() {
return "Address [province=" + province + ", phone=" + phone + "]";
}
public Address() {
super();
}
}
Student.java
package com.martin.entity;
import java.sql.Blob;
import java.util.Date;
public class Student {
private int sid;
private String sname;
private Date birthday;
private Address address;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", birthday=" + birthday + ", address=" + address + "]";
}
public Student(int sid, String sname, Date birthday, Address address) {
super();
this.sid = sid;
this.sname = sname;
this.birthday = birthday;
this.address = address;
}
public Student() {
super();
}
}
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///imooc?useUnicode=true&characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="com/martin/entity/Address.hbm.xml"/>
<mapping resource="com/martin/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
稍微讲一点参数。connection.username/password/driver_class/url是数据库的用户名/密码/驱动/url ;
dialect是“方言”,不同的数据库有不同的方言,可以自行百度,我用的mysql5.x;
show_sql是测试方法运行的时候执行的sql语句是否在控制台输出
format_sql是控制台输出的sql语句是否排版,方便看
hibernate.hbm2ddl.auto是指每次操作数据库时的方法,create表示每次操作前,不管是读还是修改数据还是新创建表,hibernate都会先删除表再重新创建,这样的话你之前的数据就会被清除,所以一般第一次创建完表后都会将这个属性修改为update
接下来这个属性不用管先,这个跟session的获取方法有关,删了也不影响
mapping resource将你需要操作的表的hbm.xml文件路径配置好
Address.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 2018-10-31 20:21:00 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.martin.entity.Address" table="ADDRESS">
<id name="province" type="java.lang.String">
<column name="PROVINCE" />
<generator class="assigned" />
</id>
<property name="phone" type="java.lang.String">
<column name="PHONE" />
</property>
</class>
</hibernate-mapping>
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 2018-10-31 20:21:00 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.martin.entity.Student" table="STUDENT">
<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="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<component name="address" class="com.martin.entity.Address">
<property name="province" column="PROVINCE"></property>
<property name="phone" column="PHONE"></property>
</component>
</class>
</hibernate-mapping>
(其实hbm.xml/cfg.xml是靠hibernate tools自动根据.java类配置好的,至于hibernate tools这个偷懒的神器各位自行百度,没有的话自己写也是可以的)
接下来是测试方法。注意:不同版本的Hibernate的语法可能会有些区别,代码太长了,所以下面方法中的导包代码省略了
public class TestByMain {
public static void main(String[] args) {
SessionFactory sessionFactory;
Session session;
Transaction transaction;
StandardServiceRegistry standareServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(standareServiceRegistry).getMetadataBuilder().build();
SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();
sessionFactory = sessionFactoryBuilder.build();
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
Address a1 = new Address("浙江省","110");
Student s1 = new Student(1,"Martin",new Date(),a1);
//保存两个对象
session.save(s1);
session.save(a1);
//事务提交,数据库IO操作的前后必须开启/提交事务
transaction.commit();
session.close();
sessionFactory.close();
}
}
运行之后就成功了。
此外,JUnit是个好东西,姑且也把JUnit的测试代码放在这里入个门
package com.martin.test;
//JUnit会依次执行@Before,@Test,@After“注释”下的代码
public class TestByJUnit {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
StandardServiceRegistry standareServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(standareServiceRegistry).getMetadataBuilder().build();
SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();
sessionFactory = sessionFactoryBuilder.build();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void destroy() {
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void add() {
Address a1 = new Address("浙江省","110");
Student s1 = new Student(1,"Martin",new Date(),a1);
session.save(s1);
session.save(a1);
}
}
然后在add方法上右键-run as-junit test即可
写到这里了,有缘再更新hibernate反向生成的用法
转载请注明出处