設計思路
- BaseDao爲各個實體Dao類的接口,定義了各個增刪改查方法。
- BaseDaoImpl實現BaseDao,子類可繼承該類,獲取dao層的基本方法。
- UserDao爲一個具體的實體的dao接口,該接口繼承BaseDao,並可以再繼續寫入新的 方法。
- UserDaoImpl爲UserDao的實現類,該類繼承BaseDaoImpl,實現UserDao。
- UserDaoTest爲測試類
類圖如下:
實現代碼
-
- BaseDao實現代碼:
package dao;
import java.io.Serializable;
import java.util.List;
/**
* dao層基類,實現增刪改查
* @author PC-ASUS(zzs)
*
* @param <T>
*/
public interface BaseDao<T> {
//添加一個對象
void save(T entity);
//更新一個對象,所有屬性
void update(T entity);
//更新一個對象,部分屬性
void partUpdate(int id, String[] names, Object[] values);
//刪除一個對象
void delete(Serializable id);
//根據id查找一個對象
T findById(Serializable id);
//根據HQL返回對象List
List<T> findByHQL(String hql, Object... params);
//分頁查詢
List<T> queryPage(String hql, int pageNo, int pageSize);
}
- BaseDaoImpl實現代碼:
package dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import utils.HibernateSessionFactory;
import dao.BaseDao;
public class BaseDaoImpl<T> implements BaseDao<T>{
private Class<T> clazz; //T的具體類
/**
* 通過構造方法指定DAO的具體實現類
*/
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class<T>) type.getActualTypeArguments()[0];
//System.out.println("DAO的真實實現類是:"+this.clazz.getName());
}
/**
* 獲取當前工作的Session
*/
protected Session getSession(){
return HibernateSessionFactory.getSession();
}
@Override
public void save(Object entity) {
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
session.save(entity);
tx.commit();
}catch(Exception ex){
System.out.println("保存對象出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
}
@Override
public void update(Object entity) {
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
session.update(entity);
tx.commit();
}catch(Exception ex){
System.out.println("更新對象出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
}
@Override
public void partUpdate(int id, String[] names, Object... values) {
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
String tab = clazz.getSimpleName();
String hql = "update "+tab+" t";
for(int i = 0;i < names.length;i ++){
hql += " set t."+names[i]+"=?";
}
hql += " where t.id="+id;
Query query = session.createQuery(hql);
for(int i = 0;i < values.length;i ++){
query.setParameter(i, values[i]);
}
System.out.println("部分更新:"+hql);
query.executeUpdate();
tx.commit();
}catch(Exception ex){
System.out.println("更新對象部分屬性出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
}
@Override
public void delete(Serializable id) {
T obj = findById(id);
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
}catch(Exception ex){
System.out.println("刪除對象出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
}
@Override
public T findById(Serializable id) {
Session session = null;
Transaction tx = null;
T obj = null;
try{
session = this.getSession();
tx = session.beginTransaction();
obj = (T) session.get(clazz, id);
tx.commit();
}catch(Exception ex){
System.out.println("查找對象出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
return obj;
}
@Override
public List<T> findByHQL(String hql, Object... params) {
List<T> list = null;
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
Query query = session.createQuery(hql);
for(int i = 0;params != null && i < params.length; i ++){
query.setParameter(i, params[i]);
}
System.out.println("HQL查詢:"+hql);
list = query.list();
tx.commit();
}catch(Exception ex){
System.out.println("執行HQL查找對象出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
return list;
}
@SuppressWarnings("unchecked")
public List<T> queryPage(String hql, int pageNo, int pageSize){
List<T> list = null;
Session session = null;
Transaction tx = null;
try{
session = this.getSession();
tx = session.beginTransaction();
Query query = session.createQuery(hql);
list = query.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize)
.list();
tx.commit();
}catch(Exception ex){
System.out.println("分頁查詢出現錯誤出現錯誤!");
ex.printStackTrace();
if(tx != null){
tx.rollback();
}
}finally{
if(session != null){
session.close();
}
}
return list;
}
}
- UserDao實現代碼
package dao;
import model.User;
public interface UserDao extends BaseDao<User>{
}
- UserDaoImpl實現代碼
package dao.impl;
import model.User;
import dao.UserDao;
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
}
測試:
package dao.impl;
import java.util.List;
import org.junit.Test;
import model.User;
import dao.UserDao;
public class UserDao_Test {
//@Test
public void saveTest(){
User user = new User();
user.setName("aaa");
user.setPassword("123456");
UserDao userDao = new UserDaoImpl();
userDao.save(user);
}
//@Test
public void deleteTest(){
UserDao userDao = new UserDaoImpl();
userDao.delete(2);
}
//@Test
public void findByIdTest(){
UserDao userDao = new UserDaoImpl();
User user = userDao.findById(2);
System.out.println(user.getName());
}
//@Test
public void updateTest(){
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setId(1);
user.setName("yyy");
userDao.update(user);
}
//@Test
public void partUpdateTest(){
int id = 1;
String[] names = {"password"};
Object[] values = new Object[names.length];
values[0] = "4645654";
UserDao userDao = new UserDaoImpl();
userDao.partUpdate(id, names, values);
}
//@Test
public void findByHQLTest(){
//String hql = "update User t set t.password=? where t.id=1";
String hql = "from User u where u.id = ?";
Object[] params = {1};
UserDao userDao = new UserDaoImpl();
User user = userDao.findByHQL(hql, params).get(0);
System.out.println(user.toString());
}
@Test
public void queryPageTest(){
//插入數據
/*for(int i = 1;i <= 40;i ++){
this.saveTest();
}*/
String hql = "from User u";
UserDao userDao = new UserDaoImpl();
List<User> users = userDao.queryPage(hql, 2, 3);
for(User user : users){
System.out.println(user);
}
}
}
重點描述
- 利用反射機制,獲取具體實現類
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class<T>) type.getActualTypeArguments()[0];
//System.out.println("DAO的真實實現類是:"+this.clazz.getName());
- 對應Hibernate中Session提供的update方法,或對實體的所有屬性進行更新,可能導致某些值變爲null。當我們只想更新對象部分屬性時,可以通過執行hql語句解決這個問題。