(三)hibernate单表操作
0. 贴上节hbm文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-6 16:43:30 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="hibernate_01.Students" table="STUDENTS">
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
</class>
</hibernate-mapping>
1.单一主键
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
单一主键:指表中由某一列来充当主键
assigned 由java应用程序负责生成(手工赋值)
native 由底层数据库自动生成提示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。另外,即使手动赋值主键,也不会起作用。
<generator class="native" />mysql 中为AUTO_INCREMENT PRIMARY KEY
只要generator主键生成方式设置为native,即使设置了id,也是没有作用的。hibernate会调用数据库的ID增长方式
assigned 当为int时 默认0 其他默认null
2.基本类型(易出错)
第一列是hibernate映射类型, 第二列是java类型的格式, 第三列是对应的标准sql类型的格式。
需要注意的:
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
date 表示日期:YYYY-MM-dd
time 表示时间:hh:mm:ss
tiemstamp 时间戳: yyyy-MM-dd hh:mm:ss
另外,映射的数据类型设置会决定最后数据库中的类型。
比如我们在Java程序中使用的是java.util.Date类型定义变量Birthday。但在映射关系的配置文档中对应的type改成date类型,那么最后保存在数据库
的Birthday类型就是date,也就是YYYY-MM-dd,而非java.util.Date(或者timestamp)的YYYY-MM-dd hh:mm:ss。
3.对象类型
3.1 常见类型
java中clob是大文本数据类型,blob是能存储大量二进制的数据类型。
3.2 hibernate写入对象类型数据
3.2.1 演示用Blob类型将照片文件存储进数据库
3.2.2 演示如何从数据库读取存入的图片,即Blob数据。(在此之前需要将配置文件中的create改为update,防止未读取就删除)
<property name="hbm2ddl.auto">update</property>

4.组件属性
组件属性:
<component>标签表示,实体中成员变量的类型是用户自定义的类型。按hibernate的规则,基础类型使用<property>标签,而非基础类型就使用<component>标签。
<component>标签中,name表示这个对象的名字,class表示这个对象是哪个用户自定义类型。其中的property是指,用户自定义类型中的成员变量。
而声明了<component>的那个成员变量,在数据库中的表示方式是:这个用户自定义类型的成员变量中的成员变量,将以列的方式显示在数据库中。
即有该变量有三个成员变量,那么数据库中的表就多出对应的三列。
5.单表操作CRUD实例
save& update& delete& get/load
@Test
public void testGetStudents(){
Students s=(Students) session.get(Students.class, 1); //.get(查询表对应的类对象, 查询对象的主键);
System.out.println(s.toString()); } @Test
public void testLoadStudents(){
Students s=(Students) session.load(Students.class, 1); //.load(查询表对应的类对象, 查询对象的主键);
System.out.println(s.toString()); } @Test
public void testUpdateStudents(){
Students s=(Students) session.get(Students.class, 1);
s.setGender("女");
session.update(s);
session.flush();
} @Test
public void testDeleteStudents(){
Students s=(Students) session.get(Students.class, 2);
System.out.println(s.toString());
session.delete(s);
session.flush();
}
get/load(查询单个记录)的区别:
1. 在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
load方法会在调用之后返回一个代理对象。该代理对象只保存了实体对象的主键ID,直到使用对象的非主键属性时才会发出sql语句。
2. 查询数据库中不存在的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException
查询所有记录:
@Test
public void testQueryAllStudents(){
String hql="from Students";
List<Students> studentsList=session.createQuery(hql).list();
for(Students students:studentsList){
System.out.println(students.toString());
} }
问题:查询能执行,但update&delete不能执行,后添加flush()强制输出sql语句也不成功。。(控制台输出删改语句,但表结构一直没变)
解决办法:开启事务http://www.cnblogs.com/zjfjava/p/6593398.html
小结:
(三)hibernate单表操作的更多相关文章
- Hibernate单表操作
单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是seque ...
- hibernate课程 初探单表映射3-1 hibernate单表操作简介
本章简介: 1 单一主键 2 基本类型 3 对象类型 4 组件属性 5 单表操作CRUD实例
- 深入学习之mysql(三)单表操作
1.创建表的结构和数据 CREATE TABLE `t_student`( `id` INT PRIMARY KEY, `stuName` VARCHAR(10) NOT NULL, `age` IN ...
- Hibernate单表操作(一)——单一主键
assigned由java应用程序负责生成.(手工赋值) native由底层数据库自己主动生成标识符,假设是MySQL就是increment,假设是oracle就是sequence.等等.
- 模型层之ORM、数据库和单表操作
一.ORM简介 ORM是“对象-关系-映射”的简称,一般指持久化数据和实体对象的映射 1.1 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中( ...
- hibernate学习笔记(6)组件属性以及单表操作
组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...
- Django系列(三):单表操作
1.ORM简介 MTV或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- Hibernate学习笔记(一)-->数据库单表操作
Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...
- c# 数据库编程(利用DataSet 和 DataAdaper对象操作数据库--单表操作)
一.概述 前面2篇文章,介绍了使用SqlCommand对象利用sql命令来操作数据库. 这篇文章我们来介绍使用c#的DataSet 和 DataAdaper对象操作操作数据库. 先来介绍下这两个对象是 ...
随机推荐
- HDU 5646 DZY Loves Partition 数学 二分
DZY Loves Partition 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5646 Description DZY loves parti ...
- Codeforces Round #300 C. Tourist's Notes 水题
C. Tourist's Notes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/pr ...
- Vue.js插件开发
Vue.js插件是为应用添加全局功能的一种强大而且简单的方式.插件的用途很广泛,从全局组件,到为应用添加一些额外的功能.如路由(Vue Router),存储在应用程序里的不可变数据(Vuex). 一般 ...
- easyui datagrid如何获取到每行的文本框
在return '<input type="text" name="txtCount" class="inputvalue"/> ...
- poj 3130 How I Mathematician Wonder What You Are! - 求多边形有没有核 - 模版
/* poj 3130 How I Mathematician Wonder What You Are! - 求多边形有没有核 */ #include <stdio.h> #include ...
- 突破技术管理,IT人中年危机变契机
突破技术管理,IT人中年危机变契机 中生代技术 Yesterday 作为一个老技术人,今天不聊技术,就聊点技术人员职业发展的事情:对技术管理岗位的认知,比如技术总监. 先贴一张技术人员职业发展路线图, ...
- python的with和__enter__ 、 __exit__
__enter__(): 在使用with语句时调用,会话管理器在代码块开始前调用,返回值与as后的参数绑定 __exit__(): 会话管理器在代码块执行完成好后调用,在with语句完成时,对象销 ...
- sql数据库出现可疑
USE master GO SP_CONFIGURE 'allow updates',1 RECONFIGURE WITH OVERRIDE GO UPDATE SYSDATABASES SET ST ...
- MFC中显示图像的放大、缩小、移动功能
StretchBlt函数直接对图片进行放大,缩小,显示位置变换. 这个函数有两种形态一种全局函数是这样的: BOOL StretchBlt(HDC hdcDest, int nXOriginDest ...
- M.2接口NVMe协议的固态硬盘读写速度是SATA接口的两倍
原文:https://www.sohu.com/a/203688929_615464 中午走路的时候,同事说的,M 2 nvme接口的更快. 树莓派开发板可以跑linux . ------------ ...






