Hibernate 学习(一)

一、Hibernate 简介

1、Hibernate 简介

  Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

2、Hibernate 优缺点

  优点与缺点都是相对的,那么讲一个东西的优缺点我们都需要一个参数对比,而咱们要来进行对比的咱们操作数据的原生的JDBC:

1、JDBC的优缺点

本质:处理Java对象和关系型数据库表之间的转换。

优点:

  操作数据库最底层,性能最高(需要你是有相应的经验,并且是一个数据库高手)。

缺点:  

1、使用复杂(重复代码太多)。

2、移植数据库很麻烦,改动比较多;主键的生成方式不同(mysql使用自增,oracle使用序列);分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)。

3、性能优化得自己处理,没有提供数据的缓存。

4、面向sql语句操作,不是面向对象的。

2、hibernate的优缺点

  本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装。

优点:

1、程序员操作很简单,代码简单 session.save(user);

2、直接面向对象操作。

3、提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate);一级缓存,二级缓存,查询缓存。

4、数据库移植性很强,很少的修改;把各种数据库抽取了一个方言接口;不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。

缺点:

1、不能干预sql语句的生成;session.get(User.class,id); 默认查询t_user表的所有字段,自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where    user0_.id=?

2、一个项目中,如果对sql语句的优化要求比较高,不适合用hibernate(不过可以使用 Hibernate 对原生sql 的支持来解决)。

3、如果一张表中有上亿级别的数据量,也不适合用hibernate,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。

二、Hibernate 入门

1、步骤

1、拷贝jar包

2、建立 pojo

Product 类:

 1 package com.hibernate.pojo;
 2 
 3 /**
 4  * @author zt1994 2018/3/6 14:16
 5  */
 6 public class Product {
 7     private Integer id;
 8     private String name;
 9     private float price;
10 
11     public Integer getId() {
12         return id;
13     }
14 
15     public void setId(Integer id) {
16         this.id = id;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public float getPrice() {
28         return price;
29     }
30 
31     public void setPrice(float price) {
32         this.price = price;
33     }
34 }

3、建立映射文件

Product.hbm.xml 映射文件:

 1 <!DOCTYPE hibernate-mapping PUBLIC
 2         "-//Hibernate/Hibernate Mapping DTD//EN"
 3         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 4 
 5 <!--映射文件-->
 6 <hibernate-mapping package="com.hibernate.pojo">
 7     <!--class表示一个由hibernate管理的持久对象,对应数据库中一个表-->
 8     <!--table数据库的表名-->
 9     <class name="Product" table="product">
10         <id name="id" type="int" column="id">
11             <!--generator表示主键的生成方式,native自动选择数据库本地的策略-->
12             <generator class="native"/>
13         </id>
14         <!--非主键属性-->
15         <property name="name" column="name" type="string"/>
16         <property name="price" column="price" type="float"/>
17     </class>
18 </hibernate-mapping>

4、建立hibernate核心配置文件

hibernate.cfg.xml 配置文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 
 6 <!--hibernate核心配置文件-->
 7 <hibernate-configuration>
 8     <session-factory>
 9         <property name="dialect">
10             org.hibernate.dialect.MySQLDialect
11         </property>
12         <!--链接池配置-->
13         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
14         <property name="connection.url">jdbc:mysql://localhost:3306/how2java</property>
15         <property name="connection.username">root</property>
16         <property name="connection.password">admin</property>
17         <!--显示sql语句-->
18         <property name="show_sql">true</property>
19 
20         <!-- 映射文件-->
21         <mapping resource="mapper/Product.hbm.xml"/>
22     </session-factory>
23 </hibernate-configuration>

5、编辑dao实现类

dao 接口:

 1 package com.hibernate.dao;
 2 
 3 import com.hibernate.pojo.Product;
 4 
 5 import java.util.List;
 6 
 7 public interface IProductDao {
 8 
 9     /**
10      * 添加产品
11      * @param product
12      * @return
13      */
14     void addProduct(Product product);
15 }

dao 实现:

 1 package com.hibernate.dao.impl;
 2 
 3 import com.hibernate.dao.IProductDao;
 4 import com.hibernate.pojo.Product;
 5 import org.hibernate.Query;
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 import org.hibernate.Transaction;
 9 import org.hibernate.cfg.Configuration;
10 
11 import java.util.List;
12 
13 /**
14  * @author zt1994 2018/3/6 14:40
15  */
16 public class ProductDaoImpl implements IProductDao {
17 
18     @Override
19     public void addProduct(Product product) {
20         //1.读取并解析配置文件
21         Configuration configuration = new Configuration();
22         //2.加载配置文件,如果不设置加载默认配置文件hibernate.cfg.xml
23         configuration.configure("hibernate.cfg.xml");
24         //3.生成会话工厂
25         SessionFactory sessionFactory = configuration.buildSessionFactory();
26         //4.获取session
27         Session session = sessionFactory.openSession();
28         //5.开启事务
29         Transaction transaction = session.getTransaction();
30         transaction.begin();
31         //6.操作CRUD
32         session.save(product);
33         transaction.commit();
34         //7.关闭资源
35         session.close();
36         sessionFactory.close();
37     }
38 }

6、测试

 1 package com.hibernate.test;
 2 
 3 import com.hibernate.dao.IProductDao;
 4 import com.hibernate.dao.impl.ProductDaoImpl;
 5 import com.hibernate.pojo.Product;
 6 import org.junit.Test;
 7 
 8 /**
 9  * @author zt1994 2018/3/6 14:47
10  */
11 public class TestProductDao {
12     private IProductDao productDao = new ProductDaoImpl();
13 
14     /**
15      * 测试添加商品
16      */
17     @Test
18     public void testAddProduct(){
19         Product product = new Product();
20         product.setName("test");
21         product.setPrice(2222);
22         productDao.addProduct(product);
23     }
24 }

 

转载于:https://www.cnblogs.com/zt19994/p/8515134.html

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

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

相关文章

矩阵的压缩存储

5.3 矩阵的压缩存储 矩阵是很多科学与工程计算问题中研究的数学对象&#xff0c;在此&#xff0c;我们讨论如何存储矩阵的元&#xff0c;从而使矩阵的各种运算能有效第进行。对于一个矩阵结构显然用一个二维数组来表示是非常恰当的&#xff0c;但在有些情况下&#xff0c;比如常…

网络工程师还要学linux吗,网络工程师要学什么

想成为一个优秀的网络工程师&#xff0c;要学什么&#xff0c;怎么学呢?今天小编带你了解一下网络工程师到底要学什么。上篇我们讲到了“网络工程师发展方向”&#xff0c;列举了许多技术方向&#xff0c;那么我们该如何根据自己的定位选择学习哪些技术。重点是哪些&#xff0…

广义表及其存储方式简介

广义表&#xff08;Lists&#xff0c;又称列表&#xff09;是线性表的推广。线性表定义为n>0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项&#xff0c;原子是作为结构上不可分割的成分&#xff0c;它可以是一个数或一个结构&#xff0c;若放松对表元素的这种限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回顶部 1、Vue.js 路由 本章节我们将为大家介绍 Vue.js 路由。 Vue.js 路由允许我们通过不同的 URL 访问不同的内容。 通过 Vue.js 可以实现多视图的单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

图片转excel:“保留数字格式”在什么场景下该勾

保留数字格式是什么意思呢&#xff1f;顾名思义&#xff0c;就是将转出来的数字保留为数字格式&#xff0c;而不是文本格式。我们知道&#xff0c;OCR程序将图片上的文字识别为电脑可编辑的文字后&#xff0c;如果导入到excel不加处理&#xff0c;则单个数字过长的文字就会被ex…

linux添加三权,基于SELinux的三权分离技术的研究

目前&#xff0c;Linux操作系统已广泛应用于各种设备和产品中&#xff0c;如服务器、PC机、机顶盒及路由器等。随着Linux系统的不断发展和广泛应用&#xff0c;Linux系统的安全问题也引起越来越多的关注。在Linux操作系统中&#xff0c;存在一个超级用户即root用户。root也称为…

高效程序员

软件开发人员的作战手册 - 让程序员活的久一点 1. 程序员的职业准则是&#xff1a;诚实&#xff08;如实的报告你的状态&#xff0c;风险和出现的问题&#xff09;&#xff0c;守信&#xff08;承诺完成的任务就要按时完成&#xff09;&#xff0c;尊重&#xff08;尊重给你的代…

PHP学习笔记1

1.什么是PHP&#xff1f; Hypertext Preprocessor(超文本预处理语言)。 是脚本语言。 是最流行的网站开发语言。 2.PHP能做什么&#xff1f; 可以生成动态页面内容。 可以创建、打开、读取、写入、关闭服务器上的文件。 可以手机表单数据。 可以发送和接收cookies。&#xf…

linux磁盘符变化autofs,Linux基础教程学习笔记之Autofs自动挂载

Linux基础教程学习笔记之Autofs自动挂载Autofs自动挂载&#xff1a;yum -y install autofsvim /etc/auto.master 在文件中添加下面行/home/guests /etc/auto.tianyunvim /etc/auto.tianyun 子挂载点监控ldapuser0 -rw,sync classroom:/home/guests/ldapuser0systemctl enable …

linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力

內容簡介1、第四部分第一課&#xff1a;壓縮文件&#xff0c;解壓無壓力2、第四部分第二課&#xff1a;SSH連接&#xff0c;安全快捷壓縮文件&#xff0c;解壓無壓力最近小編因為換工作&#xff0c;從南法搬到巴黎。折騰了很久。網絡一直用的是公共的無線網&#xff0c;信號不行…

如何在本地搭建一个Android应用crashing跟踪系统-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一个Andr…

20165222第一周查漏补缺

一&#xff0c;第一章要点总结 1&#xff0c;java的特点&#xff1a;面向对象&#xff0c;动态&#xff0c;平台无关。 2&#xff0c;对于带包程序的编译&#xff1a;注意javac -d 编译到一个文件夹内&#xff0c;然后java -cp 文件夹名 包名.类名。 第一章是比较简单的&#x…

一份从 0 到 1 的 Java 项目实践清单

2019独角兽企业重金招聘Python工程师标准>>> 看了一篇文章&#xff0c;感觉还可以&#xff0c;就给大家共享一下&#xff1a; 对于着手一个项目的时候&#xff0c;要从以下入手&#xff08;即项目清单&#xff09;&#xff1a; 1. 项目规划 1.1 首先&#xff0c;你得…

JWT 简介

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准&#xff08;RFC 7519&#xff09;&#xff0c;定义了一种简洁的&#xff0c;自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在&#xff0c;这些信…

音视频编解码知识学习详解(分多部分进行详细分析)

1. 常用的基本知识 基本概念 编解码 编解码器&#xff08;codec&#xff09;指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码&#xff08;通常是为了传输、存储或者加密&#xff09;或者提取得到一个编码流的操作…

SQL*Plus命令

SQL*Plus命令 前言 一&#xff1a;SQL*Plus 与数据库的交互 二&#xff1a;设置SQL* Plus的运行环境 二 - 1 &#xff1a;SET命令概述 二 - 2 &#xff1a;使用SET命令设置运行环境 二 - 2 ____1&#xff1a;Pagesize 变量 1 SYSorcl> show pagesize2 pages…

C语言数码管是共阴共阳程序,C语言实现共阴极数码管操作

共阴极或者共阳极数码管&#xff0c;因为其需要电流大&#xff0c;而一般51输出电流低&#xff0c;需要锁存器。买的开发板使用的共阴极数码管。至于其构造&#xff0c;找个相关方面的书看看&#xff0c;这里主要是对做好的电路板进行编程。刚开始的时候&#xff0c;感觉在数码…

百度与华为全面战略合作 人工智能手机真的要来了

视频加载中...12月21日百度和华为在北京宣布达成全面战略合作。这次合作内容主要包括三点&#xff0c;首先是在语音、语义、视觉和VR上的自然交互&#xff0c;这是百度为华为手机AI赋能的基础层。第二是基于华为HiAI平台和百度PaddlePaddle深度学习框架&#xff0c;共建人工智能…

Android 秒级编译FreeLine

项目地址&#xff1a;FreeLine FreeLine官网: FreeLine 1. 安装FreeLine插件 File->Settings->Plugins, 搜索输入FreeLine Plugin, 查找到后进行安装并重启Android Studio。 图1.png安装好之后&#xff0c;在工具栏就会出一个图标 图2.png2. 配置gradle 根目录build.gr…

C语言中的二级指针(双指针)

二级指针又叫双指针。C语言中不存在引用&#xff0c;所以当你试图改变一个指针的值的时候必须使用二级指针。C中可以使用引用类型来实现。 下面讲解C中的二级指针的使用方法。 例如我们使用指针来交换两个整型变量的值。 错误代码如下&#xff1a; 一级指针 [cpp] view pla…