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 目录