开源项目(1)Hibernate基本使用

Hibernate介绍

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

官网  http://hibernate.org/

以下为其原理和基本的结构示意图

一步一步简单讲述其基本应用

1、创建java项目,添加hibernate引用

下载地址:

https://sourceforge.net/projects/hibernate/files/hibernate-orm/

下载的完整版本,直接在lib/required中的jar包导入

2、导入数据库连接器

我使用的是Mysql数据库,大家可以在以下下载,然后导入连接器

http://dev.mysql.com/downloads/connector/j/

3、创建数据表

create table students(
id int primary key not null,
name nvarchar(50),
age int
)

4、创建实体类

建议实体类符合JavaBean标准,字段、get、set方法,还有默认构造函数。

package yank.hibernate.sample;

/**
* 学生信息
* @author yank
*
*/
public class Student {
private Integer id;
private String name;
private Integer age; /**
* 无参构造函数
*/
public Student(){ } public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

5、配置实体与表的映射关系

非持久化的属性,不要在这里声明。这里的type并非java的类型或者sql的类型,而是hibernate定义的映射类型,如果未设置,hibernate会自动给一合适的类型。

最好安装hibernate的eclipse插件,可能更方便点

http://marketplace.eclipse.org/content/hibernate-tools-helios

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 映射 -->
<hibernate-mapping package="yank.hibernate.sample">
<class name="Student" table="students">
<id name="id" column="id">
<generator class="increment" /> <!-- 标识符生成策略 -->
</id>
<property name="name" type="string" column="name" />
<property name="age" type="int" column="age" />
</class>
</hibernate-mapping>

这里的类型,应该是Hibernate-Types,这样可以实现JAVA类型与数据库类型的转换。如果没有找到匹配类型,Hibernate会自动判定给一合适类型。

注意:使用最后一列(Registry Key)的值即可。

6、创建hibernate的配置文件

这里就需要配置hibernate如何访问数据库,包括连接驱动,连接地址、用户名、密码,连接池大小等。并且在这里将配置映射文件

文件创建在srv根目录下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接相关 -->
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property> <!-- 映射资源 -->
<mapping resource="yank/hibernate/sample/student.hbm.xml" />
</session-factory>
</hibernate-configuration>

SessionFactory- 一个关联于特定数据库全局性的工厂(factory)。如果你要使用多个数据库,通常应该在多个配置文件中使用多个<session-factory>进行配置

7、从配置文件加载SessionFactory

package yank.hibernate.sample;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /**
* hibernate工具类
* @author yank
*
*/
public class HibernateUtils {
private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
} public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}

8、基本功能测试,简单的CRUD可以实现了

package yank.hibernate.sample;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session; public class StudentManager {
public static void main(String[] args){
//新增
StudentManager stuMgr = new StudentManager();
stuMgr.createStudent("LiLei", 20); //查询
Student student = stuMgr.findById(1); //编辑,保存
student.setAge(21);
stuMgr.update(student); //查询所有
Student last = null;
List stuList = stuMgr.findList();
for(Object item : stuList){
System.out.println(((Student)item).getName());
last = (Student)item;
} //删除
stuMgr.delete(last);
}
/**
* 新增
* @param id
* @param name
* @param age
*/
public void createStudent(String name,Integer age){
Student student = new Student();
student.setName(name);
student.setAge(age);
this.save(student);
}
/**
* 保存
* @param student
*/
public void save(Student student){
Session session = HibernateUtils.getSessionFactory().openSession();
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
session.close();
}
/**
* 更新
* @param student
*/
public void update(Student student){
Session session = HibernateUtils.getSessionFactory().openSession();
session.beginTransaction();
session.update(student);
session.getTransaction().commit();
session.close();
}
/**
* 根据id查询
* @param stuId
* @return
*/
public Student findById(Integer stuId){
Session session = HibernateUtils.getSessionFactory().openSession();
Student student = session.get(Student.class, stuId);
session.close();
return student;
}
/**
* 查询集合
*/
public List findList(){
Session session = HibernateUtils.getSessionFactory().openSession();
SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
List list = qry.list();
session.close();
return list;
}
/**
* 删除
* @param 学生对象
*/
public void delete(Student student){
Session session = HibernateUtils.getSessionFactory().openSession();
session.beginTransaction();
session.delete(student);
session.getTransaction().commit();
session.close();
}
}

9、其他:

查询List时报异常

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to yank.hibernate.sample.Student

代码如下:

    /**
* 查询集合
*/
public List findList(){
Session session = HibernateUtils.getSessionFactory().openSession();
SQLQuery qry = session.createSQLQuery(" select * from Students");
List list = qry.list();
session.close();
return list;
}

原因:

查询出来的对象不能自动转为JavaBean对象

解决方案:

利用addEntity,增加类型映射。

    /**
* 查询集合
*/
public List findList(){
Session session = HibernateUtils.getSessionFactory().openSession();
SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
List list = qry.list();
session.close();
return list;
}

JPA:

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

Hibernate是在版本3.2后遵循JPA标准的。

[开源项目]Hibernate基本使用的更多相关文章

  1. 【c3p0】目前使用它的开源项目有Hibernate,Spring等

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. c3p0与dbcp区别 JNDI ...

  2. .NET开发人员值得关注的七个开源项目 .

    NET开发人员值得关注的七个开源项目 软近几年在.NET社区开源项目方面投入了相当多的时间和资源,不禁让原本对峙的开源社区阵营大吃一惊,从微软.NET社区中的反应来看,微软.NET开发阵营对开源工具的 ...

  3. .Net 开源项目资源大全

    伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-dotnet-cn (注:下面用 ...

  4. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  5. J2EE开发之常用开源项目介绍

    主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库 1持久层: 1)Hibe ...

  6. C#开源项目

    原文:  http://alance.iteye.com/blog/693987 一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了 ...

  7. Java开源项目(备查)

    转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework  [Java开源 J2EE框 ...

  8. 23个.NET开源项目

    Castle是.NET里走过了三年的开源框架,下载地址如:http://www.castleproject.org/index.html ,当然如果你是从事过JAVA开发并用过spring,hiber ...

  9. .net 开源项目

    .NET开发人员值得关注的七个开源项目 [IT168技术分析]微软近几年在.NET社区开源项目方面投入了相当多的时间和资源,不禁让原本对峙的开源社区阵营大吃一惊,从微软.NET社区中的反应来看,微软. ...

随机推荐

  1. mozilla firefox 安装flash player

    下载 flash player http://get.adobe.com/cn/flashplayer/ for linux  .tar.gz文件 install_flash_player_11_li ...

  2. U盘又中毒了,隐藏文件如何显示

    在 开始--运行 中输入 cmd ,再输入,attrib -H -S D:\123 /s /d 后回车,你就发现问题解决了.注意命令之间的空格,D:\代表盘符,就是你的移动硬盘的盘符,如果你的盘符是E ...

  3. Unity自动场景保存脚本

    新建一个名为AutoSave的编辑器脚本,并放于Assets/Editor下. using System; using UnityEditor; using UnityEditor.SceneMana ...

  4. github上下载的文件如何在本地运行

    最近想学习自己写插件,所以先下载大神写的插件膜拜下,下载下来以后,直接双击运行报错,大神怎么会犯这么低级的错误咧!所以在网上查资料,找到了解决方法. (1)上传到github上面的插件都很规范,文件根 ...

  5. Win10/UWP开发—SystemNavigationManager

    Win10系统为确保所有应用中的一致导航体验,提供后退导航功能.当你的应用在手机.平板电脑上或者在支持系统后退功能的电脑或笔记本电脑上运行时,系统会在"后退"按钮被按下时通知你的应 ...

  6. Jquery.Form和jquery.validate 的使用

    有些功能需要我们利用Ajax技术进行POST提交表单,这时候就需要用到jquery.Form ,它有两种方式进行提交, AjaxForm和AjaxSubmit方式.            AjaxFo ...

  7. 数据存储之Cookie和Web Storage。

    Cookie Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).接下来就谈谈cookie的一些利弊,coo ...

  8. supervisord 小记

    此篇仅用作supervisord的用法,不涉及理论说明和基础介绍 supervisor(一)基础篇 使用supervisord来管理process 进程的守护神 - Supervisor superv ...

  9. forEach遍历数组实例

    forEach()取出数组中2的倍数和3的倍数的数 //for IE if(!Array.prototype.forEach){ Array.prototype.forEach = function( ...

  10. win10 用cmake 3.5.2 和 vs 2015 update1 编译 GPU版本(cuda 8.0, cudnn v5 for cuda 8.0)

    win10 用cmake 3.5.2 和 vs 2015 update1 编译 GPU版本(cuda 8.0, cudnn v5 for cuda 8.0)  用vs 2015打开 编译Release ...