Hibernate框架学习1
框架是什么
1.框架是用来提高开发效率的
2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现.
3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可.
orm分4级
1.hibernate属于4级:完全面向对象操作数据库
2.mybatis属于2级
3. dbutils属于1级
hibernate的好处
操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句
使用配置文件(或者其他手段),将对象的信息与数据库中的表进行对应
使用步骤:
1.导包 required (9个) + 数据库驱动包 + jpa(事务相关的)
2.准备实体 然后书写映射文件
- <hibernate-mapping package="com.domain">
- <class name="Users" table="t_user">
- <id name="id" column="sId">
- <generator class="native"></generator>
- </id>
- <property name="name" column="sname"></property>
- <property name="age" column="sage" type="Integer"></property>
- </class>
- </hibernate-mapping>
主配置文件
主配置作用:数据库连接配置 加载所用的映射(*.hbm.xml)
- <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>
- 如果是file 就是绝对路径
测试
- public class App {
- public void testHello() throws Exception {
- // 获取加载配置文件的管理类对象
- Configuration config = new Configuration();
- config.configure(); // 默认加载src/hibenrate.cfg.xml文件
- // 创建session的工厂对象
- SessionFactory sf = config.buildSessionFactory();
- // 创建session (代表一个会话,与数据库连接的会话)
- Session session = sf.openSession();
- // 开启事务
- Transaction tx = session.beginTransaction();
- //保存-数据库
- session.save(emp);
- // 提交事务
- tx.commit();
- // 关闭
- session.close();
- sf.close();
- // 创建配置管理类对象
- Configuration config = new Configuration();
- // 加载主配置文件
- config.configure();
- // 创建工具类对象
- SchemaExport export = new SchemaExport(config);
- // 建表
- // 第一个参数: 是否在控制台打印建表语句 第二个参数: 是否执行脚本
- export.create(true, true);
配置文件详解
描述一个对象最终实现可以直接保存对象数据到数据库中
package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
auto-import 默认为true, 在写hql的时候自动导入包名 , 如果指定为false, 再写hql的时候必须要写上类的全名
class元素
class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
name 指定要映射的对象的类型
table 指定对象对应的表的名称 如果没有指定表名,默认与对象名称一样
id元素
- 主键的生成策略
- identity 自增长(mysql,db2)
- sequence 自增长(序列), oracle中自增长是以序列方法实现
- native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
- 如果是mysql数据库, 采用的自增长方式是identity
- 如果是oracle数据库, 使用sequence序列的方式实现自增长
- increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
- assigned 指定主键生成策略为手动指定主键的值
- uuid 指定uuid随机生成的唯一的值
- foreign (外键的方式, one-to-one讲)
property元素
普通字段映射
property
name 指定对象的属性名称
column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。
length 指定字符的长度, 默认为255 只能为String指定
type 指定映射表的字段的类型,如果不指定会匹配属性的类型
java类型: 必须写全名 建议使用 下面的会发生转化
hibernate类型: 直接写类型,都是小写
如果列名称为数据库关键字,需要用反引号或改列名
复合主键映射
- // 复合主键类
- public class CompositeKeys implements Serializable{
- private String userName;
- private String address;
- }
- public class User {
- // 名字跟地址,不会重复
- private CompositeKeys keys;
- private int age;
- }
- <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true">
- <class name="User">
- <!-- 复合主键映射 -->
- <composite-id name="keys">
- <key-property name="userName" type="string"></key-property>
- <key-property name="address" type="string"></key-property>
- </composite-id>
- <property name="age" type="int"></property>
- </class>
- </hibernate-mapping>
- public void testSave() throws Exception {
- Session session = sf.openSession();
- Transaction tx = session.beginTransaction();
- // 对象
- CompositeKeys keys = new CompositeKeys();
- keys.setAddress("广州棠东");
- keys.setUserName("Jack");
- User user = new User();
- user.setAge(20);
- user.setKeys(keys);
- // 保存
- session.save(user);
- tx.commit();
- session.close();
- }
查询的时候 也是需要构建主键 然后查询
hibernate主配置
必选属性配置(5个)
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
- #hibernate.dialect org.hibernate.dialect.MySQLDialect
- #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
- #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
- #hibernate.connection.driver_class com.mysql.jdbc.Driver
- #hibernate.connection.url jdbc:mysql:///test
- #hibernate.connection.username gavin
- #hibernate.connection.password
- 带hibernate前缀都可以不写
可选属性配置(3个)
#hibernate.hbm2ddl.auto create-drop 每次在创建sessionFactory时候执行创建表,当调用sesisonFactory的close方法的时候,删除表
#hibernate.hbm2ddl.auto create 每次都重新建表,如果表已经存在就先删除再创建
#hibernate.hbm2ddl.auto update 如果表不存在就创建,表存在就不创建;
#hibernate.hbm2ddl.auto validate (生成环境时候) 执行验证,当映射文件的内容与数据库表结构不一样的时候就报错!
也可以通过代码来操作
- public class App_ddl {
- // 自动建表
- public void testCreate() throws Exception {
- // 创建配置管理类对象
- Configuration config = new Configuration();
- // 加载主配置文件
- config.configure();
- // 创建工具类对象
- SchemaExport export = new SchemaExport(config);
- // 建表
- // 第一个参数: 是否在控制台打印建表语句
- // 第二个参数: 是否执行脚本
- export.create(true, true);
- }
- }
一个表能否有多个主键? 不能 为什么要设置主键? 数据库存储的数据都是有效的,必须保持唯一。
元数据引入配置
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的更多相关文章
- hibernate框架学习笔记6:事务
MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...
- hibernate框架学习笔记3:API详解
Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...
- [ SSH框架 ] Hibernate框架学习之二
一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...
- [ SSH框架 ] Hibernate框架学习之三
一.表关系的分析 Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置.数据 ...
- j2ee开发之hibernate框架学习笔记
hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...
- hibernate框架学习笔记2:配置文件详解
实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private ...
- hibernate框架学习笔记1:搭建与测试
hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...
- [ 学习笔记 ] Hibernate框架学习之一
一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...
- hibernate框架学习之核心API
ConfigurationSessionFactorySessionTransactionQueryCriteria Configuration Configuration对象用于封装Hibernat ...
- Hibernate框架学习笔记
Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...
随机推荐
- .NET Core:过滤器
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码.功能上更贴合业务的使用过滤器. 在Startup中的ConfigureServices方 ...
- String.format方法使用-浅析(转)
转自 https://blog.csdn.net/u010137760/article/details/82869637 1.代码中简单使用2.源码调用的方法3.相关类-Formatter3.1可选 ...
- 启动apache,将debug日志输出在console窗口
sudo apachectl -k start -e DEBUG 点个广告吧亲:
- django实战(二)--带多字段模糊查询的分页(也是不容易)
上节我们实现了分页功能,这节我们要实现对模糊查询后的结果进行分页.(引入了bootstrap框架) urls.py from django.urls import path from . import ...
- Phaser也可以实现countdownLatch的功能
/** * 可用用phaser模拟countDownLatch * awaitAdvance方法:如果传入的参数和当前的phase相等,线程就阻塞住等待phase的值增加:否则就立即返回 */ pub ...
- 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 ...
- 关于plupload组件无法拍照上传的解决方案
关于plupload组件无法拍照上传的解决方案 其实是由于文件大小的问题 filters: { max_file_size: '2mb',//把这个调大些就可以了 前提是服务器支持 prevent_d ...
- set容器与map容器的简单应用
set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...
- 移动前端viewPort的那些事
1.viewport简单说 一般来说,移动上的viewport都是大于浏览器窗口的,不同的设备有自己默认的viewport值(980px或1024px). 2.三个viewport的理解(layout ...
- Object.assign的使用
语法: Object.assign(target, ...sources)//target目标对象,sources源对象,返回值目标对象 使用说明: 如果目标对象中的属性具有相同的键,则属性将被源对象 ...