框架是什么

1.框架是用来提高开发效率的

2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现.

3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可.

orm分4级

1.hibernate属于4级:完全面向对象操作数据库

2.mybatis属于2级

3. dbutils属于1级

hibernate的好处

操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句

使用配置文件(或者其他手段),将对象的信息与数据库中的表进行对应

使用步骤:

1.导包  required (9个) + 数据库驱动包 + jpa(事务相关的)

2.准备实体  然后书写映射文件

  1. <hibernate-mapping package="com.domain">
  2. <class name="Users" table="t_user">
  3. <id name="id" column="sId">
  4. <generator class="native"></generator>
  5. </id>
  6. <property name="name" column="sname"></property>
  7. <property name="age" column="sage" type="Integer"></property>
  8. </class>
  9. </hibernate-mapping>

主配置文件

主配置作用:数据库连接配置  加载所用的映射(*.hbm.xml)

  1. <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>
  2. 如果是file 就是绝对路径

测试

  1. public class App {
  2. public void testHello() throws Exception {
  3. // 获取加载配置文件的管理类对象
  4. Configuration config = new Configuration();
  5. config.configure(); // 默认加载src/hibenrate.cfg.xml文件
  6. // 创建session的工厂对象
  7. SessionFactory sf = config.buildSessionFactory();
  8. // 创建session (代表一个会话,与数据库连接的会话)
  9. Session session = sf.openSession();
  10. // 开启事务
  11. Transaction tx = session.beginTransaction();
  12. //保存-数据库
  13. session.save(emp);
  14. // 提交事务
  15. tx.commit();
  16. // 关闭
  17. session.close();
  18. sf.close();
  1. // 创建配置管理类对象
  2. Configuration config = new Configuration();
  3. // 加载主配置文件
  4. config.configure();
  5. // 创建工具类对象
  6. SchemaExport export = new SchemaExport(config);
  7. // 建表
  8. // 第一个参数: 是否在控制台打印建表语句 第二个参数: 是否执行脚本
  9. export.create(true, true);

配置文件详解

描述一个对象最终实现可以直接保存对象数据到数据库中

package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)

auto-import 默认为true, 在写hql的时候自动导入包名 , 如果指定为false, 再写hql的时候必须要写上类的全名

class元素

class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)

name 指定要映射的对象的类型

table 指定对象对应的表的名称  如果没有指定表名,默认与对象名称一样

id元素

  1. 主键的生成策略
  2. identity 自增长(mysql,db2)
  3. sequence 自增长(序列), oracle中自增长是以序列方法实现
  4. native 自增长【会根据底层数据库自增长的方式选择identitysequence
  5. 如果是mysql数据库, 采用的自增长方式是identity
  6. 如果是oracle数据库, 使用sequence序列的方式实现自增长
  7.  
  8. increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
  9.  
  10. assigned 指定主键生成策略为手动指定主键的值
  11. uuid 指定uuid随机生成的唯一的值
  12. foreign (外键的方式, one-to-one讲)

property元素

普通字段映射

property

name  指定对象的属性名称

column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。

length 指定字符的长度, 默认为255  只能为String指定

type   指定映射表的字段的类型,如果不指定会匹配属性的类型

java类型:     必须写全名  建议使用  下面的会发生转化

hibernate类型:  直接写类型,都是小写

如果列名称为数据库关键字,需要用反引号或改列名

复合主键映射

  1. // 复合主键类
  2. public class CompositeKeys implements Serializable{
  3. private String userName;
  4. private String address;
  5. }
  6. public class User {
  7. // 名字跟地址,不会重复
  8. private CompositeKeys keys;
  9. private int age;
  10. }
  1. <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true">
  2. <class name="User">
  3. <!-- 复合主键映射 -->
  4. <composite-id name="keys">
  5. <key-property name="userName" type="string"></key-property>
  6. <key-property name="address" type="string"></key-property>
  7. </composite-id>
  8. <property name="age" type="int"></property>
  9. </class>
  10. </hibernate-mapping>
  1. public void testSave() throws Exception {
  2. Session session = sf.openSession();
  3. Transaction tx = session.beginTransaction();
  4. // 对象
  5. CompositeKeys keys = new CompositeKeys();
  6. keys.setAddress("广州棠东");
  7. keys.setUserName("Jack");
  8. User user = new User();
  9. user.setAge(20);
  10. user.setKeys(keys);
  11. // 保存
  12. session.save(user);
  13. tx.commit();
  14. session.close();
  15. }

查询的时候 也是需要构建主键 然后查询

hibernate主配置

必选属性配置(5个)

hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties

  1. #hibernate.dialect org.hibernate.dialect.MySQLDialect
  2. #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
  3. #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
  4. #hibernate.connection.driver_class com.mysql.jdbc.Driver
  5. #hibernate.connection.url jdbc:mysql:///test
  6. #hibernate.connection.username gavin
  7. #hibernate.connection.password
  8. hibernate前缀都可以不写

可选属性配置(3个)

#hibernate.hbm2ddl.auto create-drop 每次在创建sessionFactory时候执行创建表,当调用sesisonFactory的close方法的时候,删除表

#hibernate.hbm2ddl.auto create   每次都重新建表,如果表已经存在就先删除再创建

#hibernate.hbm2ddl.auto update  如果表不存在就创建,表存在就不创建;

#hibernate.hbm2ddl.auto validate  (生成环境时候) 执行验证,当映射文件的内容与数据库表结构不一样的时候就报错!

也可以通过代码来操作

  1. public class App_ddl {
  2. // 自动建表
  3. public void testCreate() throws Exception {
  4. // 创建配置管理类对象
  5. Configuration config = new Configuration();
  6. // 加载主配置文件
  7. config.configure();
  8. // 创建工具类对象
  9. SchemaExport export = new SchemaExport(config);
  10. // 建表
  11. // 第一个参数: 是否在控制台打印建表语句
  12. // 第二个参数: 是否执行脚本
  13. export.create(true, true);
  14. }
  15. }

一个表能否有多个主键?   不能   为什么要设置主键?   数据库存储的数据都是有效的,必须保持唯一。

元数据引入配置

hibernateAPI详解

Configuration

配置管理类对象

config.configure();    加载主配置文件的方法(hibernate.cfg.xml)    默认加载src/hibernate.cfg.xml

config.configure(“cn/config/hibernate.cfg.xml”);  加载指定路径下指定名称的主配置文件

config.buildSessionFactory();   创建session的工厂对象

加载主配置

加载orm元数据(扩展|了解)

创建sessionFactory

session的工厂(或者说代表了这个hibernate.cfg.xml配置文件) 因为一般只有一个Factory

sf.openSession();   创建一个sesison对象

sf.getCurrentSession();  创建session或取出session对象

SessionFactory

Session

session对象维护了一个连接(Connection), 代表了与数据库连接的会话

session.beginTransaction(); 开启一个事务:hibernate要求所有的与数据库的操作必须有事务的环境,否则不能操作成功

获得事务

Transaction tx = session.beginTransaction();

session.getTransaction()

session.save(obj);   保存一个对象

session.update(emp);  更新一个对象

session.saveOrUpdate(emp);  保存或者更新的方法:

à没有设置主键,执行保存;

有设置主键,执行更新操作

如果设置主键不存在报错

主键查询:

session.get(Employee.class, 1);    主键查询

session.load(Employee.class, 1);   主键查询 (支持懒加载)

增删改查

Transaction

封装了事务的操作.

打开事务

推荐使用

提交事务 session.commit()  回滚事务  session.callback()

HQL查询与SQL查询区别:

SQL: (结构化查询语句)查询的是表以及字段;  不区分大小写。

HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言

查询的是对象以及对象的属性。里面的使用的是自定义的类

区分大小写。“from Stu where uId=2”

Criteria查询: 完全面向对象的查询

本地SQL查询:  复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持

缺点:不能跨数据库平台

补充:

复合主键必须实现 Serialzable接口  最好实现equals和 hashcode方法

为什么要实现这个接口 ?      get(Class clazz, Serialzable id)

此时如果插入混合主键相同的元素对象,那么抛出异常

Hibernate框架学习1的更多相关文章

  1. hibernate框架学习笔记6:事务

    MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...

  2. hibernate框架学习笔记3:API详解

    Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...

  3. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

  4. [ SSH框架 ] Hibernate框架学习之三

    一.表关系的分析 Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置.数据 ...

  5. j2ee开发之hibernate框架学习笔记

    hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...

  6. hibernate框架学习笔记2:配置文件详解

    实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private ...

  7. hibernate框架学习笔记1:搭建与测试

    hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...

  8. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  9. hibernate框架学习之核心API

    ConfigurationSessionFactorySessionTransactionQueryCriteria Configuration Configuration对象用于封装Hibernat ...

  10. Hibernate框架学习笔记

      Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...

随机推荐

  1. .NET Core:过滤器

    过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码.功能上更贴合业务的使用过滤器. 在Startup中的ConfigureServices方 ...

  2. String.format方法使用-浅析(转)

    转自  https://blog.csdn.net/u010137760/article/details/82869637 1.代码中简单使用2.源码调用的方法3.相关类-Formatter3.1可选 ...

  3. 启动apache,将debug日志输出在console窗口

    sudo apachectl -k start -e DEBUG 点个广告吧亲:

  4. django实战(二)--带多字段模糊查询的分页(也是不容易)

    上节我们实现了分页功能,这节我们要实现对模糊查询后的结果进行分页.(引入了bootstrap框架) urls.py from django.urls import path from . import ...

  5. Phaser也可以实现countdownLatch的功能

    /** * 可用用phaser模拟countDownLatch * awaitAdvance方法:如果传入的参数和当前的phase相等,线程就阻塞住等待phase的值增加:否则就立即返回 */ pub ...

  6. Java程序使用Alpine Linux报错java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy解决

    报错内容 Caused by: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb11 ...

  7. 关于plupload组件无法拍照上传的解决方案

    关于plupload组件无法拍照上传的解决方案 其实是由于文件大小的问题 filters: { max_file_size: '2mb',//把这个调大些就可以了 前提是服务器支持 prevent_d ...

  8. set容器与map容器的简单应用

    set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...

  9. 移动前端viewPort的那些事

    1.viewport简单说 一般来说,移动上的viewport都是大于浏览器窗口的,不同的设备有自己默认的viewport值(980px或1024px). 2.三个viewport的理解(layout ...

  10. Object.assign的使用

    语法: Object.assign(target, ...sources)//target目标对象,sources源对象,返回值目标对象 使用说明: 如果目标对象中的属性具有相同的键,则属性将被源对象 ...