目录
1、web层:struts2框架
2、service层:spring框架
3、dao层:hiberate框架 (对数据库进行crud操作)
MVC思想:model-view-controller
在javaEE三层架构中的dao层。
Hibernate底层就是JDBC,对JDBC进行了封装,好处就是不需要写复杂的JDBC代码和SQL语句实现了。
Hibernate是一个开源的、轻量级(可以直接用不需要依赖其他的东西、导入很少的jar包)的框架
Hibernate版本:Hibernate3.x、4.x、5.x;4.x是过度版本
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中的方法
第一步:导入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。
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

创建核心配置文件
位置和名称固定。位置--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>
- <!--1.配置数据库信息 ,必须要有 -->
- <!-- 配置数据库的方言,如:MySQL中分页为limit,oracle中是rownum;让hibernate识别不同数据库中的语句或关键字 -->
- <property name="dialect">org.hibernate.dialect.OracleDialect</property>
- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
- <property name="hibernate.connection.username">abc</property>
- <property name="hibernate.connection.password">abc</property>
-
- <!--2.配置hibernate信息,可有可无的 -->
- <!-- 输出底层SQL -->
- <property name="hibernate.show_sql">true </property>
- <!-- 对底层SQL进行格式化,格式化即不在一行显示 -->
- <property name="hibernate.format_sql">true</property>
-
- <!-- 自动生成或更新数据库表,写了的话,就会自动创建表 -->
- <property name="hibernate.hbm2ddl.auto">update</property>
- <!-- 3.注册映射文件 -->
- <mapping resource="com/wl/entity/User.hbm.xml" /> <!-- 以src为相对路径,如果在src下,直接就是User.hbm.xml -->
- <!-- 注:hibernate.hbm2ddl.auto的值为create表示每次运行都会新建表;
- 值为create-drop是在关闭SessionFactory时删除仙剑表;
- 值为update(常用值)时表示如果第一运行时数据库没有对应表,那么会新建表,但是如果存在对应数据表,就不再创建对应的数据表 -->
- </session-factory>
- </hibernate-configuration>
复制进去dtd约束:
- <?xml version='1.0' encoding='UTF-8'?>
-
- <!DOCTYPE hibernate-configuration PUBLIC
-
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
-
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载。
以下三部基本只配置一次,之后很少修改。
第一部分:配置数据库信息
第二部分:配置hibernate信息
第三部分:把配置文件放到核心配置文件中
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
-
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
-
- <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
第一步:加载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;
-
- /*
- * 添加:save()
- * 修改:update()
- * 删除:delete()
- * 根据id查询:get()
- */
- 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查看:

如果使用int表示score,int score=0;分数为0时,此时若要表示学生没有参加考试就无法实现,因为int score=null;是错误的。这时就要用Integer score = null;
主键:在Hibernate中持久化类都会有一个标识属性,用于标识实例的唯一,该属性映射到数据库表的主键。
主键生成器:<generator class="生成方式"/>
生成方式的值有:
increment:表示获取数据库中表最大主键值,并+1后作为新的主键。
identity:自动增长,主要使用在mysql,db2。
Sequence:Hibernate根据底层数据库序列生成标识符,条件是数据库要支持序列。适用于代理主键。
native:(开发中一般选择此方式)自动增长,Hibernate会根据数据库从identity,sequence(序列),hilo(高低算法)中选择一种合适的方式生成主键,在mysql中时使用identity,在Oracle中时选择sequence(序列)。
uuid:使用UUID算法生成字符串类型主键(主要用于分布式部署)。
使用uuid时,将实体类的主键修改为String类型,将配置文件中修改为uuid。
运行封装好的工具类,查看效果:

运行测试数据:
![]()
也就是说,当使用uuid策略作为主键生成策略时,需要把主键设为String类型。