Hibernate入门教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Hibernate 随心所欲的使用面向对象思想操纵数据库. Table of contents介绍搭建开发环境半sql半面向对象写法完全的sql写法完全的面向对象写法HibernateHibernate是一个开放源代码的对象关系映...

Hibernate

随心所欲的使用面向对象思想操纵数据库.


Table of contents

Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库,从而无需顾及数据库的实现究竟是SQLServer还是Mysql还是Oracle

搭建环境

搭建在一般工程中

  1. jar下载
  2. 配置文件

jar下载

官网Hibernate进入后看到hibenate ORM,点击more,左侧边栏选择releases中的一个版本,页面最下方,选择download下载即可
官方jar包:lib文件:requeired文件里的所有jar拷贝到自己的新建工程中去,然后在加上连接数据库相关的包,mysql-connector

配置文件

Hibernate.cfg.xml放置在src下,需要修改url,username和password

    <?xmlversion='1.0'encoding='utf-8'?>
    <!DOCTYPEhibernate-configurationPUBLIC
    "-//Hibernate/HibernateConfigurationDTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    <session-factory>
    <propertyname="connection.url">jdbc:mysql://localhost:3306/mycms</property>
    <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
    <propertyname="connection.username">root</property>
    <propertyname="connection.password">123456</property>
    
    <mappingresource="com/selton/Node.hbm.xml"></mapping>
    </session-factory>
    </hibernate-configuration>

<mappingresource="com/selton/Node.hbm.xml"></mapping>

Node.hbm.xml 映射到具体的pojo,一个pojo配置一个映射的xml
名字和数据库的名字即使一样,也需要写上property的映射

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.selton">
    <class name="com.selton.Node" table="tree">
        <id name="id" column="id">
            <generator class="native"></generator>
            <!--可以实现自动增长,也就是将实体类存储到数据库的时候,少set一个主键
               比较疑惑,反正有没有这句话,数据库那儿都需要自动增长-->
        </id>
    
        <property name="nodeId" column="nodeId"></property>
        <property name="pid" column="pid"></property>
        <property name="type" column="type"></property>
        <property name="url" column="url"></property>
        <property name="icon" column="icon"></property>
        <property name="description" column="description"></property>
        <property name="level" column="level"></property>
        <property name="name" column="name"></property>
    </class>
    
    </hibernate-mapping>

pojo的主键属性名称对应到数据库实体的主键名称写在id中
,其他的写在property中

半sql半面向对象写法

在一个入口方法或者测试类方法中,加入

//构建上下文换肩加配置连接池,开启事务
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//这里填写测试代码
//提交事务并关闭各种流
transaction.commit();
session.close();
sessionFactory.close();

以下的测试代码,分别放在上面代码的`这里填写测试代码

单个数据存储到数据库

    Node node = new Node();;
    node.setNodeId("testNodeId1");
    node.setPid("testPid1");
    node.setType((byte)1);
    node.setLevel((short)1);
    node.setName("testName1");
    session.save(node);  

查询单个对象

Node node=(Node)session.get(Node.class,1);
System.out.println(node);
//Node.class后面的1是数据库中的主键值  

更新单个对象

Node node=(Node)session.get(Node.class,10);
node.setName("updateName");
session.update(node);  

删除对象

Node node = (Node) session.get(Node.class, 10);
session.delete(node);  

查询整个表

这里需要注意,如果你的pojo叫 myuser,而数据库中对应的表叫user,所有使用createQuery的地方,涉及到了表,就该填myuser

Query query = session.createQuery("FROM Node");
List list = query.list();
System.out.println("list = " + list);  

查询某个对象的某个属性

Query query = session.createQuery("SELECT nodeId FROM Node");
List list = query.list();
System.out.println("list = " + list);  

查询指定行数据

Query query = session.createQuery("FROM Node WHERE type=?");
query.setParameter(0,10);
List list = query.list();
System.out.println("list = " + list);  

查询指定数据传回一个实体

//需要pojo有相应的构造器
Query query = session.createQuery("SELECT new Node(id,name,nodeId) FROM Node");
List<Node> list = query.list();
System.out.println("list = " + list);  

分组聚合

Query query = session.createQuery("SELECT type,SUM(id) FROM Node GROUP BY type");
List list = query.list();
for (Object o : list) {
    Object[] result = (Object[]) o;
    System.out.println(Arrays.toString(result));
}  

排序

Query query = session.createQuery("FROM Node ORDER BY id DESC");
List list = query.list();
System.out.println("list = " + list);  

limit

Query query = session.createQuery("FROM Node ORDER BY id DESC");
query.setFirstResult(2);
query.setMaxResults(3);
List list = query.list();
System.out.println("list = " + list);  

使用参数

String colName = "id";
String sql = "FROM Node WHERE " + colName + "=?";
Query query = session.createQuery(sql);
query.setParameter(0,6);

Node node = (Node) query.uniqueResult();
System.out.println("node = " + node);  

或者这种

Query query = session.createQuery("FROM Node WHERE id:id");
query.setParameter("id",7);
List list = query.list();
System.out.println("list = " + list);  

in

Query query = session.createQuery("FROM Node WHERE id IN(:ids)");
query.setParameterList("ids",new Object[]{4,6,7});
List list = query.list();
System.out.println("list = " + list);
//In 的效率很低

写在配置文件里

User.hbm.xml

<hibernate-mapping>
... 
<query name="getUserByAge">
    FROM Node WHERE id between ? AND ?
</query>
...
</hibernate-mapping>  

代码部分

Query query = session.getNamedQuery("getUserByAge");
query.setParameter(0,6);
query.setParameter(1,8);
List list = query.list();
System.out.println("list = " + list);  

完全的sql写法

仿照第一种半sql写法,格式变化就可以

1.原生sql写法

SQLQuery query = session.createSQLQuery("SELECT * FROM tree");
query.addEntity(Node.class);
List list = query.list();
System.out.println("list = " + list);  

完全的面向对象写法

仿照第一种半sql写法,格式变化就可以

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.eq("id",6));
List list = criteria.list();
System.out.println("list = " + list);  

相当于查出来了所有的放在criteria里面

不等于

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
List list = criteria.list();
System.out.println("list = " + list);  

排序

Criteria criteria = session.createCriteria(Node.class);
criteria.addOrder(Order.desc("id"));
List list = criteria.list();
System.out.println("list = " + list);  

添加分页

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List list = criteria.list();
System.out.println("list = " + list);  

分组聚合

Criteria criteria = session.createCriteria(Node.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("id"));
projectionList.add(Projections.groupProperty("type"));
criteria.setProjection(projectionList);
List list = criteria.list();
for (Object o : list) {
    Object[] result = (Object[]) o;
System.out.println(Arrays.toString(result));
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
编解码 定位技术
谷歌地图分辨率表
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/73949818 ...
2424 0
|
关系型数据库 开发工具 git
Greenplum ORCA 优化器的编译安装与使用
背景 ORCA 是PostgreSQL的下一代优化器,在QUERY的优化上比自带的优化器有长足的进步。 安装ORCA cmake wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz tar -zxvf cmake-3.5.2.tar
10962 0
|
存储 Linux API
Linux内核文件cache管理机制介绍
1 操作系统和文件Cache管理 操作系统是计算机上最为重要的软件,他负责管理计算机的各种硬件资源,并将这些物理资源抽象成各种接口供上层应用使用。所以从程序的角度看,操作系统就好比是一个虚拟机,这个虚拟机不提供各种硬件资源的具体细节,而仅仅提供进程、文件、地址空间以及进程间通信等等逻辑概念。 对于存储设备上的数据,操作系统向应用程序提供的逻辑概念就是“文件”。应用程序要存储或访问数据时
2169 0
|
前端开发 JavaScript Java
基于springboot+vue前后端分离的学生在线考试管理系统
基于springboot+vue前后端分离的学生在线考试管理系统
473 0
基于springboot+vue前后端分离的学生在线考试管理系统
|
存储 机器学习/深度学习 人工智能
业内首次融合数据仓库与数据湖 阿里云推出下一代大数据平台 “湖仓一体”
2020年9月18日,阿里云在云栖大会正式推出大数据平台的下一代架构——“湖仓一体”,打通数据仓库和数据湖两套体系,让数据和计算在湖与仓之间自由流动,从而构建一个完整的有机的大数据技术生态体系。为企业提供兼具数据湖的灵活性和数据仓库的成长性的新一代大数据平台,降低企业构建大数据平台的整体成本。
10162 56
业内首次融合数据仓库与数据湖  阿里云推出下一代大数据平台 “湖仓一体”
|
小程序 JavaScript 前端开发
微信小程序 | 酷炫时钟样式整理【附源码】
微信小程序 | 酷炫时钟样式整理【附源码】
760 0
微信小程序 | 酷炫时钟样式整理【附源码】
|
存储 前端开发 Java
IDEA 新手入门:创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等使用详解
IDEA 新手入门:创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等使用详解
527 0
IDEA 新手入门:创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等使用详解
|
设计模式 Java Shell
Zookeeper入门到精通05——Zookeeper客户端命令行操作
Zookeeper客户端命令行操作 5.1 常见命令行操作 5.2 查看节点信息 5.3 节点类型与对应操作 5.3.1 节点类型 5.3.2 创建节点 5.3.3 监听器原理
Zookeeper入门到精通05——Zookeeper客户端命令行操作
|
存储 缓存 编解码
Metal 案例05:视频采集 & 实时渲染
本案例主要是利用Metal实现摄像头采集内容的即刻渲染处理,理解视频采集、处理及渲染的流程
566 0
Metal 案例05:视频采集 & 实时渲染
|
编解码 图形学 Android开发
解锁爬坑新技能:FairyGUI在Unity中遇见的问题-补充
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
734 0