增删改比较简单,查稍微复杂一点。查询有两种方式,一种是通过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之外,还要设置各个属性值,否则会全部置为默认值。