三 Spring整合Hibernate-Hibernate

本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);
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章