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