ssh架构之hibernate(一)简单使用hibernate完成CRUD

1.Hibernate简介

   Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
为什么要使用Hibernate
    这个需要从Hibernate的起源开始分析。 Hibernate之父Gavin发现咱们以前的开发效率太低,特别在Java这种面向对象的语言在与关系型数据库之间的数据交互太麻烦了。于是开发出了hibernate。 我对他当时的思维的理解是,我们是Java程序员,就算我不懂SQL,我认为自己也应该可以来操作数据库。
面试题:为什么要使用Hibernate?
首先简单解释一下hibernate是一个ORM的框架,底层依然使用JDBC。 然后简述一下它与JDBC之间的优缺点.

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


JDBC的优缺点
本质:处理Java对象和关系型数据库表之间的转换
优点:
操作数据库最底层,性能最高(需要你是有相应的经验,并且是一个数据库高手)
缺点:    
1.使用复杂(重复代码太多)    
2.移植数据库很麻烦,改动比较多        主键的生成方式不同(mysql使用自增,oracle使用序列)        分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)    
3.性能优化得自己处理,没有提供数据的缓存
4.面向sql语句操作,不是面向对象的


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(可    以使用数据库读写分离,分库分表方案解决)

面试题:查询1千万条数据,怎么才是最快的? 先把数据放到缓存(内存)中?
      1000千万条数据 分页显示1000条
  执行SQL:查出1000条显示
在查询完之后,偷偷的查询下一页的数据,放到缓存中

Hibernate的历史

 Hibernate:之前EJB完成ORM是非常复杂的,Hibernate的作者是Gavin King。
  PS:也许Cirrus Technologies的老板做梦也想不到两年以后,这个小伙子开发出的那个产品会成为全世界最流行的O/R Mapping工具,而那个对SQL和数据库一窍不通的小伙子居然会成为全世界J2EE数据库解决方案的领导者。
01年末:hibernate的第一个版本
03 年6月,HIbernate2获得Jolt 2004 大奖,9被JBoss收纳为子项目
  PS:2003年9月,Gavin King在他网站上向全世界发起挑战:谁要是能对一段代码用JDBC开发做到效率比hibernate高好多,就给他100美金
05 年3月,Hibernate3正式发布
10 年4月,3.5发布,支持JPA

2.hibernate入门

      简单使用hibernate做CRUD

            步骤
    0.拷贝jar包
    1.建立model
    2.建立映射文件
    3.建立hibernate核心配置文件
    4.编辑dao实现类
    5.测试
       0.拷贝jar包
   

    1.建立model---LoginUser

 1 package com.hibernate.day01.model;
 2 
 3 /**
 4  * Created by asus on 2017/6/1.
 5  */
 6 
 7 public class LoginUser {
 8     private Integer id;
 9     private String password;
10     private String userName;
11     private Integer age;
12     private Integer salary;
13     private String createTime;
14 
15     public Integer getSalary() {
16         return salary;
17     }
18 
19     public void setSalary(Integer salary) {
20         this.salary = salary;
21     }
22 
23     public String getCreateTime() {
24         return createTime;
25     }
26 
27     public void setCreateTime(String createTime) {
28         this.createTime = createTime;
29     }
30 
31     public Integer getAge() {
32         return age;
33     }
34 
35     public void setAge(Integer age) {
36         this.age = age;
37     }
38 
39     public Integer getId() {
40         return id;
41     }
42 
43     public void setId(Integer id) {
44         this.id = id;
45     }
46 
47     public String getPassword() {
48         return password;
49     }
50 
51     public void setPassword(String password) {
52         this.password = password;
53     }
54 
55     public String getUserName() {
56         return userName;
57     }
58 
59     public void setUserName(String userName) {
60         this.userName = userName;
61     }
62 }
LoginUser

    2.建立映射文件---loginuser.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
 3         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 4 <!-- 映射文件 -->
 5 <!-- 在映射文件出现的name属性都是指的java的类名,属性名 -->
 6 <!-- 在映射文件出现的column属性都是指的数据库表的字段(列)名:也可以不写,使用name属性的值 -->
 7 <!-- 在映射文件出现的type属性是:1.java的全限定类名java.lang.Long 2.也可以是hibernate的类型名称long 3.也可以不写,hibernate会通过反射技术获取java的类型 -->
 8 <hibernate-mapping package="com.hibernate.day01.model">
 9     <!-- class表示一个由hibernate管理的持久对象,对应数据库的一个表 -->
10     <!-- table数据库的表名 -->
11     <class name="LoginUser" table="login_user">
12         <!-- id元素(节点)是必须的,是代表表的主键 -->
13     <id name="id" column="id">
14         <!-- generator表示主键的生成方式,多数都是使用native -->
15         <!-- native自动选择数据库本地的策略: -->
16         <!-- mysql:AUTO_INCREMENT自增 --><!-- oracle:序列 -->
17         <generator class="native" />
18     </id>
19         <!-- 非主键属性 -->
20         <property name="userName" column="user_name" />
21         <property name="password" column="password"/>
22        <!-- &lt;!&ndash; default="25"还必须同时配置一个属性insert="false",表示不出现在insert语句 &ndash;&gt;
23         <property name="age" insert="false">
24             <column name="age" default="25" />
25         </property>
26         &lt;!&ndash; update=false:一经保存就不能修改属性:身份证号码,创建时间 &ndash;&gt;
27         <property name="createTime" column="create_time" update="false"/>-->
28     </class>
29 </hibernate-mapping>
loginuser.hbm.xml

    3.建立hibernate核心配置文件---hibernate2.cfg.xml

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6     <session-factory>
 7         <!-- Database connection settings
 8         -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="connection.url">jdbc:mysql://10.3.2.25:3306/hibernate</property>
11         <property name="connection.username">root</property>
12         <property name="connection.password">admin</property>
13         <!-- JDBC connection pool (use the built -in) JDBC连接池(使用内置) -->
14        <!-- <property name="connection.pool_size">1</property>-->
15         <!-- SQL dialect  -->
16         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
17         <!-- Enable Hibernate's automatic session context management
18         hibernate将session从当前线程中释放,并且关闭session
19         -->
20      <!--   <property name="current_session_context_class">thread</property>-->
21         <!-- Disable the second-level cache -->
22      <!--   <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>-->
23         <!-- Echo all executed SQL to stdout  -->
24         <property name="show_sql">true</property>
25         <!-- Drop and re-create the database schema on startup-->
26         <property name="hbm2ddl.auto">update</property>
27         <mapping resource="mapper/loginuser.hbm.xml"/>
28        <!-- <mapping class="com.hibernate.day01.model.LoginUser" />-->
29     </session-factory>
30 </hibernate-configuration>
hibernate.cfg.xml

    4.编辑dao实现类

  1 package com.hibernate.day01.dao.impl;
  2 
  3 import com.hibernate.day01.dao.ILoginUserDao;
  4 import com.hibernate.day01.model.LoginUser;
  5 import org.hibernate.Query;
  6 import org.hibernate.Session;
  7 import org.hibernate.SessionFactory;
  8 import org.hibernate.cfg.Configuration;
  9 
 10 import java.util.List;
 11 
 12 /**
 13  * Created by asus on 2017/6/1.
 14  */
 15 public class LoginUserDao implements ILoginUserDao {
 16     @Override
 17     public void save(LoginUser loginUser) {
 18         // 读取并且解析配置文件(包含映射文件)
 19         Configuration configuration = new Configuration();
 20         // 加载默认配置文件hibernate.cfg.xml
 21         // configuration.configure();
 22         // 加载非默认配置文件hibernate.cfg.xml
 23          configuration.configure("hibernate2.cfg.xml");
 24         // 生成会话工厂(真正解析配置文件)
 25         SessionFactory sessionFactory = configuration.buildSessionFactory();
 26         // 获取Session对象
 27         Session session = sessionFactory.openSession();
 28         // 开启事务
 29         // 用法1
 30         //Transaction transaction = session.getTransaction();
 31         // transaction.begin();
 32         // 用法2   hibernate默认情况下是没有开启事务的,必须手动开启事务
 33          session.beginTransaction();
 34         // 操作CUD
 35         session.save(loginUser);// 持久状态
 36         // 提交事务
 37         session.getTransaction().commit();
 38         // 关闭资源
 39         session.close();// 游离状态
 40         sessionFactory.close();
 41     }
 42     @Override
 43     public void delete(Integer id) {
 44         //创建读取文件的类
 45         Configuration configuration=new Configuration();
 46         //加载文件
 47         configuration.configure("hibernate2.cfg.xml");
 48         //获得sessionFactory对象
 49         SessionFactory sessionFactory = configuration.buildSessionFactory();
 50         //获得session
 51         Session session = sessionFactory.openSession();
 52         //开启事务
 53         session.beginTransaction();
 54         //执行操作
 55         LoginUser loginUser=new LoginUser();
 56         loginUser.setId(id);
 57         session.delete(loginUser);//删除状态
 58         //关闭事务
 59         session.getTransaction().commit();
 60         //关闭session
 61         session.close();
 62         //关闭sessionFactory
 63         sessionFactory.close();
 64 
 65     }
 66 
 67     @Override
 68     public void update(LoginUser loginUser) {
 69         //创建读取文件的类
 70         Configuration configuration=new Configuration();
 71         //加载文件
 72         configuration.configure("hibernate2.cfg.xml");
 73         //获得sessionFactory对象
 74         SessionFactory sessionFactory = configuration.buildSessionFactory();
 75         //获得session
 76         Session session = sessionFactory.openSession();
 77         //开启事务
 78         session.beginTransaction();
 79         //执行操作
 80         session.update(loginUser);
 81         //关闭事务
 82         session.getTransaction().commit();
 83         //关闭session
 84         session.close();
 85         //关闭sessionFactory
 86         sessionFactory.close();
 87     }
 88 
 89     @Override
 90     public LoginUser getLoginUser(Integer id) {
 91         //创建读取文件的类
 92         Configuration configuration=new Configuration();
 93         //加载文件
 94         configuration.configure("hibernate2.cfg.xml");
 95         //获得sessionFactory对象
 96         SessionFactory sessionFactory = configuration.buildSessionFactory();
 97         //获得session
 98         Session session = sessionFactory.openSession();
 99         //开启事务
100       // session.beginTransaction();  查询操作不需要事务
101         //执行操作
102         LoginUser loginUser=(LoginUser) session.get(LoginUser.class,id);
103         //关闭事务
104        // session.getTransaction().commit();
105         //关闭session
106         session.close();
107         //关闭sessionFactory
108         sessionFactory.close();
109         return loginUser;
110     }
111 
112     @Override
113     public List<LoginUser> getList() {
114         //创建读取文件的类
115         Configuration configuration=new Configuration();
116         //加载文件
117         configuration.configure("hibernate2.cfg.xml");
118         //获得sessionFactory对象
119         SessionFactory sessionFactory = configuration.buildSessionFactory();
120         //获得session
121         Session session = sessionFactory.openSession();
122         //开启事务
123         // session.beginTransaction();
124         //执行操作
125        String hql="select o from com.hibernate.day01.model.LoginUser o";
126         Query query = session.createQuery(hql);
127         List<LoginUser> list = query.list();
128         //关闭事务
129         // session.getTransaction().commit();
130         //关闭session
131         session.close();
132         //关闭sessionFactory
133         sessionFactory.close();
134         return list;
135     }
136 
137 }
LoginUserDao

    5.测试

 1 import com.hibernate.day01.dao.impl.LoginUserDao;
 2 import com.hibernate.day01.dao.impl.ProductDao;
 3 import com.hibernate.day01.model.LoginUser;
 4 import com.hibernate.day01.model.Product;
 5 import org.junit.Test;
 6 
 7 import java.util.List;
 8 
 9 /**
10  * Created by asus on 2017/6/1.
11  */
12 public class HibernateTest {
13     @Test
14     public void testSave(){
15         LoginUserDao loginUserDao=new LoginUserDao();
16         LoginUser loginUser=new LoginUser();
17         loginUser.setUserName("tesg");
18         loginUser.setPassword("47894");
19         loginUser.setAge(58);
20         loginUserDao.save(loginUser);
21     }
22     @Test
23     public void testDelete(){
24         LoginUserDao loginUserDao=new LoginUserDao();
25         loginUserDao.delete(9);
26     }
27     @Test
28     public void testUpdate(){
29         LoginUserDao loginUserDao=new LoginUserDao();
30         LoginUser loginUser=new LoginUser();
31         loginUser.setId(10);
32         loginUser.setUserName("已经改了2");
33         loginUserDao.update(loginUser);
34     }
35     @Test
36     public void testGet(){
37         LoginUserDao loginUserDao=new LoginUserDao();
38         LoginUser loginUser = loginUserDao.getLoginUser(10);
39         System.out.println("--------loginUser-----"+loginUser);
40     }
41     @Test
42     public void testList(){
43         LoginUserDao loginUserDao=new LoginUserDao();
44         List<LoginUser> list = loginUserDao.getList();
45         System.out.println("---------list----"+list.size());
46     }
47 }
HibernateTest

hibernate简单实现CRUD完成

转载于:https://www.cnblogs.com/newAndHui/p/8514139.html

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

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

相关文章

使用AspectJ审计Spring MVC Webapp。 第1部分

如果您像我一样&#xff0c;那么您将拥有那种编程天&#xff0c;一切似乎都进展顺利。 您编写代码和测试&#xff0c;它就可以正常工作。 然后还有其他日子&#xff0c;非常糟糕的日子&#xff0c;在那儿&#xff0c;您知道所编写的所有内容都尽可能正确&#xff0c;并且代码拒…

GitHub注册和Git安装

一、注册GitHub GitHub官方地址&#xff1a;https://github.com。 在浏览器中打开GitHub网址&#xff0c;通过首页进行注册&#xff0c;如下图所示。 二、安装Git Git官方下载地址&#xff1a;http://git-scm.com/download/。 Git支持多平台&#xff08;Mac OS X/Windows/Linux…

如何存储和恢复 HTML5 Canvas 状态

当我们在 HTML5 Canvas 上使用其 2D 上下文进行图形绘制的时候&#xff0c;可以通过操作 2D 上下文的属性来绘制不同风格的图形&#xff0c;例如不同字体、填充等等。 通常情况下&#xff0c;在画布上的绘图时&#xff0c;您需要更改在绘制的2D背景下的状态。例如&#xff0c;你…

innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍

一&#xff0c;MySQL基本架构MySQL基础架构可以分为两大类&#xff1a;Server层和存储引擎层。Server层&#xff1a; Server层涵盖了MySQL大部分核心业务功能&#xff0c;并且所有存储引擎的功能都在这一层实现。存储引擎层&#xff1a;存储引擎有很多&#xff0c;各自有着各自…

Java EE EJB拦截器教程和示例

在此示例中&#xff0c;我们将看到如何在EJB中使用拦截器并使用简单的Web应用程序对其进行测试。 1.简介 顾名思义&#xff0c;当您想拦截对EJB方法的调用时&#xff0c;将使用拦截器。 如果为Bean声明一个拦截器&#xff0c;则每次调用该Bean的方法时&#xff0c;该拦截器的一…

Mac python Tesseract 验证码识别

Tesseract 简介 Tesseract(/tesərkt/) 这个词的意思是"超立方体"&#xff0c;指的是几何学里的四维标准方体&#xff0c;又称"正八胞体"。不过这里要讲的&#xff0c;是一款以其命名的开源 OCR(Optical Character Recognition, 光学字符识别) 软件。 所谓…

如何判断html页面停止滚动?

写在开始的话 查遍的文献&#xff0c;没有找到js或者jquery定义好的方法可用&#xff0c;最后迫不得已自己写了个方法。&#xff08;如果哪位同学知道有其他方法&#xff0c;欢迎讨论&#xff09; 代码 var count_index 0;$(window).scroll(function(e) {if(count_index 0) {…

php 打乱数组顺序_PHP实现大转盘抽奖算法

php中文网最新课程每日17点准时技术干货分享本文通过具体的实例向大家介绍了PHP语言实现大转盘抽奖算法&#xff0c;希望对大家学习PHP抽奖有所帮助。流程&#xff1a;1.拼装奖项数组&#xff1b;2.计算概率&#xff1b;3.返回中奖情况。代码如下&#xff1a;中奖概率 v 可以…

linux线程基础篇----线程同步与互斥

linux线程基础----线程同步与互斥 一、同步的概念 1.同步概念 所谓同步&#xff0c;即同时起步&#xff0c;协调一致。不同的对象&#xff0c;对“同步”的理解方式略有不同。如&#xff0c;设备同步&#xff0c;是指在两个设备 之间规定一个共同的时间参考&#xff1b;数据库同…

分布式系统开发注意事项

开发分布式软件系统时&#xff0c;要考虑许多因素。 如果您甚至不知道第一句话中我在说什么&#xff0c;那么让我为您提供一些见解&#xff0c;示例以及有关分布式系统的实例。 总览 分布式系统是指多个物理硬件设备与单独的离散用户交互并通过这些硬件设备协作以为这些离散的…

只需5步,轻松创建HTML5离线应用

1 – 添加 HTML5 doctype第一件要做的事情是创建一个符合规范的 HTML5 文档。HTML5 doctype 相比于 xhtml 版本的 doctype 而言&#xff0c;要简单明了得多&#xff1a; <!DOCTYPE html><html> ...创建一个名为 index.html 的文档&#xff0c;或者猛击这里下载这份…

Java EE 7发布–反馈和新闻报道

Java EE 7已经存在了几天。 我们所有人都有机会观看直播活动或可用的重播 。 最后的MR版本完成了将他们的工作推向JCP的过程&#xff0c;基本上是一个总结。 是时候反思发生的事情以及我对此的想法了。 启动活动中的社区参与 这不是一个大秘密。 即使Oracle的Java EE 7发行可以…

HTML5中的本地数据库-Web SQL Database

html5增加新的特性&#xff0c;那就是增加了本地存储&#xff01;改善用户体验&#xff0c;或许html5会带着我们走进新的互联网时代。 下面看看怎样操作web 数据库吧&#xff01;&#xff01;首先新建数据库&#xff01; var db window.openDatabase("mydata", &quo…

解决swiper-slide在ion-slide-box不滑动的问题(暂且这么描述)

1&#xff0c;开发环境ionic1angularjs1 嗯对的版本都是最低版本 页面结构想要完成的功能是这样的&#xff08;比较丑 &#xff0c;不接受批评&#xff0c;捂脸&#xff09; 大致如图 代码结构&#xff1a; <ion-slide-box><ion-slide> //列表 <div class"…

Win10 系统直接在目录下打开cmd

每次用cmd命令&#xff0c;就要定位到当前文件夹&#xff0c;很麻烦&#xff0c;于是想了下&#xff0c;可不可以直接定位到要操作的文件夹&#xff0c;百度了一下&#xff0c;果然&#xff0c;度娘没有让我失望&#xff0c; 美滋滋的试了下。真的可以。在此记录下&#xff0c;…

今日学到乱写

EXPLAIN 直接上图 一个个说&#xff1a; select_type 查询中每个select子句的类型&#xff08;简单OR复杂&#xff09; a. SIMPLE&#xff1a;查询中不包含子查询或者UNION b. 查询中若包含任何复杂的子部分&#xff0c;最外层查询则被标记为&#xff1a;PRIMARY c. 在SELECT或…

hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践

追求极致才能突破极限一、案例背景1.1 系统简介首先看一下系统架构&#xff0c;方便解释&#xff1a;页面给用户展示的功能就是&#xff0c;可以查看任何一台机器的某些属性(以下简称系统信息)。消息流程是&#xff0c;页面发起请求查看指定机器的系统信息到后台&#xff0c;后…

Java EE CDI依赖关系消歧示例

在本教程中&#xff0c;我们将向您展示如何避免CDI bean中的依赖关系消除歧义。 在CDI中&#xff0c;我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入。 依赖关系消除歧义的问题是客户端如何在不同的实现中调用特定的实现&#xff0c;而不会发生任何错误。 为了…

linux java 安装配置_类Linux环境安装jdk1.8及环境变量配置详解

配置很简单&#xff0c;但是每次都要查一下&#xff0c;索性就记录下1. 安装前准备1.1 创建安装目录&#xff0c;习惯上通常安装在/usr/local/jdk8目录下mkdir /usr/local/jdk81.2 查看是否安装过jdk&#xff0c;安装前要把之前的删除干净# 通过jdk环境变量查看echo $JAVA_HOME…

Mac版Anaconda安装R语言iGraph包

Anaconda官网给出的R语言Igraph包安装方法&#xff1a;https://anaconda.org/r/r-igraph 查阅Anaconda官方文档&#xff0c;可以通过以下控制台命令安装R语言Igraph包。 conda install -c r r-igraph 在控制台执行后&#xff0c;系统可能会提示未找到conda指令&#xff0c; 所以…