Hibernate(二)CRDU操作和HQL

CRUD的操作

通俗的来讲:就是增(Create)删(Delete)改(Update)查(Read)
接上篇 https://blog.csdn.net/qq_44475743/article/details/88563254

因为在创建工厂的时候就会去创建数据库,这里是非常消耗资源的,我们可以把创建工厂的过程封装起来,只运行一次。

//因为只创建一次数据表,所以用static修饰,使用单例
	private static SessionFactory SessionFactory;
	private Session session;
	static{
		SessionFactory = new Configuration().configure().buildSessionFactory();
	}
	//Before 注解下的方法会在Test下的方法执行之前执行
	@Before
	public void getSession(){
		System.out.println("==============before");
		session = SessionFactory.openSession();
	}
	//After 注解下的方法会在Test下的方法执行之后执行
	@After
	public void closeSession(){
		System.out.println("===============after");
		//判断session是否为null
		if (session!=null) {
			//关闭session
			session.close();
		}
	}

新增在上篇举例时写过了,这里就不在写了,下面是查找,修改,删除

查询

将重复的代码进行封装,代码量减少了不少
修改和删除,是先对数据库进行查询,查到次行数据在对其进行操作

//查询	
	@Test
	public void queryUser(){
		//查询id为1的用户
		User user = session.get(User.class, 1);
		//输出
		System.out.println(user);
	}
//修改
	@Test
	public void updateUser(){
		//先查询,在修改
		Transaction transaction = session.beginTransaction();
		User user = session.get(User.class, 1);
		user.setUpass("912837");
		session.update(user);
		transaction.commit();
		System.out.println(user);
	}
	//删除
	@Test
	public void deleteUser(){
		//先查询,在删除
		Transaction transaction = session.beginTransaction();
		User user = session.get(User.class, 3);//查
		session.delete(user);
		transaction.commit();
	}

对象的状态

对象分为三种状态:
1)瞬时态/临时态

刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的状态的Java对象被称为临时对象。
特点:对象没有id与session无关
在这里插入图片描述

2)持久态

已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
特点:对象有id并与session有关
在这里插入图片描述

3)脱管态/游离态

已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。
特点:对象中有id但与session无关
在这里插入图片描述

这里用张图来进行说明
在这里插入图片描述

HQL语句

使用query对象查询,不需要写sql语句但是需要写hql语句(hibernate query language)与普通sql相似,区别在于sql操作的是数据表和字段,而hql操作的是实体类和属性(当然,也可以操作sql语句,后面会介绍)
依然对重复的代码进行封装
在数据库中的表为
在这里插入图片描述

	private static SessionFactory SessionFactory;
	private Session session;
	static{
		SessionFactory = new Configuration().configure().buildSessionFactory();
	}
	@Before
	public void getSession(){
		System.out.println("==============before");
		session = SessionFactory.openSession();
	}
	@After
	public void closeSession(){
		System.out.println("===============after");
		if (session!=null) {
			//关闭session
			session.close();
		}
	}
1)查询所有
//查询所有
	@Test
	public void Query1(){
		//创建一个字符串,装HQL语句
		String hql = "FROM User";
		//查询
		Query query = session.createQuery(hql);
		//多条数据,装入list中去(list是User类型的)
		List<User> users = query.list();
		//foreach遍历
		for (User user : users) {
			//打印出查询的数据
			System.out.println(user);
		}
	}

在这里插入图片描述

2)条件查询
//条件查询-------查询uname和upass都正确(例如:uname=张大胖,upass='222222')
	@Test
	public void Query2(){
		String hql = "FROM User WHERE uname = ? AND upass = ?";
		Query query = session.createQuery(hql);
		//给占位符赋值
		query.setParameter(0, "张大胖");
		query.setParameter(1, "222222");
		//装入list
		List<User> users = query.list();
		//遍历
		for (User user : users) {
			System.out.println(user);
		}
	}

在这里插入图片描述

3)模糊查询
@Test
	public void Query3(){
		String hql = "FROM User WHERE uname LIKE ?";
		Query query = session.createQuery(hql);
		query.setParameter(0, "%小%");
		List<User> users = query.list();
		for (User user : users) {
			System.out.println(user);
		}
	}

在这里插入图片描述

4)分页查询
//分页查询
	@Test
	public void Query4(){
		String hql = "FROM User";
		Query query = session.createQuery(hql);
		//设置其实位置,从0开始
		query.setFirstResult(0);
		//设置每页的数据量(不是数据库中的主键,是按顺序往下数3条)
		query.setMaxResults(3);
		List<User> users = query.list();
		for (User user : users) {
			System.out.println(user);
		}
	}

在这里插入图片描述

5)排序查询
//排序查询---------------根据uid进行倒序,这里的uid是对象,不是数据库中的uid
	@Test
	public void Query5(){
		String hql = "FROM User ORDER BY uid DESC";
		Query query = session.createQuery(hql);
		List<User> users = query.list();
		for (User user : users) {
			System.out.println(user);
		}
	}

在这里插入图片描述

6)投影查询
//投影查询--------------只看uname和upass不显示uid(uid=null)
	@Test
	public void Query6(){
		//投影查询,注意的是:实体类中必须要有对应的构造方法
		String hql = "SELECT new User(uname , upass) FROM User";
		Query query = session.createQuery(hql);
		List<User> users = query.list();
		for (User user : users) {
			System.out.println(user);
		}
	}

在这里插入图片描述

自定义sql语句

使用session的createSQLQuery方法获取NativeQuery对象完成

//自定义sql语句
	@Test
	public void sqlQuery(){
		//定义sql语句
		String sql = "SELECT * FROM tb_user";
		//使用方法查询,这里是createSQLQuery()
		SQLQuery sqlQuery = session.createSQLQuery(sql);
		//添加实体类
		sqlQuery.addEntity(User.class);
		//存入list集合中
		List<User> users = sqlQuery.list();
		//遍历
		for (User user : users) {
			System.out.println(user);
		}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值