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