初入Hibernate框架<一>
需要的工具从官网下载: hibernate.org
Hibernate框架实际上就是:对象关系映射:通过描述对象和数据库之间映射的元数据,操作数据库,将Java程序中的对象自动持久化到数据库(自己不用写sql语句)。
是一个将持久化类与数据库表相映射的工具。
入门示例:
第一步 先建一个Java工程导入使用hibernate最小必要包。 —-lib/required
第二步 在src目录下创建配置文件hibernate.cfg.cml
第三步 编写一个会话工厂
注意:
Hibernate中的session不能关也关不了,和sessionFactory也不能关
新建一个值对象,在domain包下面建立一个Student.hbm.xml,映射文件,用来将值对象里面的属性与数据库的每一列对应。
后面附上需要的数据库创建语句——–
配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 该配置文件站的立场是Object, 去配置自己和 数据库表之间的映射关系 -->
<!-- 根 hibernate-mapping-->
<hibernate-mapping package="cn.hncu.demo.domain">
<class name="Student" table="students" catalog="hib">
<!-- id标记是指Student类中的属性变量,该属性是表主键字段对应 -->
<id name="studId" type="java.lang.String">
<!-- column标记是指数据库表中的哪一列(字段) -->
<column name="id" length="8"></column>
</id>
<!-- 只有主键字段对应的属性变量才能用id,其它字段对应的属性变量都用property -->
<property name="studName" type="java.lang.String">
<column name="name" length="40"></column>
</property>
<property name="age" type="java.lang.Integer">
<column name="age"></column>
</property>
<property name="depId" type="java.lang.String">
<column name="deptId" length="8"></column>
</property>
</class>
</hibernate-mapping>
然后写一个在SRC下的配置文件 hibernate.cfg.xml:
告诉hibernate要怎样链接数据库,将你的连接信息给它,还有你对值对象的映射配置也要在此配置
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>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hib</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- SQL dialect方言:告诉它你是用的什么数据库语言-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 其他在此用不上,就省略了-->
<!-- 一定要把我们写的对象映射文件配置进来(可以配置多个),否则没法使用Hibernate的ORM功能 -->
<mapping resource="cn/hncu/demo/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
链接完 之后,写个类似于C3P0Ppool的Util,用来获取他的SessionFactory
HibernateUtil:
public class HibernateUtil {
//单例
private static SessionFactory sessionFactory =null;
private static ThreadLocal<Session> t = new ThreadLocal<Session>();
static{
//类似于C3P0连接池
try {
Configuration config = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( config.getProperties() ).build();
sessionFactory = config.buildSessionFactory(serviceRegistry);
} catch (HibernateException e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() throws HibernateException{
Session session = t.get();
if(session == null || !session.isOpen()){
//没有sessionFactory哪来的session
session=(sessionFactory!=null) ?sessionFactory.openSession() : null;
t.set(session);
}
return session ;
}
//关闭与数据库的会话
public static void closeSession() {
t.set(null);
}
}
最后就是测试是否成功的操作数据库:
public class StudentManager {
public static void main(String[] args) {
//来自手册的方式---新测结果:不行
Session session = HibernateSessionFactory.getSession();
session.beginTransaction(); //开启事务
Student stud = new Student();
stud.setStudId("S006");
stud.setStudName("刘备");
stud.setAge(23);
stud.setDepId("D003");
session.save(stud);
Student stud2 = new Student();
stud2.setStudId("S007");
stud2.setStudName("张飞");
stud2.setAge(23);
stud2.setDepId("D003");
session.save(stud2);//如存在主键重复则会进行事务回滚
session.getTransaction().commit();//事务提交 (如果出异常,Hibernate会帮我们回滚的,我们不用写rollback() )
session.close();
}
}
结果
日志信息:
我所使用的Hibernate版本链接:
http://pan.baidu.com/s/1dEOGVx3
我所用的SQL语句
create database hib character set utf8;
use hib;
create table students(
id varchar(8) primary key,
name varchar(40),
age int,
deptId varchar(8)
);
insert into students values('S001','Jack',20,'D001');
insert into students values('S002','Tom', 21,'D001');
insert into students values('S003','张三',23,'D002');
insert into students values('S004','李四',24,'D002');
insert into students values('S005','王五',22,'D002');
CREATE TABLE depts(
id VARCHAR(8) PRIMARY KEY,
NAME VARCHAR(40)
);
insert into depts values('D001','信息科学与工程学院');
insert into depts values('D002','数学与计算机学院');
insert into depts values('D003','土木工程学院');
DELETE FROM students;
ALTER TABLE students ADD(
CONSTRAINT fk_stu_dept FOREIGN KEY(deptid) REFERENCES depts(id)
);
使用Hibernate必须要导入的包(最小必要包):
最后一个为连接数据库的包