hibernate——简单的增删改查

增删改比较简单,查稍微复杂一点。查询有两种方式,一种是通过hql语句和Query接口来实现,一种是条件查询,通过Ctiteria接口来实现,下面举例说明:

UserDao接口:

package com.suo.hibernate.dao;

import java.util.List;

import com.suo.domain.User;

public interface UserDao {
	public void saveUser(User user);
	public User findUserById(int id);
	public List<User> findUserByName(String name);
	public void removeUser(User user);
	public void updateUser(User user);
}
获得session的工具类:

package com.suo.hibernate.util;

import java.io.Serializable;

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

import com.suo.domain.User;

public final class HibernateUtil {
	
	private static SessionFactory sessionFactory;
	
	/**
	 * 私有的构造方法,这样就可以防止实例化这个类
	 */
	private HibernateUtil(){}
	
	/**
	 * 因为读取配置文件和映射文件很耗时间,所以这段代码块定义成静态的,那么只加载一次就可以了
	 */
	static{
		Configuration config=new Configuration();
		config.configure();//读取配置文件,默认的是读取hibernate.cfg.xml,若文件名不是这个,也可以以参数形式指定
		sessionFactory=config.buildSessionFactory();
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public static Session getSession(){
		return sessionFactory.openSession();
	}
}
对接口的实现类:UserDaoImpl

package com.suo.hibernate.impl;

import java.util.List;

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

import com.suo.domain.User;
import com.suo.hibernate.dao.UserDao;
import com.suo.hibernate.util.HibernateUtil;

public final class UserDaoImpl implements UserDao {

	public void saveUser(User user) {
		Session session=null;
		Transaction transaction=null;
		try{
			session=HibernateUtil.getSession();//获得一个连接
			transaction=session.beginTransaction();//开启一个事务
			session.save(user);
			transaction.commit();
		}catch(HibernateException e){
			if(transaction!=null){
				transaction.rollback();
			}
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}

	/**
	 * 通过session的get方法进行查询操作
	 * @param id 通过主键来查询
	 * @return 若存在则返回查询到对象,否则返回空
	 */
	public User findUserById(int id) {
		Session session=null;
		try{
			session=HibernateUtil.getSession();
			
			User user=(User)session.get(User.class, id);
			
			return user;
			
		}catch(HibernateException e){
			e.printStackTrace();
			return null;
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}

	/**
	 * 通过hql语句进行查询操作
	 * @param name 通过name键来进行查询
	 */
	public List<User> findUserByName(String name) {
		Session session=null;
		try{
			session=HibernateUtil.getSession();
			
			String hql="from User as user where user.name=?";
			Query query=session.createQuery(hql);
			query.setString(0, name);
			List<User> list=query.list();
			
			return list;
		}catch(HibernateException e){
			e.printStackTrace();
			return null;
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}

	/**
	 * 删除某个对象
	 */
	public void removeUser(User user) {
		Session session=null;
		Transaction transaction=null;
		try{
			session=HibernateUtil.getSession();//获得一个连接
			transaction=session.beginTransaction();//开启一个事务
			session.delete(user);//这里不太明白,这里的user处于脱管状态,到底是怎么删除的呢?
			transaction.commit();
		}catch(HibernateException e){
			if(transaction!=null){
				transaction.rollback();
			}
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	/**
	 * 更新某个对象
	 */
	public void updateUser(User user) {
		Session session=null;
		Transaction transaction=null;
		try{
			session=HibernateUtil.getSession();//获得一个连接
			transaction=session.beginTransaction();//开启一个事务
			session.update(user);
			transaction.commit();
		}catch(HibernateException e){
			if(transaction!=null){
				transaction.rollback();
			}
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	
}

需要注意的是用session中的delete删除一个对象和用update更新一个对象,都是通过id来查找该对象的,通过它执行的sql语句可以知道,所以,在删除一个对象时,首先要new一个user,然后指明id,才会正确的删除和更新,此外,更新操作的sql语句是更新所有的除id之外的属性,所以,对于更新,除了要指明id之外,还要设置各个属性值,否则会全部置为默认值。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值