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));
}

Hibernate入门教程的更多相关文章

  1. Hibernate入门教程(二):Hibernate核心API

    1.Configuraction onfiguration configuration = new Configuration(); configuration.configure(); 到src下面 ...

  2. Hibernate入门教程(一):入门示例(Myeclipse)

    ●项目结构 ●本项目所用Hibernate版本为5.4.5.Final,导入jar只需lib目录下的required和MySQL所需的jar驱动 1.导入相关jar包(配置构建路径) 说明:本人已将所 ...

  3. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

  4. 脚本语言丨Batch入门教程第四章:调用与传参

    今天是Batch入门教程的最后一章内容:调用与传参.相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式.今后 ...

  5. 【转帖】Systemd 入门教程:命令篇

    Systemd 入门教程:命令篇  Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...

  6. spring boot入门教程——Spring Boot快速入门指南

    Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...

  7. RabbitMQ入门教程(十六):RabbitMQ与Spring集成

    原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  8. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  9. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

随机推荐

  1. Java方法重写与super关键字

    ----------siwuxie095                     方法的重写:     (1)在继承中也存在着重写的概念,其实就是子类定义了和父类同名的方法     (2)定义:方法名 ...

  2. alinode 配置 pm2

    今天公司要配置阿里的一个node.js性能监控(alinode),这个东西看似配置很简单但是你不知道你配置对没对, 因为他需要1分钟后才能显示出来,而且模块依赖我等了10分钟才出来, 文档的链接htt ...

  3. 关于《Spark快速大数据分析》运行例子遇到的报错及解决

    一.描述 在书中第二章,有一个例子,构建完之后,运行: ${SPARK_HOME}/bin/spark-submit --class com.oreilly.learningsparkexamples ...

  4. jedis的publish/subscribe[转]含有redis源码解析

    首先使用redis客户端来进行publish与subscribe的功能是否能够正常运行. 打开redis服务器 [root@localhost ~]# redis-server /opt/redis- ...

  5. python2.7 跨文件全局变量的方法-乾颐堂

    在使用Python编写的应用的过程中,有时会遇到多个文件之间传递同一个全局变量的情况. 文件1:globalvar.py 1 2 3 4 5 6 7 8 9 10 11 12 #!/usr/bin/e ...

  6. spring boot☞Swagger2文档构建及单元测试

    首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...

  7. es学习-索引管理

    1.创建索引 http://localhost:9200/suoyinguanli211/ 参数: { "settings":{ "index":{ ,分片数 ...

  8. URAL 1430. Crime and Punishment(数论)

    题目链接 题意 :给你a,b,n,让你找出两个数x,y,使得n-(a*x+b*y)最小. 思路 : 分大小做,然后枚举a的倍数 #include <stdio.h> #include &l ...

  9. oracle 非sys用户创建新用户 授权后 plsql看不到视图

     问题: oracle 非sys用户创建新用户 授权后  plsql看不到视图 答案: 新用户查询视图时,视图名称前需要添加 视图所属用户. 如user用户新建newUser用户,newUser用户查 ...

  10. delphi弹出选择对话框选择目录|SelectDirectory 函数(转)

    SelectDirectory 函数 通过显示一个对话框来让用户选择一个目录.注意:在使用前要在Uses 语句中添加包含FileCtrl 的说明.函数原型如下:function SelectDirec ...