当前位置:网站首页>hiberate架构介绍及环境搭建(非常详细)

hiberate架构介绍及环境搭建(非常详细)

2022-06-25 22:01:00 _七里香

目录

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。

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

配置一对应关系

创建核心配置文件

位置和名称固定。位置--src下;名称--hibernate.cfg.xml

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查看:

5 实体类的编写规则

  1. 属性私有,提供get/set方法。
  2. 要有一个属性作为唯一值,如使用id区分唯一值。
  3. 实体类的数据类型建议使用基本数据类型的包装类型,如Integer,Character,其他都是首字母大写

如果使用int表示score,int score=0;分数为0时,此时若要表示学生没有参加考试就无法实现,因为int score=null;是错误的。这时就要用Integer score = null;

6 主键增长策略

主键:在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类型。

原网站

版权声明
本文为[_七里香]所创,转载请带上原文链接,感谢
https://lan6193.blog.csdn.net/article/details/125435393