首页 > 其他分享 >hibernate——简单的增删改查

hibernate——简单的增删改查

时间:2023-08-27 11:07:07浏览次数:33  
标签:hibernate 改查 session user 增删 import null public


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


标签:hibernate,改查,session,user,增删,import,null,public
From: https://blog.51cto.com/u_5173797/7251405

相关文章

  • hibernate——Session接口中定义的saveOrUpdate()方法浅析
    Session接口中定义的saveOrUpdate方法,集合了save和update方法,根据对象的状态来选择是进行保存还是更新,那它是怎么判断当前对象的状态的呢?API中对这个方法是这样说的,它是根据一个unsaved-value来决定的。这个值是在映射文件中的<id>标签中的一个属性。<id>标签表示的是表的主键,若主......
  • hibernate——初步认识
    开始学习hibernate了,跟着网上的教学视频边看边学。现在有些迷茫,不知道学这些东西,以后能不能用得上,也不知道未来会发展成什么样子,也不知道我的基础算是打好了没有,总觉得学这些框架,有点浮沙筑高台的感觉,心里很不踏实。知道的都是些表面的东西,框架底层是什么样的,看看那些源代码,想看懂......
  • hibernate——两种查询方式
    一种是hql语句查询,用Query接口去实现;一种是条件查询,用Criteria接口去实现。这两种方式作用差不多,只是后者更符合面向对象一些。用hql语句查询,如下例:publicstaticvoidquery(Stringname){ Sessionsession=null; try{ session=HibernateUtil.getSession(); //St......
  • hibernate——和数据库关联的对象的三种状态
    和数据库关联的对象有三种状态:瞬时,持久,脱管。瞬时:在数据库中还没有与该对象关联的记录,仅仅是一个普通的对象而已,超过作用域,就会被回收。一般都是new出来的对象,并且还没有与session建立联系。持久:与session建立了联系,并且在数据库中已经有了和该对象关联的记......
  • hibernate——一对一、多对一和多对多关系的比较
    现在学习完了这几种映射关系,但是有点乱,这里来小结一下。关键是表之间如何产生映射关系,以及产生的表的结构。1、一对一映射:一对一是通过one-to-one标签来产生映射关系的,其实,如果单单说是建立两个表之间的关联,只要在一个映射文件中配置one-to-one标签就可以了,在另一个映射文件中,也做......
  • Spring Data JPA查询报错java.lang.StackOverflowError hibernate SpringBoot
    toString()造成死循环,重写toString()方法现象测试JPA的多对多查询时,有一个User对象,该User有多个Role,然后报错User@Data@Entity@Table(name="user")publicclassUser{@Id//主键自动增长@GeneratedValue(strategy=GenerationType.IDENTITY)@Co......
  • Gorm实现数据库增删查改——mysql篇
    本文的目标本文力图实现用简短的篇幅,结合一些具体的应用场景来讲述gorm基本的增删查改功能。Gorm介绍在现代软件开发中,数据库操作是构建应用程序不可或缺的一部分。GORM是Go语言的一个ORM(ObjectRelationalMapping)库。它可以让我们通过Go来操作数据库中的数据。其中ORM(Obje......
  • 数据库基础三 数据库基本语法(增删改查)(DML与DDL)
    数据库(命令行操作DDL)(1)创建数据库--1、创建数据库CREATEDATABASEIFNOTEXISTSchange818;--建立change818数据库(IFNOTEXISTS可以不写,但是数据库名不能重复)--2、创建数据库并指定字符集CREATEDATABASEIFNOTEXISTSchange818DEFAULTCHARACTERSETutf8COLLATE......
  • mybatis <foreach>标签动态增删改查方式
    摘要目录<foreach>标签动态增删改查mybatis<foreach>实战有了建表以及插入,当然少不了删除和更新mapper.xml中<foreach&目录<foreach>标签动态增删改查mybatis<foreach>实战有了建表以及插入,当然少不了删除和更新mapper.xml中<foreach>标签使用适用场景 <......
  • hibernate_demo
    参考:ORM----hibernate入门Demo(无敌详细版)-Old-凯-博客园(cnblogs.com)Hibernate-基础入门详解_51CTO博客_hibernate入门hmb.xml:Hibernate框架之hbm.xml映射文件(详解)_hibernate映射文件详解_hestyle的博客-CSDN博客 新建testdb数据库,创建tb_users表: 模块整体目录......