hibernate03增删改查

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件的配置
这就是ORM中的 M!! Mapping 映射文件
Relational Mapping Object
数据库中的表名以及字段 对应 实体类中的类名和属性 package:类所在的包,保证必须是全类名
class:就是配置我们的 实体类相关的信息
name:对应的是实体类的类名或者属性名
table,column:如果与实体类的类名和属性名一致,可以不设置
generator:主键生成策略
01.assigned:必须是我们手动的给ID赋值!ID的生成与数据库无关! 会抛出异常!
02.increment:从数据库表中查询到主键的最大值 (select max(id) from student)!
之后+1把这个值 给我们的主键!ID的生成与数据库有关!
03.identity:针对于mysql数据库中的主键自增
04.sequence:针对于oracle数据库中的序列!
001.在数据库中创建序列
create sequence sq_student_id
minvalue 10
maxvalue 99999999999
start with 10
increment by 10
cache 20;
002.映射文件中配置
<generator class="sequence">
<param name="sequence">sq_student_id</param>
</generator>
003.底层生成的sql语句
select sq_student_id.nextval from dual
首先从数据库中取得当前序列的下一个值! 之后把这个值 给我们的主键! lazy="true" 是默认采用懒加载的方式 获取数据!
不想使用懒加载!lazy="false"
-->
<hibernate-mapping package="cn.bdqn.bean">
<class name="Student" table="student" lazy="false">
<id name="id">
<generator class="assigned"/>
</id>
<property name="age"/>
<property name="name"/>
</class>
</hibernate-mapping>

/**
* jdbc有常用的API
* hibernate也有自己常用的API(核心)
* 01.Configuration 类 :读取我们的核心配置文件----hibernate.cfg.xml
* 接口
* 02.SessionFactory :初始化hibernate需要的各种参数!
* jdbc.properties初始化一次! SessionFactory也是只需要初始化一次即可!写成单例!
*
* 03.Session:之前使用的HttpSession(用户session)! 现在的session叫会话session!
* hibernate就是通过session来操作对象的(增删改查)以及创建事务对象!
* 04.Tranaction :进行事务的处理
* 05.Query :hibernate中的查询接口(SQL,HQL)
* 06.Criteria:hibernate中的查询接口,是对query进行了简单封装!
* 更能体现使用的是面向对象的思想来操作数据库!
*/ public class StudentTest { Session session=null;
Transaction transaction=null;
//在执行测试方法之前 先执行before
@Before
public void before(){
/**
* 01.读取核心的配置文件 在src的根目录下面! 底层规定位置!
* 在实例化Configuration对象的时候通过configure()
* 去src根目录下面,寻找hibernate.cfg.xml文件
*/
Configuration configuration=new Configuration().configure();
//02.创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//03.打开session
session = sessionFactory.openSession();
//04.开启事务
transaction= session.beginTransaction();
} //在执行测试方法之后
@After
public void after(){
//07.提交事务 sql语句 整体的执行!
transaction.commit();
//08.关闭session
session.close();
//sessionFactory.close(); 验证hbm2ddl中的create-drop
} //新增
@Test
public void addStudent(){
//05.创建一个对象
Student student=new Student(500,5, "小白555");
//06.持久化操作---》将对象保存到数据库中
session.save(student); //不会产生 insert语句
} /**
* 根据id删除指定的学生
*
* 会产生 2条sql语句
* 01.根据id去数据库中查询 有没有对应的数据
* 02.根据id删除 指定delete语句
*/
@Test
public void delStudent(){
Student student=new Student();
student.setId(2); //给对象的ID赋值
//session对象的方法 delete删除
System.out.println("************");
session.delete(student);
System.out.println("************");
}
/**
* 根据id修改指定的学生
* 只会执行一条update语句!
* 如果数据库中没有指定id的数据,没效果!有 就更新!
*/
@Test
public void updateStudent(){
Student student=new Student();
student.setId(1000); //给对象的ID赋值
System.out.println("************");
student.setAge(50);
session.update(student);
System.out.println("************");
} /**
* 查询数据库中指定学生的信息
* 查询 不需要事务!
* get和load的区别
* get:
* 01.在get()立即产生一条sql语句
* 02.首先回去hibernate的1级缓存(session)中查询有没有对应的数据
* 如果有,直接返回,就不会访问数据库!
* 如果没有,去2级缓存中查询(sessionFactory)中查询!
* 如果2级缓存中也没有数据,则会产生一条select语句 访问数据库!
* 03.如果数据库中存在该数据 则返回
* 04.没有对应的数据 返回 null
*/
@Test
public void getStudent(){ //通过get()获取数据
System.out.println("****************");
Student student=(Student) session.get(Student.class, 200);
System.out.println("****************");
System.out.println(student);
} //验证不会访问数据库
@Test
public void getStudent2(){ //通过get()获取数据
Student student=(Student) session.get(Student.class, 200); //被session管理
Student student2=(Student) session.get(Student.class, 200); //缓存中已经存在了
} /**
* evict()从session缓存中 清除指定的对象
*/
@Test
public void evictStudent(){ //通过get()获取数据
Student student=(Student) session.get(Student.class, 200); //被session管理
Student student2=(Student) session.get(Student.class, 300); //被session管理
session.evict(student); //从session缓存中 清除student对象
/**
* 有人认为:1级缓存中确实是清除了!但是2级缓存中应该没有清除吧?
* 不是这么理解的! 2级缓存需要我们手工配置!不配置 就不存在2级缓存!
*/
student=(Student) session.get(Student.class, 200); //再次获取id为200的数据
} /**
* clear() 从session缓存中 清除所有的对象
*/
@Test
public void clearStudent(){ //通过get()获取数据
Student student=(Student) session.get(Student.class, 200); //被session管理
Student student2=(Student) session.get(Student.class, 300); //被session管理
//session.clear(); //从session缓存中 清除所有对象
student=(Student) session.get(Student.class, 200); //再次获取id为200的数据
student2=(Student) session.get(Student.class, 300); //再次获取id为300的数据
} /**
* load: 懒加载
* 01.不会立即产生sql语句
* 02.在用户使用真正对象的时候才去访问数据库!
* 03.首先回去hibernate的1级缓存(session)中查询有没有对应的数据
* 如果有,直接返回,就不会访问数据库!
* 如果没有,去2级缓存中查询(sessionFactory)中查询!
* 如果2级缓存中也没有数据,则会产生一条select语句 访问数据库!
* 04.如果数据库中存在该数据 则返回
* 05.没有对应的数据 返回 ObjectNotFoundException 异常
* 06.如果想实现和 get()一样的效果!怎么做?
* 在对应的hbm.xml文件中的 class节点上 新增 lazy="false" 立即加载!
*/
@Test
public void loadStudent(){ //通过load()获取数据
Student student=(Student) session.load(Student.class, 200);
System.out.println("****************");
System.out.println(student); //产生sql语句
System.out.println("****************");
} }
hibernate03增删改查的更多相关文章
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
系列目录 文章于2016-12-17日重写 在第八讲中,我们已经做到了怎么样分页.这一讲主要讲增删改查.第六讲的代码已经给出,里面包含了增删改,大家可以下载下来看下. 这讲主要是,制作漂亮的工具栏,虽 ...
- 通过Java代码实现对数据库的数据进行操作:增删改查
在写代码之前,依然是引用mysql数据库的jar包文件:右键项目-构建路径-设置构建路径-库-添加外部JAR 在数据库中我们已经建立好一个表xs :分别有xuehao xingming xue ...
- Hibernate全套增删改查+分页
1.创建一个web工程 2.导入jar包 3.创建Student表 4.创建实体类 package com.entity; public class Student { private Integer ...
- 使用 Json.Net 对Json文本进行 增删改查
JSON 已经成为当前主流交互格式, 如何在C#中使用 Json.Net 对Json文本进行 增删改查呢?见如下代码 #region Create (从零创建) public static strin ...
- yii2 增删改查
自己总结的yii2 advanced 版本的简单的增删改查,希望对大家有所帮助 1.gii生成的actionCreate()方法中 获取插入语句的id $id = $model->attribu ...
- Batis-iBatis基本操作(增删改查)
Batis-iBatis基本操作(增删改查) 时间 2014-04-10 17:55:20 CSDN博客 原文 http://blog.csdn.net/mazhaojuan/article/de ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
随机推荐
- 论YUV422(YUYV)与YUV420相互转换
Example 2.13. V4L2_PIX_FMT_YUYV 4 × 4 pixelimage start + 0: Y'00 Cb00 Y'01 Cr00 Y'02 Cb01 Y'03 Cr01 ...
- 需要看源码的java类
1.数据结构相关的类,如String.ArrayList,LinkedList,HashMap和ConcurrentHashMap等等.2.线程并发相关的类,如Synchronized.Reentra ...
- 关于Android开发中Arm、X86和Mips(草稿)
一.架构 1.Arm架构 是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计. 2.X86架构 是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合 ...
- go微服务框架go-micro深度学习(四) rpc方法调用过程详解
上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地 ...
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
C#反射实现 一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...
- SATA主机协议的FPGA实现之准备工作
SATA主机协议的FPGA实现之准备工作 从2月中旬准备开始,经过3个月的奋战,我的又一个项目--基于FPGA的固态硬盘读写控制电路,已经基本实现.由于实用资料的匮乏,以及项目本身颇具挑战性,这个 ...
- LZW算法PHP实现方法 lzw_decompress php
LZW算法PHP实现方法 lzw_decompress php 博客分类: Php / Pear / Mysql / Node.js LZW算法简介 字符串和编码的对应关系是在压缩过程中动态生成的 ...
- 程序猿必备的10款超炫酷HTML5 Canvas插件
1.超炫酷HTML5 Canvas 3D旋转地球动画 这是一款基于HTML5 Canvas的3D地球模拟动画,动画以太空作为背景,地球在太空中旋转,同时我们也可以拖拽鼠标来从不同的角度观察地球.另外我 ...
- crontab 选择编辑器 select-editor
用root第一次运行 crontab -e 会出现如题的错误,解决方法如下: 1.select-editor 选择编辑器,我选的vim.basic. 2.crontab -e 进入编辑器编辑. 推荐第 ...
- mybatis-plus忽略映射字段
mybatis-plus使用对象属性进行SQL操作,经常会出现对象属性非表字段的情况,忽略映射字段使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又 ...