hibernate 基础 hql 使用

这篇文章主要是关于 hql 的一些 联系 (基本的增删查改)

关系映射XML的简单配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="entity">

	<class name="Users" table="user" lazy="true">
		<comment>Users may bid for or sell auction items.</comment>
		
		<!-- 设置 主键 -->
		<id name="userId"> 
		<!-- 主键的增长策略 -->
			<generator class="native"/>
		</id>
		
		<!-- 设置 类和字段之间的映射关系,可以通过colum设置数据库的字段名 -->
		<property name="userName"/>
		
		<property name="password" 
				not-null="true"
				length="15"
				column="`password`"/>
		
	</class>
	
</hibernate-mapping>

测试hibernate 使用hql的 基本操作(增删查改)

package test;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
import entity.Users;

public class CURDTest {

	/**
	 * 该类是 测试 hibernate的CURD(增删改查) 主要测试hql语句的查询
	 */

	@Test
	/**
	 * 测试单表  的查询 所有信息  (无参数,无条件查询)
	 */
	public void query() {
		//1.得到配置文件
		Configuration cfg = new Configuration().configure();
		//2.创建session工厂,用来连接数据库
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.打开连接
		Session session = sessionFactory.openSession();

		// 4.开启事务
		try {
			session.beginTransaction();
			//5.创建hql
			String hql = "from Users";
			//6.创建查询
			Query query = session.createQuery(hql);
			//7.接收结果集
			List<Users> ulist = query.list();
			for (Users users : ulist) {
				System.out.println(users.getUserId() + users.getUserName());
				System.out.println(users);
			}
			//8.提交事务  --->查询 时可以不适用提交事务
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务-->保证事务的 一致性 和原子性
			session.getTransaction().rollback();
		} finally {
			//关闭连接,释放资源
			session.close();
		}
	}

	
	/**
	 * 测试单条件 查询   不要忘记 添加@Test 这里使用的是 Junit4
	 */
	@Test 
	public void query2() {

		Configuration cfg = new Configuration().configure();
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		Session session = sessionFactory.openSession();

		// 开启事务
		try {
			session.beginTransaction();
			//hql操作的都是 类 和 对象 ,而不是数据库的表名 和字段名
			/**
			 * 设置参数的方式有两种:
			 * 一种是 直接用  '?'
			 * 二 是 使用':'+参数名
			 */
			//第一种绑定参数的方法,使用问号  进行 参数的拼接
			/*String hql = "from Users where userId=?";
			Query query = session.createQuery(hql);
			// 参数是从 0 开始  ---->而JDBC查询时 从1 开始
			query.setParameter(0, 1);*/
			//第二种:使用 ":"+参数名的方式
			String hql = "from Users where userId=:userId";
			Query query = session.createQuery(hql);
			query.setParameter("userId", 1);
			List<Users> ulist = query.list();
			for (Users users : ulist) {
				System.out.println(users);
			}
			// 提交事务
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			session.close();
		}
	}
	
		/**
		 * 多参数条件的查询:  
		 */
	@Test
	public void query3() {

	Configuration cfg = new Configuration().configure();
	SessionFactory sessionFactory = cfg.buildSessionFactory();
	Session session = sessionFactory.openSession();

	// 开启事务
	try {
		session.beginTransaction();

		String hql = "from Users where password=? and userName = ?";
		Query query = session.createQuery(hql);
		query.setParameter(0, "234");
		query.setParameter(1, "李四");
		List<Users>ulist = query.list();
		for (Users users : ulist) {
			System.out.println(users);
		}
		// 提交事务
		session.getTransaction().commit();
	} catch (HibernateException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		// 异常时 回滚事务
		session.getTransaction().rollback();
	} finally {
		session.close();
	}
}
	
	@Test
	/**
	 * 查询 两列数据以上 使用 object数组进行接收并 遍历
	 */
	public void query4() {

	Configuration cfg = new Configuration().configure();
	SessionFactory sessionFactory = cfg.buildSessionFactory();
	Session session = sessionFactory.openSession();

	// 开启事务
	try {
		session.beginTransaction();

		String hql = "select password,userName from Users";
		Query query = session.createQuery(hql);
		List<Object[]>ulist = query.list();
		for (Object[] objects : ulist) {
			System.out.println(objects[0]+","+ objects[1]);
		}
		// 提交事务
		session.getTransaction().commit();
	} catch (HibernateException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		// 异常时 回滚事务
		session.getTransaction().rollback();
	} finally {
		session.close();
	}
}
	
	/**
	 * hql实现 添加 功能  通过 User的 构造函数 直接进行添加操作
	 * 需要 6步骤 ,构造完需要 调用 save方法 并提交事务
	 */
	@Test
	public void addUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			
			Users user = new Users("小刘11","123");
			//5.调用save方法
			session.save(user);
			
			// 6.提交事务
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
	
	
	/**
	 * hql实现 删除 功能  直接调用 delete方法
	 * 更新 和删除 都是 直接通过 get Class 通过主键id 操作整条数据
	 * 
	 */
	@Test
	public void delUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			
			Users user = (Users) session.get(Users.class, 4);
			//5.调用save方法
			session.delete(user);
			
			// 6.提交事务
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
	
	/**
	 * 修改功能:通过 主键id 直接 获取getClass 查询 原有数据
	 * 并 在原有数据上进行修改,使用自定义类中的set方法进行数据的修改
	 * 选择要修改的信息 ,直接构造 进去 方法
	 */
	@Test
	public void updateUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			
			Users user = (Users) session.get(Users.class, 3);
			//5.通过设置 对象的属性
			user.setUserName("abc");
			session.update(user);
			
			// 6.提交事务
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
	
	/**
	 * 测试聚合函数:
	 * mysql中有五大聚合函数:count,min,max,avg,sum
	 */
	@Test
	public void functionUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
		String hql = "select count(userId) from Users";
			
		Query query = session.createQuery(hql);
		
		List list = query.list();
			// 6.提交事务
		System.out.println(list);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
	
	/**
	 * 测试 分页 查询 :直接调用 setFirstResult 和setMaxResult 两个方法
	 */
	@Test
	public void pageUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
		String hql = "from Users";
			
		Query query = session.createQuery(hql);
		
		query.setFirstResult(2); //相当于 (currentPage-1)*pageSize 0--> 第一页  2-->第二页
		query.setMaxResults(2);//pageSize 每页最大数
		List list = query.list();
			// 6.提交事务
		System.out.println(list);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
	
	
	/**
	 * 测试 懒加载  load 和 get 的区别(重点)
	 * load为加载,不进行查询(懒加载) ,只有在 使用数据的时候才进行查询
	 * get是立即加载,只要执行到get就直接查询到数据
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void lazyUser() {
		//1.拿到配置文件
		Configuration cfg = new Configuration().configure();
		//2.从配置文件构建一个session工厂 (不同于购物的session)
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.
		Session session = sessionFactory.openSession();

		try {
			// 4.开启事务
			session.beginTransaction();
			//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
		
		Users user =(Users) session.load(Users.class, 1);
		System.out.println("到这里还没有执行sql");
			// 6.提交事务
		System.out.println(user);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常时 回滚事务
			session.getTransaction().rollback();
		} finally {
			//7.关闭资源
			session.close();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值