09-hibernate单表操作(1)
1,单一主键
2,基本类型
3,对象类型
4,组件属性
5,单表操作
单一主键
常用生成策略:
assigned 有程序员生成(手工)
native 由数据库底层,如果是mysql是increment,如果是Oracle是sequence。
测试assigned :代码手动给他赋值,不给ID赋值
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; //测试类
public class StudentsTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init()
{
//创建配置对象
Configuration config=new Configuration().configure();
config.addClass(Students.class);//这个需要加上(视频里面没有)
//创建服务注册对象。
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
session=sessionFactory.openSession();
//开启事务
transaction=session.beginTransaction();
}
@After
public void destory()
{
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
} @Test
public void testSaveStudents()
{
//生成学生对象
// Students s=new Students(1,"张三丰","男",new Date(),"武当山");
Students s=new Students();
s.setSname("张三丰");
s.setGender("男");
s.setAddress("北京");
s.setBirthday(new Date());
session.save(s);//保存对象进入数据库
}
}
结果发现SID字段默认为0,并没有给他赋值。.
基本类型:
对象类型
mysql里面clob类型用Text替代。
保存blob类型测试:在类文件中加上blob类型的picture属性。
import java.sql.Blob;
import java.util.Date;
//学生类
public class Students {
//必须是共有类
//提供共有的不带参数的默认的构造方法
//属性私有
//熟悉使用setter/getter封装 private int sid;//学号
private String sname;//姓名
private String gender;//性别
private Date birthday;//出生日期
private String address;//地址
private Blob picture; public Blob getPicture() {
return picture;
}
public void setPicture(Blob picture) {
this.picture = picture;
} public Students()
{ } public Students(int sid, String sname, String gender, Date birthday, String address) {
//super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
} public int getSid() {
return sid;
} public void setSid(int sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
+ ", address=" + address + "]";
} }
重新生成一下hbm.xml文件,新增了如下:
在测试类中加上测试方法:
以下用到了获取Blob对象的方法:
//createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
其中createBlob两个参数分别表示:从哪个输入流读取,要读取的长度,input.available()表示该输入流可用的字节流。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.util.Date;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; //测试类
public class StudentsTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init()
{
//创建配置对象
Configuration config=new Configuration().configure();
config.addClass(Students.class);//这个需要加上(视频里面没有)
//创建服务注册对象。
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
session=sessionFactory.openSession();
//开启事务
transaction=session.beginTransaction();
}
@After
public void destory()
{
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
@Test
public void testSaveStudents()
{
//生成学生对象
// Students s=new Students(1,"张三丰","男",new Date(),"武当山");
Students s=new Students();
s.setSname("张三丰");
s.setGender("男");
s.setAddress("北京");
s.setBirthday(new Date());
session.save(s);//保存对象进入数据库
} @Test
public void testWriteBlob() throws Exception
{
Students s=new Students(1,"张三丰","男",new Date(),"武当山");
//先获得照片文件
File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文档"+File.separator+"Picture"+File.separator+"孙悟空.png");
//获得照片文件的输入流
InputStream input=new FileInputStream(f);
//创建一个Blob对象
//createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
//设置照片属性
s.setPicture(image);
//保存
session.save(s);
}
}
生成结果:
为了测试是否真正写到了数据库中,把它读取出来:
为了保证数据不被删除,把hbm2ddl.auto改成update
为了获取数据库中对应的数据,映射到类。用如下方法session.get():
//从数据库中获取该条数据的对象
//get(类.class,主键值为1的数据)
Students s=session.get(Students.class, 1);
表示从数据库中读取students这个类所映射的表,里面主键值为1的数据。
session.get(类.CLASS,主键值)获取
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.util.Date;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; //测试类
public class StudentsTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init()
{
//创建配置对象
Configuration config=new Configuration().configure();
config.addClass(Students.class);//这个需要加上(视频里面没有)
//创建服务注册对象。
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
session=sessionFactory.openSession();
//开启事务
transaction=session.beginTransaction();
}
@After
public void destory()
{
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
} @Test
public void testSaveStudents()
{
//生成学生对象
// Students s=new Students(1,"张三丰","男",new Date(),"武当山");
Students s=new Students();
s.setSname("张三丰");
s.setGender("男");
s.setAddress("北京");
s.setBirthday(new Date());
session.save(s);//保存对象进入数据库
} @Test
public void testWriteBlob() throws Exception
{
Students s=new Students(1,"张三丰","男",new Date(),"武当山");
//先获得照片文件
File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文档"+File.separator+"Picture"+File.separator+"孙悟空.png");
//获得照片文件的输入流
InputStream input=new FileInputStream(f);
//创建一个Blob对象
//createBlob(从哪个输入流读取,读取的长度(这里就是输入流可用的字节数))
Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
//设置照片属性
s.setPicture(image);
//保存
session.save(s);
} @Test
public void testReadBlob() throws Exception
{
//从数据库中获取该条数据的对象
//get(类.class,主键值为1的数据)
Students s=session.get(Students.class, 1);
//获得Blob对象
Blob image=s.getPicture();
//获得输入流
InputStream input=image.getBinaryStream();
//创建输出流
File f=new File("D"+File.separator+"孙悟空.png");
//获得输出流
OutputStream output=new FileOutputStream(f);
//创建缓冲区
byte[] buff=new byte[input.available()];
//把输入流读取到缓冲区里面
input.read(buff);
//把缓冲区的内容写入到输出流
output.write(buff);
//File对象就像是一个本地仓库,需要指明仓库的地址,而数据库是相对的另一个仓库
//,输入流InputStream就像是数据库的专职运输人员,而输出流OutputStream就像是存储的专职运输人员
//缓冲区byte[] buff就像是输入流和输出流两个运输人员要交接的一个快递柜。
//如果要把数据读取到数据库,这个操作就要交给输入流运输人员。
//要把数据读取到本地,就要输出流运输人员来干。
//对于输入流和输出流来说,要从数据库这个仓库里面的东西放到本地仓库,先由数据库的专职人员拿钥匙从数据库取出来,
//存放到一个快递柜里面,然后本地的专职运输人员,从快递柜里面,把东西拿出来,放到File这个对象说好的地址。
//输入流运输人员放东西进入快递柜的操作,叫做read(),输出流把东西从快递柜取出来的操作,叫做write()。
}
}
对IO操作的个人理解:
//File对象就像是一个本地仓库,需要指明仓库的地址,而数据库是相对的另一个仓库
//,输入流InputStream就像是数据库的专职运输人员,而输出流OutputStream就像是存储的专职运输人员
//缓冲区byte[] buff就像是输入流和输出流两个运输人员要交接的一个快递柜。
//如果要把数据读取到数据库,这个操作就要交给输入流运输人员。
//要把数据读取到本地,就要输出流运输人员来干。
//对于输入流和输出流来说,要从数据库这个仓库里面的东西放到本地仓库,先由数据库的专职人员拿钥匙从数据库取出来,
//存放到一个快递柜里面,然后本地的专职运输人员,从快递柜里面,把东西拿出来,放到File这个对象说好的地址。
//输入流运输人员放东西进入快递柜的操作,叫做read(),输出流把东西从快递柜取出来的操作,叫做write()。
运行结果:发现在本地有图片,表示真正存到了数据库,并且被读取到本地。
09-hibernate单表操作(1)的更多相关文章
- Hibernate单表操作
单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是seque ...
- (三)hibernate单表操作
0. 贴上节hbm文件 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hib ...
- hibernate课程 初探单表映射3-1 hibernate单表操作简介
本章简介: 1 单一主键 2 基本类型 3 对象类型 4 组件属性 5 单表操作CRUD实例
- Hibernate单表操作(一)——单一主键
assigned由java应用程序负责生成.(手工赋值) native由底层数据库自己主动生成标识符,假设是MySQL就是increment,假设是oracle就是sequence.等等.
- hibernate学习笔记(6)组件属性以及单表操作
组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...
- Hibernate学习笔记(一)-->数据库单表操作
Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
- c# 数据库编程(利用DataSet 和 DataAdaper对象操作数据库--单表操作)
一.概述 前面2篇文章,介绍了使用SqlCommand对象利用sql命令来操作数据库. 这篇文章我们来介绍使用c#的DataSet 和 DataAdaper对象操作操作数据库. 先来介绍下这两个对象是 ...
- Django学习笔记(7)——单表操作和多表操作
单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...
随机推荐
- python strip() 函数和 split() 函数的详解及实例
strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...
- BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...
- 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
[题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...
- 查询续与ajax
查询分组 事例:统计不止一个作者的图书:(作者数量大于一) Book.objects.all().values('name').annotate(author_num=Count('authors__ ...
- [PKUSC2018]最大前缀和
[PKUSC2018]最大前缀和 题目大意: 有\(n(n\le20)\)个数\(A_i(|A_i|\le10^9)\).求这\(n\)个数在随机打乱后最大前缀和的期望值与\(n!\)的积在模\(99 ...
- <摘录>perl正则表达式中的元字符、转义字符、量词及匹配方式
Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...
- Linux操作系统下的常见系统资源共享
转:http://www.360doc.com/content/07/0420/10/25127_457022.shtml linux下如何挂接(mount)光盘镜像文件.移动硬盘.U盘.Window ...
- 对oracle实例的内存(SGA和PGA)进行调整,优化数据库性
一.名词解释 (1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. (2) ...
- MyBatis 显示日志
<!-- 全局配置 --> <settings> <setting name="cacheEnabled" value="false&quo ...
- Jenkins升级;yum 安装软件升级
1.使用yum安装的jenkins升级方法: 先升级yum yum update 后升级jenkins yum update jenkins 但是上面的方法,限制于yum的版本,不能更新到jenkin ...