[开源项目]Hibernate基本使用

摘要:
Hibernate是一个开源项目,基本上使用Hibernate。Hibernate是一个开源的对象关系映射框架。它用非常轻量级的对象封装JDBC,允许Java程序员随意使用对象编程思想来操作数据库。这里的类型不是java类型或sql类型,而是由hibernate定义的映射类型。如果未设置,hibernate将自动给出适当的类型。如果没有找到匹配的类型,Hibernate将自动确定合适的类型。
开源项目(1)Hibernate基本使用

Hibernate介绍

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

官网  http://hibernate.org/ 

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

[开源项目]Hibernate基本使用第1张

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

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

下载地址:

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

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

[开源项目]Hibernate基本使用第2张

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)的值即可。

[开源项目]Hibernate基本使用第3张

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基本使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux文件系统和mount(硬盘,win分区,光驱,U盘)Python源码.py文件打包为.whl文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA 利用反射自定义数据层框架

       之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者,除了大学没有接触过任何c#的编程),我在大三开始搞工作室,接网站的单子,最难过的时候,一个人要写前台后台,说实话是JAVA把我引上了这条程序员...

Android进入一个新页面,EditText失去焦点并禁止弹出键盘

android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯。 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: android:focusable="true"   android:focusableInTouchMode="true" 代码如下: 1 <S...

org.apache.commons.httpclient工具类(封装的HttpUtil)

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOEx...

淘宝对接(二)

完成淘宝对接(一)的内容后,我们获得非常重要的App Key及App Secret。但如果想访问商户数据(如商品、订单等)还需要获取访问商户数据的授权令牌 Access Token。获取用户授权的流程可以查看淘宝文档:用户授权介绍。 尽管用户授权文档比较详尽地说明了申请流程。但在这里我还是挑出一些我当时不太明白的步骤进行讲解: 1. 获取授权码(即在"用户...

用Javascript进行HTML转义(分享)

  众所周知页面上的字符内容通常都需要进行HTML转义才能正确显示,尤其对于Input,Textarea提交的内容,更是要进行转义以防止javascript注入攻击。   通常的HTML转义主要是针对内容中的"<",">","&",以及空格、单双引号等。但其实还有很多字符也需要进行转义。具体的可以参考这篇文章。   ** 1、HTML转...

Java Web项目案例之---登录和注册(精华版)

登录和注册(精华版) (一)实现功能 1.使用cookie记录登录成功的用户名,用户选择记住用户名,则用户再次登录时用户名自动显示 2.实现文件上传功能(上传文件的表单上传于普通的表单上传不同,必须是post,必须有value,enctype必须是multipart/form-data) 3.图片上传后的名称不能重复,使用随机生成的字符串(UUID) 4....