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