Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

Hibernate( ORM框架 )

Hibernate是一个数据持久化层的ORM框架. 它通过JavaBean, 数据库中的表与自身的映射关系达到表中数据的增删改查

特性

1.对JDBC访问数据库的代码进行封装, 简化数据访问的重复性代码
2.使用反射机制完成对Bean的封装
3.轻量级框架,支持关系型数据库

核心配置文件的编写

Hibernate的核心配置文件用于连接数据库, 以及添加映射文件(映射文件就是JavaBean属性与数据表之间的对应关系)
核心配置文件文件名必须是: hibernate.cfg.xml //此处的cfg不是文件后缀类型
文件的地址位于src目录下

下面通过例子说明:

<?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就是对数据库连接的配置--><session-factory><!--以下都是固定写法--><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  <!--配置数据库驱动类--><property name="hibernate.connection.url">jdbc:mysql:///test</property>  <!--配置数据库服务地址--><property name="hibernate.connection.username">root</property>  <!--配置数据库用户名--><property name="hibernate.connection.password">1234</property>  <!--配置数据库登录密码--><!--向控制台打印Hibernate执行的sql语句--><property name="show_sql">true</property><!--优化控制台输出的sql语句格式--><property name="format_sql">true</property><!--表结构生成策略--><property name="hbm2ddl.auto">update</property><!--配置数据库使用的sql, 固定写法--><property name="hibernate.dialect">org.hibernate.dialect.MYSQLDialect</property><!--事务自动提交--><property name="hibernate.connection.autocommit">true</property><!--将hibernate核心Session与线程绑定, 使得线程安全--><property name="hibernate.current_session_context_class">thread</property><mapping resource="com/hibernatetest/User.hbm.xml">  <!--配置映射文件, resource对应映射文件的相对路径--></session-factory>
</hibernate-configuration>

表结构生成策略
在hibernate中, 如果数据库中没有对应的table, 在配置了hbm2ddl.auto属性, hibernate将为你自动生成表结构, 下面将详细介绍该属性的取值

  • update: 当数据库中不存在表结构, hibernate将会自动创建表结构, 如果存在表结构, hibernate会检查数据库中的表结构与映射文件配置的结构是否对应, 如果不对应, 那么hibernate将会在原有的结构上添加不存在的列, 不存在的数据使用null填充
  • create: 无论数据库中是否存在表结构, 每次启动hibernate, hibernate都会新建一个表结构, 表中原有的数据会丢失
  • create-drop: 无论数据库中是否存在表结构, 每次启动hibernate, hibernate都会新建一个表结构, 在hibernate运行结束后, 删除表结构
  • validate: 启动hibernate, 会自动检查表结构是否与映射文件结构对应, 不对应就抛异常, 它不会自动创建/删除/维护表结构

JavaBean与映射文件

  • 数据库中表结构:
create table t_user(id int auto_increment primary key,username varchar(50),password varchar(50)
);
  • JavaBean就通过User表示
public class User{private int id;private String username;private String password;//下面一堆get/set操作,就不写了
}
  • 映射文件:
    就是建立JavaBean中属性与表结构相对应
    文件名: 遵守规范, 与JavaBean同名, 例如: User.hbm.xml
    文件位置: 放在JavaBean同一目录下
    下面举例说明:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--当设置了package的时候,在后面的class中就不用写完整的类名结构-->
<hibernate-mapping package="com.hibernatetest"><class name="User" table="t_user"><id name="id"><generator class="native"></generator>	</id><property name="username" column="username" length="50" type="string"></property><property name="password" column="password"></property></class>
</hibernate-mapping>

id标签中的generator属性:配置主键生成策略
配置generator, 使得表中数据的主键可以由数据库自增, 我们自己指定, 或者由Hibernate自动生成(表必须有主键).

1.increment: 数据库auto_increment方式, Hibernate会从数据库中查找最大的主键值, 然后在该主键的基础上加一为Bean对象的id赋值
2.identity: 直接依赖于数据库的auto_increment
3.sequence: 序列,依赖于数据库的序列功能(Oracle专属)
4.hilo: 使用Hibernate自己实现的序列算法,自己生成主键为Bean对象id赋值
5.native: 自动根据数据库类型判断, 自动从identity, sequence, hilo中选择
6.uuid 使用生成的32为不重复随机字符串作为主键
7.assigned 使用自己指定的主键值

property标签常用属性:
property主要用于配置数据库中column与Bean的对应关系, 以及column的属性(数据类型, 长度, 有效位, 是否为空, 是否唯一)

1.name: Bean中属性名称
2.column: 表中列名称
3.type: 配置数据类型, 使用java的数据类型 或 数据库数据类型 或 Hibernate数据类型中任意一个
4.length: 数据长度范围
5.scale: 数字的有效位
6.precision: 小数点后精度
7.not-null: 指定属性的约束是否为空
8.unique: 指定属性约束是否使用唯一

使用Hibernate进行数据库操作

下面使用一个简单的例子说明:

@Test
public void demo(){//1. 加载核心配置文件和映射文件//由于核心配置文件文件名符合规则, 使用默认的configure方法来加载Configuration c = new Configuration().configure();//2.获得SessionFactory, 相当于获得数据库连接池SessionFactory factory = c.buildSessionFactory();//3.获得Session对象, 相当于获得connectionSession session = factory.openSession();//4.开启事务Transaction transaction = session.beginTransaction();//5.执行数据库增删改查操作................//6.提交事务transaction.commit();//7.释放资源session.close();factory.close();	
}

上面的7个步骤就可以完成数据库的操作, 操作过程与JDBC差不多

封装Hibernate工具类

由于加载配置文件, 获得session对象, 关闭资源都是相同的代码, 所以将相同的代码封装为工具类

package com.utils;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory sf;static {Configuration cf = new Configuration().configure();sf = cf.buildSessionFactory();Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){//当虚拟机关闭的时候关闭资源@Overridepublic void run() {System.out.println("虚拟机关闭, 释放资源");sf.close();}}));}public static Session openSession(){return sf.openSession();}//用于获得ThreadLocal中的Sessionpublic static Session getCurrentSession(){return sf.getCurrentSession();}
}

HibernateAPI解析:

  • Configuration配置核心文件
    1.new Configuration().configure(): Hibernate能做到自动加载src下的Hibernate核心配置文件和Bean同目录下的User.hbm.xml, 前提必须是文件放置的位置符合规范.
    2.当放置的文件不符合规则的时候使用new Configuration().configure(file/path); 通过file/path进行加载
    3.手动加载映射文件:
configure.addResource("com/hibernatetest/User.hbm.xml");
configure.addClass(User.class);
  • SessionFactory
    SessionFactory用于管理所有的Session,线程安全, 使用configure.buildSessionFactory()获得
    factory.openSession()与factory.getCurrentSession的区别:
openSession: 是直接就打开一个session, 不去看ThreadLocal是否存有Session
getCurrentSession: 先去ThreadLocal中检查是否存有, 若存在就使用ThreadLocal中的Session, 不存在再new

注: 使用getCurrentSession, 必须在核心配置文件中配置

<property name="hibernate.current_session_context_class">thread</property>
  • Session对象
    Session对象就相当于JDBC中的Connection操作,单线程, session可以用来对数据库中数据进行增删改查操作(都是建立在有主键的情况下).

  • Transaction事务
    开启事务: session.beginTransaction();
    获得事务: session.getTransaction();
    提交事务: transaction.commit();
    回滚事务: transaction.rollback();
    事务处理结构:

try{//开启事务//session操作
} catch(e){//事务回滚
}

Session对象基本操作:

准备操作:

Configuration c = new Configuration().configure();
SessionFactory factory = c.buildSessionFactory();
Session session = factory.openSession();
  • get查找数据库中对象
获得数据库中对应id为1的User对象
User u = session.get(User.class, 1);
  • load查找数据库中对象
User u = (User)session.load(User.class, 3);
  • createQuery批量查询
Query q = session.createQuery("from com.hibernate.User");//内部的字符串是HQL语言(Hibernate自制的SQL)
List<User> list = q.list();
User u = (User) q.uniqueResult(); //只返回一条记录, 就是list.get(0);
使用Query可以进行分页操作, 数据库的limit:
q.setFirstResult(int i); //开始索引
q.setMaxResult(int i); //每页显示个数
  • createCriteria批量查询
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
// 查找id小于3的用户
criteria.add(Restrictions.le("id", "3")); //使用add方法添加查询的过滤条件
List<User> list = criteria.list();

注: Criteria做到面向对象查询, 完全不需要使用SQL语句, 但是在一定程度上缺少灵活性

  • createSQLQuery执行原生SQL实现批量查询
SQLQuery query = session.createSQLQuery("select * from t_user");
query.addEntity(User.class);//将查询结果封装到指定的对象中
List<User> list = query.list();
  • save将Bean对象保存到数据库中
//由于前面指定主键生成策略是native, 所以这里就不指定主键
//使用数据库的auto_increment
User u = new User();
u.setUsername("AAA");
u.setPassword("123");
session.save(u);
  • update对数据库中数据进行修改
首先查询数据库中是否存在对应的User
User u = (User) session.get(User.class,1);
if (!u){u.setUsername("BBB"); //当User存在的时候进行修改session.update(u);
} 
  • delete删除数据库中对应的对象
User u = (User) session.get(User.class, 2);
session.delete(u);

load与get的区别
get: 一旦调用get操作,Hibernate就会使用SQL去数据库中查找指定对象, 然后将这个对象封装到User中
load: 调用load操作的时候, Hibernate先在内部使用动态代理, 生成只具有id属性的代理对象, 只有当使用该代理对象的属性的时候, 才会去数据库中查询指定对象, 然后初始化该动态代理对象
总结: get操作立马就SQL查询, load操作只有在使用该对象属性才会去查询(延迟操作,一定程度上节约资源)

Hibernate持久化类

  • 持久化类编写规则:
    1.提供无参public修饰的构造方法
    2.提供一个"主键"属性, 映射表中的主键
    3.所有属性提供public修饰的get, set方法
    4.属性尽量使用包装类 (防止基本数据类型自动初始化为0/""/false/0.0…, 使用包装类就直接初始化为null, 便于数据库操作)
    5.不要使用final修饰实例 (无法生存代理对象)
  • 持久化对象的唯一标识OID
    对象的id要与表中的主键对应, 为了保证OID的唯一性, 应该使用OID赋值
  • 类型对应

剩余数据类型, 就不列举了

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑电气工程设计常用图形和文字符号_建筑水电图纸看不懂?10年老师傅教你看图技巧,分分钟安排...

1、建筑给排水工程包括&#xff1a;给水、排水、热水、消火栓、自动喷淋等常用系统&#xff0c;其管道当中流动的是水。(其管道输送介质为水)2、给排水系统的主要功能&#xff1a;(1)建筑给水系统的任务&#xff0c;就是经济合理地将水由室外给水管网输送到装置在室内的各种配水…

Android系统架构开篇

Android系统庞大且错综复杂&#xff0c;Gityuan带领大家初探Android系统整体架构&#xff0c;一窥其全貌。一、引言本文作为Android系统架构的开篇&#xff0c;起到提纲挈领的作用&#xff0c;从系统整体架构角度概要讲解Android系统的核心技术点&#xff0c;带领大家初探Andro…

20155220 实验三 敏捷开发与XP实践 实验报告

20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础XP核心实践相关工具实验要求 没有Linux基础的同学建议先学习《Linux基础入门&#xff08;新版&#xff09;》《Vim编辑器》 课程完成实验、撰写实验报告&#xff0c;实验报告以博客方式发表在博客园&#xff0c;注意…

Android binder 框架和学习资料

&#xff11;Android binder 是学习 Android 系统一定要啃得硬骨头&#xff0c;可能你刚开始的时候并不理解其中的精髓&#xff0c;但是在 android 系统的很多地方你都会遇到它。不过要我自己写明白其中的逻辑脉络需要花费太多的时间和精力&#xff0c;而且传播效果也不是非常好…

Spring_Bean配置_生命周期_注解

Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之…

完全理解Gson(1):简单入门

GSON是Google开发的Java API&#xff0c;用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问&#xff1a;http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础&#xff0c;因此不需要任何GSON…

创业碎碎念

&#xff11;今天&#xff0c;跟几条跟我玩的比较好的篮球狗在讨论人生&#xff0c;其中有一条特别感慨&#xff0c;「为何看上去别人做起来这么容易的事&#xff0c;我们做很难&#xff1f;」。我突然不知道如何去回答这样的问题&#xff1f;这个问题也一直困扰着我。读我文章…

压缩过的js代码怎么还原_Fundebug 前端 JS插件更新至 1.7.0,拆分录屏代码,还原部分 Script error....

摘要&#xff1a; BUG 监控插件压缩至 18K。1.7.0拆分了录屏代码&#xff0c;BUG 监控插件压缩至18K&#xff0c;另外我们还原了部分 Script error&#xff0c;帮助用户更方便地 Debug。请大家及时更新哈~拆分录屏代码从1.7.0版本开始&#xff0c;我们拆分了录屏代码。如果需要…

SpringAOP描述及实现_AspectJ详解_基于注解的AOP实现_SpringJdbcTemplate详解

AOP AOP特点: 面向切面编程, 利用AOP对业务逻辑的各个部分进行抽取公共代码, 降低耦合度, 提高代码重用性, 同时提高开发效率.采取横向抽取, 取代传统纵向继承体系重复性代码解决事务管理, 性能监视, 安全检查, 缓存, 日志等问题Spring AOP在运行期, 通过反向代理的方式解决类…

(十九)java多线程之ForkJoinPool

本人邮箱: kco1989qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 引言 java 7提供了另外一个很有用的线程池框架,Fork/Join框架 理论 Fork/Join框架主要有以下两个类组…

串口,com口,ttl,max232你应该知道的事

&#xff11;今天&#xff0c;说几个比较基础的知识&#xff0c;大家在开发过程中经常会遇到但是又不是特别注意的知识点。TTL电平&#xff1a;TTL是Transistor-Transistor Logic&#xff0c;即晶体管-晶体管逻辑的简称&#xff0c;它是计算机处理器控制的设备内部各部分之间通…

Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]

这篇文章主要介绍Caffe2的基本数据结构&#xff1a; WorkspacesOperatorsNets在开始之前最好先阅读以下Intro Turorial首先&#xff0c;导入caffe2。其中core和worksapce模块&#xff0c;这是必须的两个模块。如果你要使用Caffe2生成的protocol buffers&#xff0c;那么你也需要…

Linux 开发者最应该知道的命令汇总

&#xff11;最近发现一个好东西&#xff0c;在 github 上发现的&#xff0c;我觉得非常适合大家研究 linux&#xff0c;说白了就是一些命令而已&#xff0c;只不过是作者帮忙总结好了&#xff0c;比较适合大家开发和学习 linux 系统&#xff0c;so , 推荐给大家学习下。https:…

华为任职资格_华为采购总部专业任职资格标准|

目 录 序 言 概述 .........................第一部分 级别定义.....................第二部分 资格标准 ....................1、采购工程师&#xff08;生产采购&#xff09;任职资格标准........2、采购员&#xff08;生产采购&#xff09;任职资格标准............3、采购员…

C 语言内存分配

&#xff11;昨天有一个群里的同学问我&#xff0c;他问我的问题是 c 语言函数是存在哪里的&#xff1f;是如何执行的&#xff1f;我下意识的觉得这位同学应该是个初学者&#xff0c;所以今天就写下一些基础方面的内容&#xff0c;「C语言的内存布局」。程序代码可以看做是一个…

没有梦想,你跟咸鱼有什么分别?

&#xff11;标题起的有点夸张&#xff0c;其实这个就是一个招聘贴&#xff0c;之前从来没有用发头条文章来招聘&#xff0c;实在不好意思&#xff0c;这个招聘对我非常重要&#xff0c;这是一个非常好的朋友公司的招聘信息&#xff0c;也希望大家帮忙扩散一下&#xff0c;因为…

一个很Low的通讯录管理系统(但是能用)C/C++单链表实现

通讯录管理系统的设计 问题需求分析 在计算机还未普及之前通讯管理都是由联系人采用名片&#xff0c;通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯…

2017《面向对象程序设计》课程作业三

作业链接github链接 对于文件读写和多参数主函数学习过程中遇到的问题 这次文件读写改用了C的形式&#xff0c;然后总体还算顺利&#xff0c;借鉴了林燊的&#xff0c;因为他写的代码最容易看懂&#xff1b;还有就是借鉴了《C程序设计》&#xff0c;讲真&#xff0c;谭浩强的还…

华为不做黑寡妇,开源编译器,与友商共建安卓性能

&#xff11;今天我的一个老哥开了头条号&#xff0c;第一次发文章&#xff0c;我觉得不错&#xff0c;拿来用用&#xff0c;给大家看看华为技术总工的文采。这位总工潜伏在我的微信群里很少说话&#xff0c;大家一定要有这个想法&#xff0c;就是最低调的那个人&#xff0c;真…

点击链接如何直接跳转到相对应的聊天窗口

解决这个问题的步骤如下&#xff1a; <a target"_blank" href"http://wpa.qq.com/msgrd?v3&uin3237465337&siteqq&menuyes">一、登陆腾讯官方网站&#xff1a;http://wp.qq.com/ 二、登陆之后&#xff0c;点“设置”&#xff0c;按下图…