欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三 Spring整合Hibernate-Hibernate

程序员文章站 2022-04-14 21:36:53
...

本Spring Data系列的内容均是根据 百战程序员关于Sping Data视频 编写而成。

一 HQL查询

HQL:HIbernate Query Language

HQL的语法:就是将原来的sql语句中的表与字段名称换成对象与属性的名称。

1.1 在UsersDao中添加如下代码

List<Users> selectUsersByUserName(String userName);

1.2 在UsersDaoImpl中添加如下代码

	public List<Users> selectUsersByUserName(String userName) {
		/**
		 * sessionFactory.getCurrentSession():当前session必须要有事务边界(查询也必须有事务),且还能处理唯一的一个事务,当事务提交或者回滚后session自动失效
		 * sessionFactory.openSession():每次都会打开一个新的session,加入每次使用多次,则获得的是不同的session对象,使用完毕后我们需要调用close手动的关闭session
		 */
		SessionFactory sessionFactory = this.hibernateTemplate.getSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("from Users where userName=:userName");
		query.setString("userName", userName);
		return query.list();
	}

1.3 在UsersDaoImplTest中添加如下代码

	/**
	 * 没加事务注解执行会异常:
	 * org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
	 * 加上@Transactional事务注解后的执行结果:
		Hibernate: select users0_.id as id1_0_, users0_.age as age2_0_, users0_.user_name as user_nam3_0_ from ts_users users0_ where users0_.user_name=?
		[Users(id=5, userName=路飞-海贼王, age=28)]
	 */
	@Test
	@Transactional
	public void testSelectUsersByUserName() {
		List<Users> list = this.userDao.selectUsersByUserName("路飞-海贼王");
		System.out.println(list);
	}

二 SQL查询

2.1 在UsersDao添加如下代码

List<Users> selectUsersByUserNameSQL(String userName);

2.2 在UsersDaoImpl添加如下代码

	public List<Users> selectUsersByUserNameSQL(String userName) {
		SessionFactory sessionFactory = this.hibernateTemplate.getSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		SQLQuery query = session.createSQLQuery("select * from ts_users where user_name=?");
		query.addEntity(Users.class);
		query.setString(0, userName);
		return query.list();
	}

2.3 在UsersDaoImplTest添加如下代码

	/**
	 * 执行结果:
		Hibernate: select * from ts_users where user_name=?
		[Users(id=5, userName=路飞-海贼王, age=28)]
	 */
	@Test
	@Transactional
	public void testSelectUsersByUserNameSQL() {
		List<Users> list = this.userDao.selectUsersByUserNameSQL("路飞-海贼王");
		System.out.println(list);
	}

三 QBC查询

QBC:Query By Criteria

3.1 在UsersDao添加如下代码

	List<Users> selectUsersByUserNameQBC(String userName);

3.2 在UsersDaoImpl添加如下代码

	public List<Users> selectUsersByUserNameQBC(String userName) {
		SessionFactory sessionFactory = this.hibernateTemplate.getSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		Criteria criteria = session.createCriteria(Users.class);
		criteria.add(Restrictions.eq("userName", userName));
		return criteria.list();
	}

3.3 在UsersDaoImplTest添加如下代码

	/**
	 * 执行结果:
		Hibernate: select this_.id as id1_0_0_, this_.age as age2_0_0_, this_.user_name as user_nam3_0_0_ from ts_users this_ where this_.user_name=?
		[Users(id=5, userName=路飞-海贼王, age=28)]
	 */
	@Test
	@Transactional
	public void testSelectUsersByUserNameQBC() {
		List<Users> list = this.userDao.selectUsersByUserNameQBC("路飞-海贼王");
		System.out.println(list);
	}