首先先简单的讲一下我对这个框架的理解 :
我认为这个框架就是把数据库得每一条记录变成一个对象,存储在框架的内部 调用修改方法的时候修改的是框架内部的对象而不是数据库的对象,只有提交事务的时候才会修改数据库的东西,但是呢实际上框架里是不存储东西的,总的说呢这个框架就是帮助java开发的时候可以用面向对象的思想去操作数据库
使用之前肯定要导包 导入下面图片required文件夹中的所有的包
1, 建立映射关系
命名和位置都没有强硬的规范 一般情况下规定,一个实体类对应一个配置文件,把这个文件放在对应的bean目录下面,命名规范为 实体类名+.hbm+.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--class中的name代表的是实体类名,table代表数据库表名-->
<class name="cn.hd.bean.User" table="t_user">
<!--主键,对应的是实体类中的id(主键)和数据库表中的主键,
name表示的是实体类的属性名,column表示的的是数据库表格的字段名
数据库中的字段名可以省略不写,但是为了可读性所以最好写上-->
<id name="uid" column="uid">
<!--主键生成策略-->
<!--代理主键和自然主键
主键生成策略
identity 是由数据库自己维护的(自动上涨)
increment 是由数据库自己维护的(最大主键查找出来加一)
hilo(不是MySQL,了解)
native(我们用的 代表的上面三个)
uuid (java api的生成策略)
assigned (自然主键)-->
<generator class="native"></generator>
</id>
<!--其他属性,name表示的是实体类的属性名,column表示的的是数据库表格的字段名
这里自动生成表的时候会根据这里配置文件的设置自动设置字段
type 生成表中的类型
length 字段长度
not-null 不为空-->
<property name="name" column="name" />
<property name="psd" column="psd"></property>
</class>
</hibernate-mapping>
配置hibernate核心配置文件
创建核心配合文件(这个文件命名和位置都必须按照指定来,文件放在src目录下面 文件名为hibernate.cfg.xml)这里也是创建file只是创建的目录位置和命名不一样这里的目录位置和命名有强硬的规定因为hibernate里面写好的怎么读取这个配置文件
核心配置文件源码
<!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">999</property>
<!--方言
sql语句的方言 我们在上面设置了数据库的信息是mysql
mysql 中的sql Limit 在oracle中没有的
所以要设置方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MariaDB53Dialect</property>
<!--设置hibernate执行SQL语句的时候自动显示在控制台上-->
<property name="hibernate.show_sql">true</property>
<!--设置显示的格式-->
<property name="hibernate.format_sql">true</property>
<!--设置数据库表的生成策略
create(每执行一次hibernate就新创建一个表 原来的数据丢失)
create-drop(每执行一次hibernate就删除所有表 原来的数据丢失)
update(检查数据表有没有更新,如果有则自动更新,如果没有则不变
validate(校验 对数据表不进行任何操作 只会提示错误)
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--加载 映射文件 也就是路径为上面的建立映射关系的配置文件-->
<mapping resource="cn/hd/bean/User.hbm.xml"></mapping>
<mapping resource="cn/hd/bean/Student.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
这些配置文件写好之后就可以去使用了
可以再dao层直接编写代码这里我只是写的一个主方法 测试使用实际使用中肯定是要写成函数来调用
public static void main(String[] args) {
//读取配置信息,就是读取xml里面写的东西
Configuration configuration = new Configuration().configure();
//获得sessionFactory对象
//这个对象我们只用来获取session
// 但是实际上这行代码检查了数据库和实体类之间的关系
//如果有变化他就会更新
//非常耗费资源 封装工具类节省资源
SessionFactory sf = configuration.buildSessionFactory();
//获得session
Session session = sf.openSession();
//开启事务
/**
* hibernate 必须要开启事务
* 不开启不会保存数据到数据库
* 什么是事务 我个人理解就是一件事情 提交事务就是把这件事给数据让数据库去做对应的操作
*/
Transaction transaction = session.beginTransaction();
Student s = new Student();
s.setName("888");
s.setAge(11);
//修改方法通过学生对象中的主键查询到修改其他的字段
//session.update(s);
//通过主键查询这里查询出来肯定是一条数据也就是一个对象
//这个方法会自动的帮你封装成对象所以要把.class文件给它
//还要把主键传给它
//session.get(Student.class,1);
//删除方法 这里传进去的对象只要包括主键的值就行
//删除方法一般不直接去用一般先拿主键查询如果查询到就执行删除
// 如果查询不到就会返回给你一个null
//这样可以区别是删除失败还是没有这一条数据
// session.delete(s);
//保存方法
session.save(s);
//提交事务
transaction.commit();
//关闭资源
session.close();
sf.close();
}}
如果这样直接使用就会有很多的重复的代码所以可以把重复的代码封装在工具类的静态代码块里
工具类代码
public class HibernateUtil {
private static Configuration configuration=null;
private static SessionFactory sf=null;
private static Session session = null;
private static Transaction transaction = null;
/**
* 工具类方法都是静态的不想让别的类调用构造函数构造对象所以构造对象写成私有的
*/
private HibernateUtil() {
}
static {
//读取配置信息
configuration = new Configuration().configure();
//获得SessionFactory对象要通过她获得session对象
sf = configuration.buildSessionFactory();
//获得session对象
session = sf.openSession();
//开启事务
transaction = session.beginTransaction();
}
public static Session getSession(){
return session;
}
public static Transaction getTransaction(){
return transaction;
}
//关闭资源
public static void close(Session session){
session.close();
sf.close();
}
}