Hibernate简单使用

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&amp;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反向生成的用法


 

转载请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值