码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate学习(一)

时间:2015-12-29 17:48:21      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:hibernate

Hibernate第一个实例

1、Hibernate优点:

(1)简化开发,提高开发效率

底部封装数据库操作,使用起来更加简洁方便

(2)更加面向对象设计

只用关心按照面向对象的方法实现业务逻辑,不用关心数据库等创建于操作。

数据库:是关系数据库,是面向关系的。而java是面型对象的,所以需要ORM(对象关系映射)。而Hibernate直接封装好了之间的映射。

(3)更好的性能

Hibernate中使用hql语句进行数据操作,hql相对于sql语句效率稍微低一点,因为hql要生成sql语句进行数据库操作,而且sql还可以进行优化。但是生成的sql效率很高,比一般程序员写的语句可能更高,而且还设置的有缓存机制。两者决定着性能的高低。

(4)更好的移植性

底层数据库屏蔽,根据数据库的不同,进行转化。直接写hql语句就行,不用关系具体数据库操作。

2、ORM框架比较:

技术分享

 

3、JPA 全称:Java Persistence API(运行时把实体对象持久到数据库中)

HibernateSpringOpenJPAToplink等都是JPA的实现。(但是HIbernate早于JPA的实现)

JPAjavaee5.0的亮点。

 

SessionFactory一个应用只有一个,二级缓存,创建session对象。

一个session对象只有在一个线程中使用

4、初步学习(Hibernate第一个实例)

 

(1)加入包

Hibernate包和数据库连接:

技术分享

 

(2)建立Hibernate配置文件(hibernate.cfg.xml)

<?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>  

<!-- 从官方文档hibernate.property中获取(里面有连接各种数据库的实例) -->

<session-factory>

<property name="show_sql">true</property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  

        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>  

        <property name="connection.username">root</property>  

        <property name="connection.password">abc123</property>  

           <!-- JDBC connection pool (use the built-in) -->  

        <property name="connection.pool_size">1</property>  

        <!-- Enable Hibernate‘s automatic session context management -->  

        <property name="current_session_context_class">thread</property>  

  

        <!-- Disable the second-level cache  -->  

        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>  


        <!-- Drop and re-create the database schema on startup -->  

        <property name="hbm2ddl.auto">update</property>  

        <mapping resource="hibernate/test/xml/Student.hbm.xml"></mapping>

</session-factory>

</hibernate-configuration>

(3)建立实体类

package hibernate.test.domain;

public class Student {

private int id;

private String sNo;

private String name;

private String pass;

private String schoolName;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getsNo() {

return sNo;

}

public void setsNo(String sNo) {

this.sNo = sNo;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPass() {

return pass;

}

public void setPass(String pass) {

this.pass = pass;

}

public String getSchoolName() {

return schoolName;

}

public void setSchoolName(String schoolName) {

this.schoolName = schoolName;

}

public Student(String sNo, String name, String pass,

String schoolName) {

super();

this.sNo = sNo;

this.name = name;

this.pass = pass;

this.schoolName = schoolName;

}

public Student() {

super();

// TODO Auto-generated constructor stub

}

}

 

(4)建立对应实体类的映射文件(student.hbm.xml)

<?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="hibernate.test.domain">  

<class name="Student" table="student" lazy="true">

<id name="id">

<generator class="native"/>

</id>

<property name="sNo" column="sno" not-null="true"  type="java.lang.String"></property>

<property name="name" type="java.lang.String"></property>

<property name="pass" type="java.lang.String"></property>

<property name="schoolName" type="java.lang.String"></property>

</class>

</hibernate-mapping>

(5)测试类

public class Test1 {

public static void main(String[] args) throws SecurityException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {

// TODO Auto-generated method stub

Configuration configuration=new Configuration();

configuration.configure();

SessionFactory sessionFactory=configuration.buildSessionFactory();

Session session=sessionFactory.openSession();

//必须加事务,要么数据库就没有插入数据

Transaction transaction=session.beginTransaction();

Student student=new Student("201200834201","name","000000","zhongyuangongxueyaun1");

session.save(student);

transaction.commit();

session.close();

}

}

Hibernate事务默认是不提交的,增删改都需要提交事务,查不需要提交事务

5、单例模式SessionFactory一个web应用中只有一个)

封装session

package hibernate.test.test;

import org.hibernate.Session;

import org.hibernate.SessionFactory;  

import org.hibernate.cfg.Configuration;  

public class HibernateUtil {  

    private static SessionFactory sessionFactory;

    private HibernateUtil(){  

    }

    static{

    Configuration configuration=new Configuration();

    configuration.configure("hibernate.cfg.xml");

    sessionFactory=configuration.buildSessionFactory();

    }

    public static SessionFactory getSessionFactory(){

    return sessionFactory;

    }

    public static Session getSession(){

    return sessionFactory.openSession();

    } 

}  

 

Test2中调用session,向数据库插入数据,测试如下:

package hibernate.test.test;

import hibernate.test.domain.Student;

import org.hibernate.Session;

import org.hibernate.Transaction;

public class Test2 {

public static void main(String[] args) {

// TODO Auto-generated method stub

Session session=null;

Transaction tx=null;

try {

session=HibernateUtil.getSession();

tx=session.beginTransaction();

Student student=new Student("201200834202","nameytt","000000","zhongyuangongxueyaun1");

session.save(student);

tx.commit();

} catch (Exception e) {

// TODO: handle exception

if(tx!=null)

{

tx.rollback();

}

throw e;

}

finally{

if(session!=null)

{session.close();}

}

}

}

插入成功!

6、Hibernate生命周期

见:http://www.cnblogs.com/wangchenyang/archive/2011/08/23/2150373.html

public static void main(String[] args) {

// TODO Auto-generated method stub

Session session=null;

Transaction tx=null;

try{

session=HibernateUtil.getSession();

tx=session.beginTransaction();

//通过反射机制去获取对象

//如果id=2的记录不存在,返回null。get方法是在缓存(session中 一级缓存)中进行查找,若无,再在sessionFactory(二级缓存)中进行查找,若无,再连接数据库重新查找

Student student=(Student) session.get(Student.class, 2);

System.out.println(student.getName());

//如果id=2的记录不存在,则会抛出异常,一般用于这个记录一定存在的情况。该方法有懒加载。

//Student student2=(Student) session.load(Student.class, 2);

student.setName("ytt_01");

session.save(student);

System.out.println(student.getName());

tx.commit();

} catch (Exception e) {

// TODO: handle exception

if(tx!=null)

{

tx.rollback();

}

throw e;

}

finally{

if(session!=null)

{

session.close();

}

}

}


Hibernate学习(一)

标签:hibernate

原文地址:http://yt0116.blog.51cto.com/9221014/1729591

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!