javaEE Hibernate,orm元数据配置文件中配置HQL语句。通用Dao层基类BaseDaoImpl.java

User.hbm.xml(orm元数据配置文件):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.xxx.bos.domain.User" table="t_user">
        <id name="id" type="java.lang.String">
            <column name="id" length="32" />
            <generator class="assigned" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="20" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="32" not-null="true" />
        </property>
    </class>
    <!-- 在orm元数据配置文件中,定义HQL语句 -->
    <query name="user.editpassword">
    	UPDATE User SET password = ? WHERE id = ?
    </query>
</hibernate-mapping>

BaseDaoImpl.java(Dao层基类,通过orm配置文件中的HQL语句来操作数据库):

package com.xxx.bos.dao.base.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.xxx.bos.dao.base.IBaseDao;
/**
 * 持久层通用实现
 */
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
	//代表的是某个实体的类型
	private Class<T> entityClass;
	
	@Resource//根据类型注入spring工厂中的会话工厂对象sessionFactory
	public void setMySessionFactory(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
	
	//在父类(BaseDaoImpl)的构造方法中动态获得entityClass
	public BaseDaoImpl() {
		ParameterizedType superclass = (ParameterizedType) this.getClass().getGenericSuperclass();
		//获得父类上声明的泛型数组
		Type[] actualTypeArguments = superclass.getActualTypeArguments();
		entityClass = (Class<T>) actualTypeArguments[0];
	}
	
	public void save(T entity) {
		this.getHibernateTemplate().save(entity);
	}
	
	public void delete(T entity) {
		this.getHibernateTemplate().delete(entity);
	}
	
	public void update(T entity) {
		this.getHibernateTemplate().update(entity);
	}

	public T findById(Serializable id) {
		return this.getHibernateTemplate().get(entityClass, id);
	}

	public List<T> findAll() {
		String hql = "FROM " + entityClass.getSimpleName();
		return (List<T>) this.getHibernateTemplate().find(hql);
	}

	//执行更新
	//queryName表示orm元数据配置文件中配置的HQL语句的名称。objects表示HQL语句中占位符?要填的参数。
	public void executeUpdate(String queryName, Object... objects) {
		Session session = this.getSessionFactory().getCurrentSession(); //获取与数据库的连接会话。
		//根据orm元数据配置文件中配置的HQL语句,获取Query对象。
		Query query = session.getNamedQuery(queryName);  //Query,用原生Hibernate的方法查询数据库。  
		int i = 0;
		for (Object object : objects) {
			//为HQL语句中的占位符?赋值
			query.setParameter(i++, object);
		}
		//执行更新
		query.executeUpdate();
	}
}

UserServiceImpl.java(Service层子类,调用Dao层操作数据库(测试HQL语句)):

package com.xxx.bos.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.xxx.bos.dao.IUserDao;
import com.xxx.bos.domain.User;
import com.xxx.bos.service.IUserService;
import com.xxx.bos.utils.MD5Utils;
@Service
@Transactional
public class UserServiceImpl implements IUserService{
	@Autowired
	private IUserDao userDao;

	/**
	 * 根据用户id修改密码
	 */
	public void editPassword(String id, String password) {
		//使用MD5加密密码
		password = MD5Utils.md5(password);
		//user.editpassword就是orm元数据配置文件中配置的HQL语句的名称。
		userDao.executeUpdate("user.editpassword", password,id);
	}
}

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/82589275