基于spring jdbc的通用存取层
来源:互联网 发布:js srcelement 编辑:程序博客网 时间:2024/05/16 12:39
博主在spring jdbc的基础上封装了层数据库存取层,好处在于大部分的数据存取已经可以使用,单表编码几乎不用编码,并且支持数据库分页。
使用注解在实体描述数据库的情况,进而从程序员角度只看到对象而不需要写sql语句,也无需从结果集填充属性值到实体。
先介绍api:
Long
count(String sql, Object... values)
void
create(T t)
void
delete(String sql, Object... values)
void
delete(T t)
T
load(T t)
PageDto<T>
page(PageDto<T> pageDto, String sql, Object... values)
PageDto
中的ranges的数值来读取数据库数据List<T>
query(String sql, Object... values)
List<T>
queryAll()
T
queryById(Object key)
void
setInjectDataSource(DataSource dataSource)
Subclass call this method to inject
DataSource
.void
update(String sql, Object... values)
void
update(T t)
1 通用dao接口
import ifunsu.at.gmail.base.dao.BaseDao;
public interface InjectDataSourceDao<T> extends BaseDao<T>{
}
2 通用dao实现
import ifunsu.at.gmail.base.dao.BaseDaoImpl;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
public class InjectDataSourceDaoImpl<T> extends BaseDaoImpl<T>{
@Autowired
private DataSource dataSource;
@PostConstruct
public void buildDataSource() {
this.setInjectDataSource(dataSource);
}
}
=================================================
以上是为了引入dao所写的代码,每个项目都有这样两个文件。
=================================================
3 实体
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
@Entity
@Table(name="users")
public class PortalUser implements Serializable {
private static final long serialVersionUID = 192903603246880174L;
@Id
@Column(name = "username", length = 128, nullable = false)
private @Setter @Getter String username;
@Column(name = "password", length = 128, nullable = true)
private @Setter @Getter String password;
@Column(name = "enabled")
private @Setter @Getter boolean enabled;
}
上面的实体代码重点在于有@Table注解和@Id、@Column。
有table注解则知道表的名称,有column则知道表的字段名,有id则知道主键(支持多主键)。
4 实体dao接口
public interface PortalUserDao extends InjectDataSourceDao<PortalUser> {
}
可以看到无需写方法。
5 实体dao实现
import org.springframework.stereotype.Repository;
import com.highjet.portal.dao.entity.PortalUser;
import com.highjet.portal.dao.jdbc.PortalUserDao;
@Repository
public class PortalUserDaoImpl extends InjectDataSourceDaoImpl<PortalUser>
implements PortalUserDao {
}
可以看到实现也无需写方法。
6 service调用
public class PortalServiceImpl implements PortalService {
@Autowired
private @Setter PortalUserDao portalUserDao;
@Override
public PortalUser productPortalToken(String username, String token){
PortalUser portalUser = new PortalUser(username, token, true);
this.portalUserDao.update(portalUser);
return portalUser;
}
}
虽然PortalUserDao没写update方法,但是其父接口有,所以可以直接调用。
============================================================
以上即是使用方法,以下是分页代码。
============================================================
public class PageDto<T>extends Objectimplements Serializable
分页对象(page object)
缓存pageSize * pageSize个数的结果集典型用法:(Typical usage:)
PageDto page = new PageDto();
page.changePageSize(size);
page = this.service.search(page);
request.setAttribute("page", page, WebRequest.SCOPE_SESSION);
以上是读取一次放在session中。下面在分页时获取。(Above read and put into session. Below used when pageing.)
PageDto page = (PageDto) request.getAttribute("page", WebRequest.SCOPE_SESSION);
List list = page.getList(pageNumber);
if(list == null){
page = this.service.search(page);//读取的范围超过缓存需要向数据库重新读取。(Access database when read beyond ranges.)
}
request.setAttribute("page", page, WebRequest.SCOPE_SESSION);// 再放进session中保存。(Result into session again.)
后台数据库读取代码,通常与BaseDaoImpl
配合使用。(Codes at Dao. Use with BaseDaoImpl
.)PageDto page(PageDto pageDto, final String sql, final Object... objects);
void
alignList()
void
changePageSize(int pageSize)
Change page size will affect cache size.
List<T>
getList()
Load data from current page.
List<T>
getList(int currentPage)
Change current page and load data.
int[]
nextRanges()
Get next ResultSet ranges.
void
setResultSetList(int totalRecord, List<T> list, int[] ranges)
Set result after read data from database.
如果为自定义查询,则需要做些改变。
================================================================================
实体:
@Table(name="fakeTable")
public class Complex implements Serializable {
@Id
@Column(name = "fakeColumn", nullable = false)
private @Setter @Getter String id;
}
重点在于fakeTable和fakeColumn,系统检测到这两个关键字时则知道这是组合表的查询。
dao实现:
@Repository
public class ComplexDaoImpl extends InjectGreenPlumDataSourceDaoImpl<Complex>
implements ComplexDao {
@Override
public PageDto queryForList(PageDtopageDto) {
pageDto = this.page(pageDto, "select 语句", 可变条件参数);
condition.setPageDto(pageDto);
return condition;
}
}
重点在于select语句中的结果列名需要和实体名字一致,结果列数可以比实体个数多。
==============================================================================
以上为所有用法,附件是jar包,不开源但可以免费使用。
jar包下载
api下载
- 基于spring jdbc的通用存取层
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于JDBC的通用分页实现
- 基于jdbc 通用的增删改查
- 基于iBatis的通用持久层对象
- 基于iBatis的通用持久层对象
- 基于Mybatis的通用Service层实现
- Spring 基于JDBC的数据源
- Spring-JDBC通用Dao
- 设计、实现一个 Asp.Net 应用的通用数据存取层
- 设计、实现一个 Asp.Net 应用的通用数据存取层(二)
- 设计、实现一个 Asp.Net 应用的通用数据存取层(二)
- 基于spring创建通用的Mybatis类
- 创建基于.NET的通用数据库访问层
- gcc编译报错:程序中有游离的‘\357’‘\273’‘\277’等
- schedule vs scheduleAtFixedRate
- 第二题
- JS Dom操作总结
- 也谈谈程序员职业规划的几个问题:我的一些故事
- 基于spring jdbc的通用存取层
- 15第十四周项目二——用文件保存的学生名单
- HTML第二十节(CSS制作照片墙效果与瀑布流)
- 第一节:mybatis入门
- hdu 1086
- Unity教程之手把手教你实现动画Animation
- cocos2d的armature绑定到其他armature骨骼上的bug
- 南阳17 单调递增最长子序列
- 一致性hash算法详解