概述
Hibernate避免了繁杂的sql语句,通过ORM(对象到关系映射)即持久化类(可以写一个javaBean)还有映射文件(*.hbm.xml)、配置文件(hibernate.cfg.xml),把对数据库的连接(就不必像我们平时写jdbc那样创建很多对象麻烦了),对数据库表的字段的增删改查等(不用sql语句很方便),自动完成。下面是一个入门的栗子(大家下载个hibernate tool会方便很多):
这是我自己工程的路径图:
(貌似图太大了)
首先我在src下建立配置文件-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.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=Userlist</property>
<property name="connection.username">sa</property>
<property name="connection.password">123456</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(一次做成,以后常用,其他文件需要连接数据库,就在mapping那里引入就行)
然后,写持久化类Person.java:
public class Person {
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
//...其他的get和set方法就省略了
public Person(Integer id ,String name, String sex) { //方便我直接赋值,加一个有参的构造方法
super();
this.id=id;
this.name = name;
this.sex = sex;
}
public Person() { //有一个有参的,就不能少写无参的
super();
}
@Override
public String toString() { //用来打印看成果
return "Person [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
之后就是映射文件Person.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 2020-3-25 11:13:11 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="Test.Person" table="PERSON">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" />
</property>
</class>
</hibernate-mapping>
最好加一个测试类加(可以在src右键New直接生成Junit test case,就不用又写一个main了),
HiberTest:
package Test;
import javax.imageio.spi.ServiceRegistry;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
import junit.framework.TestCase;
public class HiberTest extends TestCase {
public void test(){
SessionFactory sessionFactory=null;
Configuration configuration=new Configuration().configure();
sessionFactory =configuration.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
Person person=new Person(1,"Tom", "man");
System.out.print( person.toString());
session.save(person);
transaction.commit();
session.close();
sessionFactory.close();
}
}
运行:
过程也用sql打印出来,再看看我的数据库,自动生成了一个表:
一些重要方法
- session:
1、save(): 通过buildsessionFactory()方法我们实例化了SessionFactory,从而得到session,session负责所有持久化操作。通过session.save(“xx”)把xx实例转为持久状态
2|get/load():
get()和load()都可以装载持久化对象,
修改一点点上面test代码:
person=(Person)session.get(Person.class,new Integer("1"));
System.out.println("getId:"+person.getId());//get方法
从打印来看,程序立马执行了一次查询即立马加载数据库先,再来打印id;
现在看load():
person=(Person)session.load(Person.class,new Integer("1"));
System.out.println("loadId:"+person.getId());
load则是打印了id先,因为load需要先返回一个对象代理,就是慢加载,因为之前已经创建了person且已经转为持久状态,所有能返回一个代理对象,这里我们用1唯一标记了这个person,如果没有这个对象,会抛出错误。这里会先输出再去加载数据库。
- 一级缓存:
person=(Person)session.get(Person.class,new Integer("1"));
System.out.println("第一次装载对象");
Person person2=(Person)session.get(Person.class,new Integer("1"));
System.out.println("第二次装载对象");
运行:
可见第二次加载,程序没有再去查询数据库,第二次根据第一次的结果来直接运行。