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"); } }
文档目录结构:
测试结果:
控制台的信息
数据库中的数据
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
刚开始时使用的Hibernate是3.6.6final版本,出现了很多的错误!最后换成了 Hibernate3.0 版本
错误:
开始时报错 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
加入了 slf4j-log4j 的jar包之后报错,提示无法 instantiate SLF4J LoggerFactory
再加入了 slf4j-nop-1.6.1.jar 之后,提示重复了
只是加入了 slf4j-nop-1.6.1.jar,重新运行,报错,这次没有了 找不到类的错误,但是还有一个新的错误 ExceptionInInitializerError
小知识点:关联源代码
如果是 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 目录