目录
1 三层架构
2 hiberate概述
3 ORM思想
4 Hiberate环境搭建与各种准备(非常详细)
基础准备
配置一对应关系
hibernate.cfg.xml模板
实现添加操作步骤
测试全代码
效果验证
5 实体类的编写规则
6 主键增长策略
1 三层架构
1、web层:struts2框架
2、service层:spring框架
3、dao层:hiberate框架 (对数据库进行crud操作)
MVC思想:model-view-controller
2 hiberate概述
在javaEE三层架构中的dao层。
Hibernate底层就是JDBC,对JDBC进行了封装,好处就是不需要写复杂的JDBC代码和SQL语句实现了。
Hibernate是一个开源的、轻量级(可以直接用不需要依赖其他的东西、导入很少的jar包)的框架
Hibernate版本:Hibernate3.x、4.x、5.x;4.x是过度版本
3 ORM思想
Hibernate是一个开放源代码的对象关系映射(orm-Object Relational Mapping)框架。
Hibernate使用该思想对数据库进行crud操作。
Web阶段javaBean类,在框架阶段叫实体类。
让实体类和数据库表进行一对一对应关系。
类的属性--表中的字段对应
不需要直接操作数据库表,直接操作表对应实体类对象。
Jdbc代码:
Class.forName(“com.oracle.jdbc.driver”); Connection = DriverManager.getConnection(); (url,username,password) String sql=””; ps = conn.prepareStatement(sql); rs = ps.excuteQuery(); //遍历结果集 //释放资源
实体类
Public class User{
Private int userid;
Private String username;
Private String password;
//set、get
}
数据库表:
Create table t_user( Userid number not NULL AUTO_INCREATEMENT, username varchar2(100), password varchar2(100) );
使用配置文件的方式完成一一对应
Hibernate封装的对象Session:
User user = new User(); User.setUserName(“”); Session.save(user); //session中的方法
4 Hiberate环境搭建与各种准备(非常详细)
基础准备
第一步:导入Hibernate的jar包
require文件夹与JPA文件夹中的jar必须导入。
因为使用Hibernate时有日志信息输出,Hibernate本身没有日志输出的jar包,需要导入其他的日志jar包支持这些输出。
2、创建实体类
Hibernate要求实体类中有一个属性(如id)是唯一的。(如表中的主键)
private int userid;
3、创建表(hibernate可自动创建)
4、配置实体类和数据库表的映射关系--配置文件实现
创建xml配置文件:配置文件名称和位置没有要求,但一般命名为:hbm.xml;位置创建在所在实体类所在包下。
先引入xml约束,目前在hibernate中大多数是dtd约束;在hibernate的约束文件(hibernate-mapping-3.0.dtd)中复制过来拷入创建的xml。
配置一对应关系
创建核心配置文件
位置和名称固定。位置--src下;名称--hibernate.cfg.xml
hibernate.cfg.xml模板
org.hibernate.dialect.OracleDialect
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@127.0.0.1:1521:XE
abc
abc
true
true
update
复制进去dtd约束:
hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载。
以下三部基本只配置一次,之后很少修改。
第一部分:配置数据库信息
第二部分:配置hibernate信息
第三部分:把配置文件放到核心配置文件中
org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/hibernate 实现添加操作步骤
第一步:加载hibernate核心配置文件
第二步:创建Sessionfactory工厂对象
第三步:使用Sessionfactory创建session对象
第四步:开启事务,建议手动创建
第五步:curd操作
第六步:提交事务
第七步:关闭资源
变化的只是第五步,其他通用固定。
测试全代码
package com.wl.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import com.wl.entity.User; import com.wl.utils.HibernateUtils; public class InsertDemo { @Test public void updateDemo(){ // Configuration cfg = new Configuration(); // cfg.configure(); SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = new User(); user.setUserid(4); user.setUsername("rrr"); user.setPassword("rrr"); user.setAddress("AAAAA"); session.update(user); transaction.commit(); session.close(); sessionFactory.close(); } @Test public void insertDemo1(){ SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = new User(); user.setUsername("wl9"); user.setPassword("000002"); user.setAddress("XXXXX"); session.save(user); transaction.commit(); session.close(); sessionFactory.close(); } @Test public void insertDemo(){ // 第一步:加载hibernate核心配置文件,会在src下找hibernate.cfg.xml Configuration cfg = new Configuration(); cfg.configure(); // 第二步:读取核心配置文件的内容,来创建Sessionfactory工厂对象;在该过程中,会根据映射关系,在配置数据库中创建表。 SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步:使用Sessionfactory创建session对象,类似于连接connection Session session = sessionFactory.openSession(); // 第四步:开启事务,建议手动创建 Transaction transaction = session.beginTransaction(); // 第五步:curd操作,如添加操作 User user = new User(); user.setUsername("123"); user.setPassword("000002"); user.setAddress("XX"); //调用session里面的方法实现添加 session.save(user); // 第六步:提交事务 transaction.commit(); // 第七步:关闭资源 session.close(); sessionFactory.close(); } }效果验证
1是否创建了表;
2是否增加了记录。
控制台:
共五条语句:
Hibernate: update t_user set username=?, password=?, address=? where userid=? Hibernate: select hibernate_sequence.nextval from dual Hibernate: insert into t_user (username, password, address, userid) values (?, ?, ?, ?) Hibernate: select hibernate_sequence.nextval from dual Hibernate: insert into t_user (username, password, address, userid) values (?, ?, ?, ?)数据库中:
select dbms_metadata.get_ddl('TABLE', ‘T_USER’) from dual;
或desc查看:
5 实体类的编写规则
- 属性私有,提供get/set方法。
- 要有一个属性作为唯一值,如使用id区分唯一值。
- 实体类的数据类型建议使用基本数据类型的包装类型,如Integer,Character,其他都是首字母大写
如果使用int表示score,int score=0;分数为0时,此时若要表示学生没有参加考试就无法实现,因为int score=null;是错误的。这时就要用Integer score = null;
6 主键增长策略
主键:在Hibernate中持久化类都会有一个标识属性,用于标识实例的唯一,该属性映射到数据库表的主键。
主键生成器:
生成方式的值有:
increment:表示获取数据库中表最大主键值,并+1后作为新的主键。
identity:自动增长,主要使用在mysql,db2。
Sequence:Hibernate根据底层数据库序列生成标识符,条件是数据库要支持序列。适用于代理主键。
native:(开发中一般选择此方式)自动增长,Hibernate会根据数据库从identity,sequence(序列),hilo(高低算法)中选择一种合适的方式生成主键,在mysql中时使用identity,在Oracle中时选择sequence(序列)。
uuid:使用UUID算法生成字符串类型主键(主要用于分布式部署)。
使用uuid时,将实体类的主键修改为String类型,将配置文件中修改为uuid。
运行封装好的工具类,查看效果:
运行测试数据:
也就是说,当使用uuid策略作为主键生成策略时,需要把主键设为String类型。



