一个全新的资源分享平台:
享你所想
1. 先扯下什么是hibernate:
a) hibernate(冬眠)->让java对象在数据库中冬眠.
b) 持久化技术(把数据永久保存到数据库中,广义的理解包括和数据库相关的各种操作),jdbc io也是持久化技术。
c) 一个java领域的持久化框架,一个ORM轻量级框架,连接java应用程序和关系型数据库的中间件,对JDBC API封装,负责对象持久化。位于持久化层,封装了所有的数据访问细节,完全体现了面向对象的思想,向业务逻辑层提供面向对象的API,使开发人员把更多的精力放在业务逻辑上。
d) hibernate的优点是建立在jdbc的缺点之上,jdbc繁琐的字段操作和sql维护。
2. 接下来先用Hibernate来做一个小例子,看看使用hibernate和直接使用jdbc有便捷之处:
a) 创建数据库 和 数据库表[Mysql数据库]:
drop database if exists ishare_hibernate;
create database ishare_hibernate;
use ishare_hibernate;
create table customers(
id int primary key,
name varchar(20),
age int,
birthday datetime,
married int,
photo longblob,
descritpion text
);
//几个不同数据库下数据类型
类型 | mysql | sqlserver | oracle |
存储图片 | longblob | image | blob | 大文本 | text | text | clob |
b) 创建Java项目
①. 引入类库 解压hibernate3.0:引入lib/required目录下全部jar+Hibernate核心包+数据库驱动包mysql-connector-java-5.1.7-bin.jar
log4j.jar,slf4j-log4j.jar
在工程下新建lib目录,将jar包拷贝过去 并buildpath。
②.在工程源目录新建hibernate.properties 属性文件
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/ishare_hibernate
hibernate.connection.username=root
hibernate.connection.password=root
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=true
注释:hibernate.dialect方言是对底层数据库所用自身机制的配置
③.创建java bean:Customer.java
public class Customer {
private Integer id;
private String name;
private Integer age;
private Date birthday;
private boolean married;
private byte[] photo;
private String description;
}//getter setter省略
④.新建映射文件 Customer.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ishare.domain">
<class name="Customer" table="customers" lazy="false">
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
<property name="name" column="name" type="string" length="20"/>
<property name="age" column="age" type="integer"/>
<property name="birthday" column="birthday" type="date"/>
<property name="married" column="married" type="boolean"/>
<property name="photo" column="photo" type="binary"/>
<property name="description" column="description" type="text"/>
</class>
</hibernate-mapping>
关于映射文件需要说明的几点:
1.映射文件一般要和对应的实体类放在同一目录下。
2.hibernate-mapping package属性 可以设置当前javabean所在包路径,这样在使用Customer时就不用每次都是用全路径了
3.映射文件的dtd文档类型定义,在hibernate3.jar第一个包下最后一个文件中。
4. <property name="age" column="age" type="integer"/>
name属性区分大小写,column不区分大小写,
5.type 为映射类型(具体参考类型映射表)映射类型就是完成sql-java之间转换的。
如果type属性省略不写,hibernate会通过反射去找对应的java类型
测试string类型时 type=”java.lang.String”也可以,但是hibernate还得去通过反射去找对应的映射类型,还不如不写。
6.generator 主键生成策略,其类型会在后面详细介绍
⑤.测试类一App.java:配置完后来测试下自己的成果吧
/**
* 测试类
* @author spring_g
*
*/
public class APP {
//会话工厂-相当于 连接池(数据源)
private static SessionFactory sf = null;
//1.初始化 会话工厂
static{
//引入三方框架 类库 配置文件
try {
Configuration conf = new Configuration();
//加载映射文件 通过类找和他在一起的映射文件
conf.addClass(Customer.class);
//构建会话工厂,初始化
sf = conf.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
//2.main方法插入测试
public static void main(String[] args) {
Customer c = new Customer();
c.setName("spring");
insertCustomer(c);
}
//3.插入客户
public static void insertCustomer(Customer c){
//开启一个新会话
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
s.save(c);
tx.commit();//提交事务
s.close();//关闭会话
}
}
⑥.测试类二Junit4测试对Customer的增删改查:
/**
* 测试基本操作
* @author spring_g
*
*/
public class TestCurd {
//会话工厂-相当于 连接池(数据源)
private static SessionFactory sf = null;
/**
* 初始会话工厂
*/
@BeforeClass
public static void initSf(){
//引入三方框架 类库 配置文件
try {
Configuration conf = new Configuration();
//加载映射文件 通过类找和他在一起的映射文件,预先生成sql语句
conf.addClass(Customer.class);
//构建会话工厂,初始化
sf = conf.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void insertCustomer(){
Customer c = new Customer();
c.setName("Sean");
c.setAge(20);
c.setBirthday(Date.valueOf("2008-12-13"));
c.setMarried(true);
c.setDescription("asdfasdfasdfasdfad");
try {
FileInputStream fis = new FileInputStream("d:/aaa.jpg");
byte[] bytePhoto = new byte[fis.available()];
fis.read(bytePhoto);
fis.close();
c.setPhoto(bytePhoto);
} catch (Exception e) {
e.printStackTrace();
}
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
s.save(c);
tx.commit();
s.close();
}
/**
* 查询操作
*/
@Test
public void loadCustomer(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Customer c = (Customer) s.load(Customer.class, 3);
byte[] bytes = c.getPhoto();
try {
FileOutputStream fos = new FileOutputStream("d:/kkk.jpg");
fos.write(bytes);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(c.getName());
tx.commit();
s.close();
}
/**
* hql查询,oop查询操作
*/
@Test
public void loadCustomerList(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Query query = s.createQuery("from Customer");
List list = query.list();
System.out.println(list.size());
tx.commit();
s.close();
}
/**
* 更新操作
* 同一会话更新不需要调用update
*/
@Test
public void updateCustomer(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Customer c = (Customer) s.load(Customer.class, 3);
c.setName("NewName");
//不需要调用update方法 和对象状态有关
tx.commit();
s.close();
}
/**
* 更新操作-关闭会话后更新需要调用update()
*/
@Test
public void updateCustomer1(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
//查询不到会抛异常
Customer c = (Customer) s.load(Customer.class, 3);
c.setName("NewName");
tx.commit();
s.close();
s = sf.openSession();//新开启一会话
tx = s.beginTransaction();
c.setName("updateMethod");
s.update(c);
tx.commit();
s.close();
}
/**
* 更新操作-设置主键值
* 更新把整个对象状态存储到数据库中
*/
@Test
public void updateCustomer2(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Customer c = new Customer();
//会将该对象的状态全部更新到数据库
c.setId(4);//不设置id时 报异常 临时对象异常
s.update(c);
tx.commit();
s.close();
}
/**
* 删除操作 先查询
*/
@Test
public void deleteCustomer(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Customer c = (Customer) s.load(Customer.class, 4);
s.delete(c);
tx.commit();
s.close();
}
/**
* 删除操作new出来给id
*/
@Test
public void deleteCustomer2(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Customer c = new Customer();
c.setId(4);
s.delete(c);
tx.commit();
s.close();
}
/**
* 批量删除
*/
@Test
public void deleteBatchCustomer(){
Session s = sf.openSession();
//开始事务 acid
Transaction tx = s.beginTransaction();
Query query = s.createQuery("delete from Customer where id>3");
query.executeUpdate();
tx.commit();
s.close();
}
}
通过以上简单例子的入门,一定感觉hibernate确实是个不错的东西,给我们从繁琐的sql中解脱了出来,完全从面向对象的角度来实现对数据的持久化的操作。
自己在平时的学习中也整理了一些比较好的资源[Java,Python,前端,PHP,摄影...],现在分享出来希望也能对你有所帮助:分享资源入口
- 大小: 1.2 MB
分享到:
相关推荐
一步步hibernate annotation练习笔记, 实例操作,从经验中学习
初学hibernate2.0实用笔记,内容详细,实例多,笔记主要由各个小项目组成
01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...
hibernate学习笔记,总结hibernate的基础和重点,并有实例介绍和相关概念图文介绍
是一个不错学习hibernate+structs2整合实例,希望可以对您有帮助
{1.11}简单算法}{38}{section.1.11} {1.11.1}打乱算法}{38}{subsection.1.11.1} {1.11.2}排序算法}{38}{subsection.1.11.2} {1.11.2.1}选择排序}{38}{subsubsection.1.11.2.1} {1.11.2.2}冒泡排序}{39}{...
一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...
第四篇为“数据库访问技术”,主要讲述JDBC技术及JSP和Servlet如何通过JDBC访问数据库,以及如何改进数据库的访问和目前流行的Hibernate、iBATIS及Spring集成访问的支持;第五篇为“标签语言和表达式语言”,主要...
里面包含Hibernate实体映射的具体实例代码,还有相关教程笔记,喜欢的可以学习学习。
Hibernate学习笔记..........180 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射......................185 第四章 操纵持久化对象....................
一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...
Hibernate学习笔记..........180 JavaEE@xuxiang 3 Java/JavaEE学习笔记Jonny xuxiang5612@sina.com 第一章 Hibernate入门.....................180 第二章 对象/关系映射基础.............183 第三章 关联关系映射....
3 Jbpm4.4介绍 7 3.1工作流引擎 8 3.2jpdl 8 3.3数据库 8 3.3.1资源库和运行时表结构 8 3.3.2历史数据库表 9 3.3.3身份认证表 9 3.4jbpm.cfg.xml 9 3.5 jbpm.hibernate.cfg.xml 10 3.6logging.properties 10 4 准备...
spring 实例教程,Struts2 +hibernate +spring spring PPt适合spring入门,学习spring的笔记。。。
高级java笔试题 目录 这里是java学习过程中的code以及笔记,笔记都放在README.md中方便阅读。 [TOC] 慕课网学习Hibernate的笔记和源码。总共分为三个阶段,基础,...这是学习韩顺平spring教程的实例代码和学习笔记,主
abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.... \ddd 1到3位8进制数指定Unicode字符输出(ddd) \uxxxx 1到4位16进制数指定Unicode字符输出(xxxx) \\ \ \' ' \" ...
该资源为SSH框架整合示例(Spring、Struts2、Hibernate),...其中另含完整开发笔记一份,为此项目搭建的开发过程笔记,可供读者开发练习使用。该项目适用于SSH框架初学者,帮助完成SSH框架的搭建。祝各位学习顺利!
2009-02-24 08:42 165165 37065 常见的专业问题解决办法\Java核心技术学习笔记--异常和调试_Believe ┭┮ YourSelf.mht 2009-03-20 16:36 142683 39110 常见的专业问题解决办法\JR - 专题论坛问题 - eclipse??如何...