hibernate+spring架构有感
来源:互联网 发布:怎么避免mac涂层脱落 编辑:程序博客网 时间:2024/06/04 19:57
前言:
众所周知,一个web项目的架构非常重要,一个优秀的架构不仅让系统能够顺畅的运行,同时也能够极大的提高程序员对web工程的认知以及掌握。
架构分层:
一般来说一个学完Struts+Hibernate+Spring的人都能够说出来大致的框架,一般分为实体层: 叫做bean, model, domain等等,但是都代表着同一种意思,都是实体对象的象征。持久化接口层: 一般叫做Dao,这里面会把对数据库的一般操作抽象定义出来成为接口层(增删改查等等)。持久化实现层: 一般叫做DaoImpl,这里面会对接口层进行实现,负责真正的持久化访问功能。业务逻辑层:一般较作service层,业务逻辑层组件依赖于底层的Dao组件(也就是HIbernteaDao层),该层专注于提供业务逻辑功能,不涉及持久化访问。键值层: 一般较作vo层,亦或是dto曾,代表的是,该曾定义的对象,仅仅是作为数据传输所使用的。web层: 一般也就叫做web层,是前台访问与调用业务逻辑组件的地方,也是操作最为复杂的核心地带。这里完成前台的操作以及响应。之所以今天会写这篇博客,就是因为这个album的小项目对自己的架构概念有了新的感觉。可以很清楚的看到album包的分层。其中 Z喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmcuYWxidW0uYmVhbiC21NOm18XKtczlsuNvcmcuYWxidW0uc2VydmljZbbU06bXxdK1zvHC37ytsuO1xLPpz/OjrLb4b3JnLmFsYnVtLnNlcnZpY2UuaW1wbMrH0rXO8cLfvK2y47XE1ebV/cq1z9ZvcmcuYWx1Ym0udm+21NOm18W8/CYjMjA1NDA7suNvcmcuYWxidW0ud2VittTTptfFd2VisuNvcmcuY29tbW9uLmRhb7rNb3JnLmFsYnVtLmRhb7bU06bXxUhpYmVybmF0Zb3Tv9qy429yZy5jb21tb24uZGFvLmltcGy6zW9yZy5hbGJ1bS5kYW8uaW1wbLbU06bXxUhpYmVybnRhZbXEyrXP1rLjoaMg1eLA79Pryc/OxMu1tcTT0Mv5srvSu9bCo6zPws7Eu+G4+LP2y7XD96GjCgo8L2Jsb2NrcXVvdGU+CjxibG9ja3F1b3RlPgo8aDQ+PHN0cm9uZz631rLjtPrC68/qveKjujwvc3Ryb25nPjwvaDQ+CjxibG9ja3F1b3RlPgo8aDU+YmVhbrLjo7o8L2g1Pgo8L2Jsb2NrcXVvdGU+CjxibG9ja3F1b3RlPgo8YmxvY2txdW90ZT4KPHA+08nT2rn909q88rWlvs2yu9TZ1eLA78z5s/Y8L3A+CjwvYmxvY2txdW90ZT4KPGg1PrPWvsO7r7LjOjwvaDU+CjwvYmxvY2txdW90ZT4KPC9ibG9ja3F1b3RlPgo8YmxvY2txdW90ZT4KPGJsb2NrcXVvdGU+CjxibG9ja3F1b3RlPgo8cD4oMSm5stDUtcQ8YnI+CjwvcD4KPHA+1eLA76OsuPzOqrzyveC31sP3tcS9q7TLsuO31r3izqpjb21tb24uZGFvo6i0+rHtubLQ1NO109C1xKOpus1hbGJ1bS5kYW+jqLTLz+7Ev7WltsDTtdPQtcSjqTwvcD4Kb3JnLmNvbW1vbi5kYW8uQmFzZURhbyC0y7Lj1tCw/MCowctISWJlcm5hdGW21Mr9vt2/4rXEuPfW1rv5tKG1xLPWvsO7r7LZ1/ejrLT6wuvI58/CPHByZSBjbGFzcz0="brush:java;">/** * 通用DAO组件的接口,这七个通用方法是所有DAO组件都应该提供的 * @author administrator * */ public interface BaseDao { /** * 根据ID加载实体 * @param entityClazz 实体类 * @param entityId 实体ID */ T get(Class entityClazz, Serializable entityId); /** * 保存实体 * @param entity 实体 */ Serializable save(T entity); /** * 更新实体 * @param entity 实体 */ void update(T entity); /** * 删除实体 * @param entity 实体 */ void delete(T entity); /** * 根据ID删除实体 * @param entityClazz 实体类 * @param entityId 实体Id */ void delete(ClassentityClazz, Serializable entityId); /** * 根据ID数组删除实体 * @param entityClazz 实体类 * @param entityIds 实体Id数组 */ void delete(ClassentityClazz, Serializable[] entityIds); /** * 获取所有实体 * @param entityClazz 实体类 */ List getAll(Class entityClazz); /** * 获取实体总数 * @param entityClazz 实体类 * @return */ Long getCount(Class entityClazz); } 接下来是org.common.dao.impl.BaseDaoHibernate4,它是对各种操作的基础性的实现,以下是代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154/**
* 通用DAO组件的实现类
* @author administrator
*
* @param <t>
*/
public
class
BaseDaoHiberante4<t>
implements
BaseDao<t> {
/**
* DAO组件进行持久化操作底层依赖的sessionFactory组件
*/
private
SessionFactory sessionFactory;
/**
* 无参构造器
*/
public
BaseDaoHiberante4() {
// TODO Auto-generated constructor stub
}
@SuppressWarnings
(
"unchecked"
)
@Override
public
T get(Class<t> entityClazz, Serializable entityId) {
// TODO Auto-generated method stub
return
(T)
this
.getSessionFactory().getCurrentSession().get(entityClazz, entityId);
}
@Override
public
Serializable save(T entity) {
// TODO Auto-generated method stub
return
this
.getSessionFactory().getCurrentSession().save(entity);
}
@Override
public
void
update(T entity) {
// TODO Auto-generated method stub
this
.getSessionFactory().getCurrentSession().saveOrUpdate(entity);
}
@Override
public
void
delete(T entity) {
// TODO Auto-generated method stub
this
.getSessionFactory().getCurrentSession().delete(entity);
}
@Override
public
void
delete(Class<t> entityClazz, Serializable entityId) {
// TODO Auto-generated method stub
delete(entityClazz,
new
Serializable[]{entityId});
}
@Override
public
void
delete(Class<t> entityClazz, Serializable[] entityIds) {
// TODO Auto-generated method stub
// 遍历删除
for
(Serializable serializable : entityIds) {
delete(get(entityClazz, serializable));
}
}
@Override
public
List<t> getAll(Class<t> entityClazz) {
// TODO Auto-generated method stub
return
find(
"select en from "
+ entityClazz.getSimpleName() +
" en"
);
}
@SuppressWarnings
(
"rawtypes"
)
@Override
public
Long getCount(Class<t> entityClazz) {
// TODO Auto-generated method stub
List list = find(
"select count(*) from "
+ entityClazz.getSimpleName());
// 查询得到的实体总数,增加合法性的判断
if
(list !=
null
&& list.size() ==
1
) {
return
(Long)list.get(
0
);
}
return
(
long
)
0
;
}
/**
* 根据HQL语句查询实体
* @param hql
* @return
*/
@SuppressWarnings
(
"unchecked"
)
protected
List<t> find(String hql) {
return
(List<t>)
this
.getSessionFactory().getCurrentSession().createQuery(hql).list();
}
/**
* 根据带占位符参数HQL语句查询实体
* @param hql
* @param params
* @return
*/
@SuppressWarnings
(
"unchecked"
)
protected
List<t> find(String hql, Object...params){
// 创建查询
Query query =
this
.getSessionFactory().getCurrentSession().createQuery(hql);
// 为包含占位符的HQL语句设置参数
for
(
int
i =
0
, len = params.length; i < len ; i++) {
query.setParameter(i, params[i]);
}
return
(List<t>)query.list();
}
/**
* 使用HQL语句进行分页查询操作
* @param hql 需要查询的HQL语句
* @param pageNo 查询第pageNo页记录
* @param pageSize 每页需要显示的记录数
* @return
*/
@SuppressWarnings
(
"unchecked"
)
protected
List<t> findByPage(String hql,
int
pageNo,
int
pageSize) {
// 创建查询
return
this
.getSessionFactory().getCurrentSession().createQuery(hql).setFirstResult((pageNo -
1
) * pageSize).setMaxResults(pageSize).list();
}
/**
* 使用HQL语句进行分页查询操作
* @param hql 需要查询的HQL语句
* @param pageNo 查询第pageNo页记录
* @param pageSize 每页需要显示的记录数
* @param params 如果hql带占位符参数,params用于传入占位符
* @return
*/
@SuppressWarnings
(
"unchecked"
)
protected
List<t> findByPage(String hql,
int
pageNo,
int
pageSize, Object...params) {
// 创建查询
Query query =
this
.getSessionFactory().getCurrentSession().createQuery(hql);
for
(
int
i =
0
, len = params.length; i < len; i++) {
query.setParameter(i, params[i]);
}
// 执行分页,并返回查询结果
return
query.setFirstResult((pageNo -
1
) * pageSize).setMaxResults(pageSize).list();
}
public
SessionFactory getSessionFactory() {
return
sessionFactory;
}
public
void
setSessionFactory(SessionFactory sessionFactory) {
this
.sessionFactory = sessionFactory;
}
}
<pre
class
=
"brush:java;"
> 上述代码有过学习经验的都应该搞定,此处就不再详加解释</pre><br>
<pre
class
=
"brush:java;"
></pre>
</t></t></t></t></t></t></t></t></t></t></t></t></t></t></t>
(2)特殊性的
由于项目为alubm,为了更加贴合项目本身,又有了,org.album.dao和org.album.dao.impl,以下是代码
UserDao.java,仅仅是由于项目实际对其的接口进行乐扩充
接下来是,org.album.dao.impl.UserDaoHibernate.java1234567891011121314/**
* User的Dao
* @author administrator
*
*/
public
interface
UserDao
extends
BaseDao<user> {
/**
* 根据用户名查找用户
* @param name 需要查找的用户的用户名
* @return 查找到的用户
*/
User findByName(String name);
}</user>
12345678910111213141516171819/**
* UserDao组件的实现类代码
* @author administrator
*
*/
public
class
UserDaoHibernate
extends
BaseDaoHiberante4<user>
implements
UserDao{
@Override
public
User findByName(String name) {
// TODO Auto-generated method stub
List<user> users = find(
"select u from User u where u.name = ?"
, name);
if
(users !=
null
&& users.size() ==
1
) {
return
users.get(
0
);
}
return
null
;
}
}</user></user>
Service层:
在Service层中,也分为了,接口与实现的分开,更大限度的解偶,以下是org.album.service.AlbumService.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950/**
* 业务逻辑组件依赖于底层的DAO组件,由DAO组件负责提供持久化的访问功能
* ,而业务逻辑组件则专注于提供业务逻辑功能
* @author administrator
*
*/
public
interface
AlbumService {
/**
* 验证用户登录是否成功。
* @param name 登录的用户名
* @param pass 登录的密码
* @return 用户登录的结果,成功返回true,否则返回false
*/
boolean
userLogin(String name, String pass);
/**
* 注册新用户
* @param name 新注册用的用户名
* @param pass 新注册用户的密码
* @return 新注册用户的主键
*/
int
registUser(String name, String pass);
/**
* 添加照片
* @param user 添加相片的用户
* @param title 添加相片的标题
* @param fileName 新增相片在服务器上的名称
* @return 新添加相片的主键
*/
int
addPhoto(String user, String title, String fileName);
/**
* 根据用户获得该用户的所有相片
* @param user 当前用户
* @param pageNo 页码
* @return 返回属于该用户/指定页的相片
*/
List<photoholder> getPhotoByUser(String user,
int
pageNo);
/**
* 验证用户名是否可用,即数据库里是否已经存在该用户名
* @param name 需要校验的用户名
* @return 如果该用户名可用,返回true,否则返回false
*/
boolean
validateName(String name);
}
</photoholder>
接下来是对其的实现,AlbumServiceImpl.java123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120/**
* @author administrator
*
*/
public
class
AlbumServiceImpl
implements
AlbumService {
/**
* 业务组件所依赖的DAO组件
*/
private
UserDao userDao =
null
;
/**
* 业务组件所依赖的DAO组件
*/
private
PhotoDao photoDao =
null
;
@Override
public
boolean
userLogin(String name, String pass) {
try
{
// 使用UserDao根据用户名查询用户
User user = userDao.findByName(name);
if
(user !=
null
&& user.getPass().equals(pass)) {
return
true
;
}
return
false
;
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
throw
new
AlbumException(
"处理用户登录出现异常"
);
}
}
@Override
public
int
registUser(String name, String pass) {
// TODO Auto-generated method stub
try
{
// 创建一个新的User实例
User user =
new
User();
user.setName(name);
user.setPass(pass);
// 持久化数据
userDao.save(user);
return
user.getId();
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
throw
new
AlbumException(
"新用户注册出现异常"
);
}
}
@Override
public
int
addPhoto(String user, String title, String fileName) {
// TODO Auto-generated method stub
try
{
// 创建一个新的Photo实例
Photo photo =
new
Photo();
photo.setTitle(title);
photo.setFileName(fileName);
photo.setUser(userDao.findByName(user));
// 持久化Photo实例
photoDao.save(photo);
return
photo.getId();
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
throw
new
AlbumException(
"添加相片过程中出现异常!"
);
}
}
@Override
public
List<photoholder> getPhotoByUser(String user,
int
pageNo) {
// TODO Auto-generated method stub
try
{
List<photo> photos = photoDao.findByUser(userDao.findByName(user), pageNo);
List<photoholder> result =
new
ArrayList<photoholder>();
for
(Photo photo : photos) {
result.add(
new
PhotoHolder(photo.getTitle(), photo.getFileName()));
}
return
result;
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
throw
new
AlbumException(
"查询相片列表的过程中出现异常"
);
}
}
@Override
public
boolean
validateName(String name) {
// TODO Auto-generated method stub
try
{
// 根据用户名查询对应的User实例
User user = userDao.findByName(name);
if
(user !=
null
) {
return
false
;
}
return
true
;
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
throw
new
AlbumException(
"验证用户名是否存在的过程中出现异常"
);
}
}
public
UserDao getUserDao() {
return
userDao;
}
public
void
setUserDao(UserDao userDao) {
this
.userDao = userDao;
}
public
PhotoDao getPhotoDao() {
return
photoDao;
}
public
void
setPhotoDao(PhotoDao photoDao) {
this
.photoDao = photoDao;
}
}
</photoholder></photoholder></photo></photoholder>
键值层:
键值层仅仅是作为数据传输所使用的,以下是org.album.vo
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/**
* @author administrator
*
*/
public
class
PhotoHolder {
/**
* 相片的名称
*/
private
String title;
/**
* 相片在服务器上的文件名
*/
private
String fileName;
/**
* 无参构造器
*/
public
PhotoHolder(){
}
/**
* 初始化全部属性的构造器
* @param title
* @param fileName
*/
public
PhotoHolder(String title, String fileName) {
this
.title = title;
this
.fileName = fileName;
}
public
String getTitle() {
return
title;
}
public
void
setTitle(String title) {
this
.title = title;
}
public
String getFileName() {
return
fileName;
}
public
void
setFileName(String fileName) {
this
.fileName = fileName;
}
}
web层:
此处是,前台请求与业务逻辑交汇的地方。是业务逻辑的处理就不再贴出
0 0
- hibernate+spring架构有感
- Tapestry+spring+hibernate基本架构
- 用spring、Hibernate、Struts组建轻量级架构
- spring、Hibernate、Struts组建轻量级架构
- Struts+Spring+Hibernate开发环境架构配置
- 用spring、Hibernate、Struts组建轻量级架构
- Struts+Spring+Hibernate架构下的单元测试
- spring、Hibernate、Struts组建轻量级架构
- 用spring、Hibernate、Struts组建轻量级架构
- struts+spring+hibernate是怎样的架构?
- Flex+BlazeDS+Spring+Hibernate架构整合示例
- Struts+Spring+Hibernate+Aglets集成架构
- Spring+Struts2+Hibernate 架构分层原理说明
- Struts+Spring+Hibernate 的架构整合
- spring-ibatis-Struts-Hibernate 架构图
- Flex+BlazeDS+Spring+Hibernate架构整合示例
- spring-ibatis-Struts-Hibernate 架构图 .
- spring、Hibernate、Struts组建轻量级架构 .
- echart使用例子
- 测试题--by 罗雨屏
- Android-LinearGradient实现TextView字体渐变的效果
- windows 路由表
- 设计模式读书笔记-----访问者模式
- hibernate+spring架构有感
- 取剪贴板内容
- 数据结构整理_有序顺序表合并
- <img>元素底部留有空白
- iOS 图形库CorePlot
- Swift-字典
- iOS8 tableview separatorInset cell分割线左对齐,ios7的方法失效了
- Swift-元组tuple
- 文件存储的实现-login登录案例1-内置存储