框架学习之Hibernate 第二节 入门案例分析

1.配置文件

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>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernatedb</property>
        <property name="connection.username">root</property>
        <property name="connection.password">yinger</property>
        
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hbm2ddl.auto">create</property>
        <property name="show_sql">true</property>
        
        <mapping resource="com/yinger/domain/User.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

User.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="com.yinger.domain">

    <class name="User" table="user">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name"/>
        <property name="birthday" />
    </class>
    
</hibernate-mapping>

2.JavaBean 和 Java代码(DAO)

Domain  Object:User.java

/**
* @Author:胡家威  
* @CreateTime:2011-8-13 下午12:48:29
* @Description:
*/

package com.yinger.domain;

import java.util.Date;

public class User {
    
    private int id;
    private String name;
    private Date birthday;
    
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

}

接口: UserDAO.java

/**
* @Author:胡家威  
* @CreateTime:2011-8-13 下午09:14:42
* @Description:
*/

package com.yinger.dao;

import com.yinger.domain.User;

public interface UserDAO {
    
    public void saveUser(User u);
    public void delUser(User u);
    public void updateUser(User u);
    public User findUserById(int id);
    public User findUserByName(String name);
    
}

DAO实现类: UserManager.java

/**
* @Author:胡家威  
* @CreateTime:2011-8-13 下午09:20:59
* @Description:
*/

package com.yinger.manager;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.yinger.dao.UserDAO;
import com.yinger.domain.User;
import com.yinger.util.HibernateUtils;

public class UserManager implements UserDAO {

    //保存
    @Override
    public void saveUser(User u) {
        Session s = null;
        Transaction tr = null;
        try{
            s = HibernateUtils.getSession();
//            tr = s.beginTransaction();//开启事务
//            s.save(u);
            s.persist(u);//hibernate3.0 没有开启事务时 persist会产生 insert语句!---这里和视频内容不同,视频版本是hibernate3.2.5 
//            tr.commit();
        }catch(Exception e){
            if(tr!=null){
                tr.rollback();
            }
            e.printStackTrace();//如果写throw e的话,接口中的方法也要定义成抛出异常
        }finally{
            if(s!=null){
                s.close();//一定要close
            }
        }
    }

    //删除
    @Override
    public void delUser(User u) {
        Session s = null;
        Transaction tr = null;
        try{
            s = HibernateUtils.getSession();
            tr = s.beginTransaction();
            s.delete(u);
            tr.commit();
        }catch(Exception e){
            if(tr!=null){
                tr.rollback();
            }
            e.printStackTrace();
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }

    //更新
    @Override
    public void updateUser(User u) {
        Session s = null;
        Transaction tr = null;
        try{
            s = HibernateUtils.getSession();
            tr = s.beginTransaction();
            s.update(u);
            tr.commit();
        }catch(Exception e){
            if(tr!=null){
                tr.rollback();
            }
            e.printStackTrace();
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }

    //根据id查找
    @Override
    public User findUserById(int id) {
        User u = null;
        Session s = null;
        try{
            s = HibernateUtils.getSession();
            u = (User)s.get(User.class, id);//默认就是根据id查找
            
            //懒加载
//            u = (User)s.load(User.class, id);//load方式的返回值永远都不可能是空,load不会立刻去访问数据库,直到第一次去使用时才访问
//            System.out.println(u.getName()+" "+u.getBirthday());//如果没有这一句打印语句会报错!懒加载的异常
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(s!=null){
                s.close();
            }
        }
        return u;
    }

    //根据name查找
    @Override
    public User findUserByName(String name) {
        User u = null;
        Session s = null;
        try{
            s = HibernateUtils.getSession();
            
            //方法一:hql中使用?
//            String hql = "from User as user where user.name=?";
//            Query query = s.createQuery(hql);
//            query.setString(0, name);
            
            //方法二:使用替代字符
            String hql = "from User as user where user.name=:name";
            Query query = s.createQuery(hql);
            query.setString("name", name);
            
            //实现分页效果,这个是可移植的,不管使用的那一种数据库,通过配置文件中的 Dialect来完成
//            query.setFirstResult(0);
//            query.setMaxResults(10);
            
            //如果满足查询条件的结果很多
//            List<User> list = query.list();
//            for(User user:list){
//                System.out.println(user.getName());
//            }
            
            
            //如果只有一个
            u = (User)query.uniqueResult();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(s!=null){
                s.close();
            }
        }
        return u;
    }

}

帮助类: HibernateUtils.java

/**
* @Author:胡家威  
* @CreateTime:2011-8-13 下午12:56:38
* @Description:
*/

package com.yinger.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    
    private static SessionFactory sf;
    
    private HibernateUtils(){
        
    }

    static{
        Configuration cfg = new Configuration();
        cfg.configure();
        sf = cfg.buildSessionFactory();
    }
    
    public static SessionFactory getSessionFactory(){
        return sf;
    }
    
    public static Session getSession(){
        return sf.openSession();//注意:没有使用getCurrentSession方法
    }
    
}

测试类:Test.java

/**
* @Author:胡家威  
* @CreateTime:2011-8-13 下午09:38:35
* @Description:
*/

package com.yinger.main;

import java.util.Date;

import com.yinger.domain.User;
import com.yinger.manager.UserManager;

public class Test {
    
    public static void main(String arg[]){
        //插入两条数据
        User u = new User();
        u.setName("yinger");
        u.setBirthday(new Date());
        
        User u0 = new User();
        u0.setName("hibernate");
        u0.setBirthday(new Date());
        
        UserManager um = new UserManager();
        um.saveUser(u);
        um.saveUser(u0);
        
        User u1 = new User();
        User u2 = new User(); 
        
        //测试 findUserByName 和 delUser 方法
        String name = "yinger";
        u1 = um.findUserByName(name);
        System.out.println(u1.getId()+" "+u1.getName());
        um.delUser(u1);
        u1 = um.findUserByName(name);
        if(u1!=null){
            System.out.println(u1.getId()+" "+u1.getName());
        }else{
            System.out.println("不存在该用户!");
        }
        
        //测试 findUserById 和  updateUser 方法
        int id = 2;
        u2 = um.findUserById(id);
        System.out.println(u2.getId()+" "+u2.getName());
        u2.setName("java");
        u2.setBirthday(new Date());
        um.updateUser(u2);
        u2 = um.findUserById(id);
        System.out.println(u2.getId()+" "+u2.getName());
        
        System.out.println("OK");
    }

}

文档目录结构:

mulu

测试结果:

控制台的信息

console

数据库中的数据

data

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

刚开始时使用的Hibernate是3.6.6final版本,出现了很多的错误!最后换成了 Hibernate3.0 版本

错误:

开始时报错   SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

slf4j

加入了 slf4j-log4j 的jar包之后报错,提示无法 instantiate SLF4J LoggerFactory

logger

再加入了 slf4j-nop-1.6.1.jar 之后,提示重复了

mutiple

只是加入了 slf4j-nop-1.6.1.jar,重新运行,报错,这次没有了 找不到类的错误,但是还有一个新的错误 ExceptionInInitializerError

nop

小知识点:关联源代码

如果是 3.6.6

要想让程序中能够查看Hibernate中的某些类的源代码的方法,将 attach source中选中 select folder

目标文件夹是下载下来的Hibernate 3.6中的以下路径:hibernate-distribution-3.6.6.Final\project\hibernate-core\src\main\java

如果是 3.0

那么关联的文件夹是 下载下来的Hibernate 中的 src 目录

原文地址:https://www.cnblogs.com/yinger/p/2136943.html