IBaseDao:
public interface IBaseDao<T> {
public void add(T t);
public void delete(int id);
public void update(T t);
public T load(int id);
public List<T> list(String sql);
public List<T> list(String sql,Object[] args);
public List<T> list(String sql,Object args);
}
注意:(1).使用泛型实现增删改查,然后多写几个list方法,方便调用
BaseDao:
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{
private Class<T> clz;
@SuppressWarnings("unchecked")
public Class<T> getClz() {
if(clz==null) {
clz = ((Class<T>)
(((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]));
}
return clz;
}//获取泛型的class
public void setClz(Class<T> clz) {
this.clz = clz;
}
@Resource(name="sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
@Override
public void add(T t) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().save(t);
}
@Override
public void delete(int id) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().delete(this.load(id));
}
@Override
public void update(T t) {
// TODO 自动生成的方法存根
this.getHibernateTemplate().update(t);
}
@Override
public T load(int id) {
// TODO 自动生成的方法存根
return this.getHibernateTemplate().load(getClz(), id);
}
@Override
public List<T> list(String sql) {
// TODO 自动生成的方法存根
return list(sql, null);
}
@Override
public List<T> list(String sql, Object[] args) {
// TODO 自动生成的方法存根
@SuppressWarnings("unchecked")
Query<T> q=this.getSessionFactory().getCurrentSession().createQuery(sql);
for(int i=0;i<args.length;i++) {
q.setParameter(i, args[i]);
}
List<T> list=q.list();
return list;
}
@Override
public List<T> list(String sql, Object args) {
// TODO 自动生成的方法存根
return list(sql, new Object[] {args});
}
}
GroupHibernateDao:
@Repository("groupHibernateDao")
public class GroupHibernateDao extends BaseDao<Group> implements IGroupDao {
}
注意:(1).extends BaseDao<Group>就可以实现BaseDao中的方法了,然后implements IGroupDao,在IGoupDao补充一些非公用的方法
UserHibernateDao:
@Repository("userHibernateDao")
public class UserHibernateDao extends BaseDao<User> implements IUserDao {
@Override
public long getUserCountByGroup(int gid) {
// TODO 自动生成的方法存根
String sql="select count(*) from User where group.id = ?0";
long count=(Long)this.getSessionFactory().getCurrentSession().createQuery(sql).setParameter(0, gid).uniqueResult();
return count;
}
}
注意:(1).?后面要加一个索引
(2).返回的是Long类型
(3).取count最好使用uniqueResult
实体类Group:
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
注意:(1).@GeneratedValue(strategy(策略) = GenerationType(生成类型).IDENTITY)可以防止生成hibernate_sequence这个表
User:
@Entity
@Table(name="t_user")
public class User {
private int id;
private String username;
private String password;
private String nickname;
private Group group;
@ManyToOne
@JoinColumn(name="gid")
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public User(String username, String password, String nickname) {
super();
this.username = username;
this.password = password;
this.nickname = nickname;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public User() {
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", nickname=" + nickname
+ ", group=" + group + "]";
}
}
IUserService.:
public interface IUserService {
public void add(User user,int gid);
public void delete(int id);
public void update(User user);
public User load(int id);
public List<User> listAllUser();
public List<User> listByGroup(int gid);
}
IGroupService:
public interface IGroupService {
public void add(Group group);
public void delete(int id);
public void update(Group group);
public Group load(int id);
public List<Group> listAllGroup();
}
注意:(1).service层实现逻辑处理等,实现网页具体的功能,dao层只负责操作数据库方面的,逻辑判断这些交给service
GroupService:
@Service("groupService")
public class GroupService implements IGroupService {
private IGroupDao groupHibernateDao;
private IUserDao userHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
public IUserDao getUserHibernateDao() {
return userHibernateDao;
}
@Resource
public void setUserHibernateDao(IUserDao userHibernateDao) {
this.userHibernateDao = userHibernateDao;
}
@Override
public void add(Group group) {
// TODO 自动生成的方法存根
groupHibernateDao.add(group);
}
@Override
public void delete(int id) {
// TODO 自动生成的方法存根
long count=userHibernateDao.getUserCountByGroup(id);
if(count>0) {
throw new UserException("删除的组还有用户");
}
groupHibernateDao.delete(id);
}
@Override
public void update(Group group) {
groupHibernateDao.update(group);
}
@Override
public Group load(int id) {
// TODO 自动生成的方法存根
return groupHibernateDao.load(id);
}
@Override
public List<Group> listAllGroup() {
// TODO 自动生成的方法存根
return groupHibernateDao.list("from Group");
}
}
IUserService:
public interface IUserService {
public void add(User user,int gid);
public void delete(int id);
public void update(User user);
public User load(int id);
public List<User> listAllUser();
public List<User> listByGroup(int gid);
}
UserService:
@Service("userService")
public class UserService implements IUserService {
private IUserDao userHibernateDao;
private IGroupDao groupHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
public IUserDao getUserHibernateDao() {
return userHibernateDao;
}
@Resource
public void setUserHibernateDao(IUserDao userHibernateDao) {
this.userHibernateDao = userHibernateDao;
}
@Override
public void add(User user,int gid) {
// TODO 自动生成的方法存根
Group g=groupHibernateDao.load(gid);
if(g==null) {
throw new UserException("添加的用户组不存在!");
}
user.setGroup(g);
userHibernateDao.add(user);
}
@Override
public void delete(int id) {
// TODO 自动生成的方法存根
userHibernateDao.delete(id);
}
@Override
public void update(User user) {
// TODO 自动生成的方法存根
userHibernateDao.update(user);
}
@Override
public User load(int id) {
// TODO 自动生成的方法存根
return userHibernateDao.load(id);
}
@Override
public List<User> listAllUser() {
// TODO 自动生成的方法存根
return userHibernateDao.list("from User");
}
@Override
public List<User> listByGroup(int gid) {
// TODO 自动生成的方法存根
return userHibernateDao.list("from User where group.id=?", gid);
}
}
UserExceptiom:
public class UserException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 4047757718230572027L;
public UserException() {
super();
// TODO 自动生成的构造函数存根
}
public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO 自动生成的构造函数存根
}
public UserException(String message, Throwable cause) {
super(message, cause);
// TODO 自动生成的构造函数存根
}
public UserException(String message) {
super(message);
// TODO 自动生成的构造函数存根
}
public UserException(Throwable cause) {
super(cause);
// TODO 自动生成的构造函数存根
}
}
测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml")
public class TestService {
@Resource
private IUserService userService;
@Resource
private IGroupService groupService;
@Test
public void testAdd() {
Group group=new Group();
group.setName("testservice");
groupService.add(group);
User user=new User("testservice","testservice","testservice");
userService.add(user, group.getId());
}
@Test
public void testDelete() {
try {
groupService.delete(7);
} catch (UserException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
@Test
public void testUpdate() {
Group group=new Group();
group.setId(7);
group.setName("testserviceupdate");
groupService.update(group);
}
@Test
public void testLoad() {
Group g=groupService.load(7);
System.out.println(g);
}
}
项目结构图如下: