• 框架学习之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 目录

  • 相关阅读:
    Python进阶-----类、对象的相关知识
    Python进阶-----面向对象和类的基本定义
    Python基础-----hashlib模块
    Python基础-----configparser模块
    Python基础-----logging模块
    Python基础-----re模块(模糊匹配)
    Python基础-----xml模块
    Python基础-----shelve模块
    Python基础-----pickle模块
    Python基础-----json模块
  • 原文地址:https://www.cnblogs.com/yinger/p/2136943.html
Copyright © 2020-2023  润新知