@Repository
public abstract class DaoTemplate{
protected abstract Session getSession();
private String type ;
public String getType() {
return type;
}
protected void setType(String type){
this.type = type ;
};
private void sqlQueryInit(SQLQuery sqlQuery , SQLParam sp){
String sql = sp.getSql().toString() ;
String[] para = sql.replace("," , "").split(" ") ;
String father = "" ;
List<String> columes = new ArrayList<String>() ;
for(String s : para){
if(s == null || s.trim().equals("")) continue ;
s = s.trim() ;
if(s.equals("as")){
father = "as" ;
}
else if(father.equals("as")){
columes.add(s) ;
father = s ;
}
}
for(String colume : columes) {
sqlQuery.addScalar(colume , StandardBasicTypes.STRING) ;
}
countQueryInit(sqlQuery , sp) ;
}
private void countQueryInit(SQLQuery sqlQuery , SQLParam sp){
for(Map.Entry<String , String> e : sp.getSetStrings().entrySet()){
sqlQuery.setString(e.getKey() , e.getValue()) ;
}
for(Map.Entry<String , Date> e : sp.getSetDates().entrySet()){
sqlQuery.setDate(e.getKey() , e.getValue()) ;
}
for(Map.Entry<String , Date> e : sp.getSetTimestamps().entrySet()){
sqlQuery.setTimestamp(e.getKey() , e.getValue()) ;
}
for(Map.Entry<String, Long> e : sp.getSetlongs().entrySet()){
sqlQuery.setLong(e.getKey() , e.getValue()) ;
}
for(Map.Entry<String, Integer> e : sp.getSetIntegers().entrySet()){
sqlQuery.setInteger(e.getKey() , e.getValue()) ;
}
}
public DataWrapper<List<Map<String , String>>> getBySQLParam(SQLParam sp){
DataWrapper<List<Map<String , String>>> retDw = new DataWrapper<List<Map<String , String>>>() ;
Session session = getSession() ;
SQLQuery query = session.createSQLQuery( sp.getQuerySql() ) ;
sqlQueryInit(query, sp) ;
if(sp.getNumberPerPage() > 0 && sp.getPageNumber() > 0){
query.setMaxResults(sp.getNumberPerPage()) ;
query.setFirstResult((sp.getPageNumber() - 1) * sp.getNumberPerPage()) ;
@SuppressWarnings("unchecked")
List<Map<String , String>> data = query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list() ;
if(data.size()==0||data==null){
data = new ArrayList<Map<String , String>>();
}
retDw.setData(data) ;
SQLQuery countQuery = session.createSQLQuery( sp.getCountSql() ) ;
countQueryInit(countQuery, sp) ;
int totalItemNum = 0;
if("pg".equals(getType())){
totalItemNum = ((java.math.BigInteger)countQuery.list().get(0)).intValue() ;
}else if("oracle".equals(getType())){
totalItemNum = ((java.math.BigDecimal)countQuery.list().get(0)).intValue() ;
}
int totalPageNum = DaoUtils.getTotalPageNumber(totalItemNum, sp.getNumberPerPage() ) ;
retDw.setTotalNumber(totalItemNum) ;
retDw.setTotalPage(totalPageNum) ;
retDw.setCurrentPage(sp.getPageNumber()) ;
retDw.setNumberPerPage(sp.getNumberPerPage()) ;
}
else{
@SuppressWarnings("unchecked")
List<Map<String , String>> data = query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list() ;
if(data.size()==0||data==null){
data = new ArrayList<Map<String , String>>();
}
retDw.setData(data) ;
}
return retDw ;
}
public Integer getCountBySQLParam(SQLParam sp){
Session session = getSession() ;
SQLQuery countQuery = session.createSQLQuery( sp.getCountSql() ) ;
countQueryInit(countQuery, sp) ;
return ((java.math.BigInteger)countQuery.list().get(0)).intValue() ;
}
public void save(Object entity) {
Session session = getSession();
try{
session.beginTransaction();
session.save(entity);
session.getTransaction().commit();
session.flush();
}catch(Exception e){
session.getTransaction().rollback();
}
}
public void delete(Object entity) {
Session session = getSession();
try{
session.beginTransaction();
session.delete(entity);
session.getTransaction().commit();
session.flush();
}catch(Exception e){
session.getTransaction().rollback();
}
}
}
@Service
public class OracleDao extends DaoTemplate{
@Autowired
@Resource(name="oracleSessionFactory")
protected SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
@PostConstruct
void init(){
super.setType("oracle") ;
}
}
@Service
public class PgDao extends DaoTemplate{
@Autowired
@Resource(name="pgSessionFactory")
protected SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
@PostConstruct
void init(){
super.setType("pg") ;
}
}
public class SQLParam{
private List<String> addScalars ;
private Map<String , String> setStrings ;
private Map<String , Date> setDates ;
private Map<String , Long> setLongs ;
private Map<String , Integer> setIntegers ;
private Map<String , Date> setTimestamps ;
private StringBuffer sql ;
private StringBuffer condition ;
private StringBuffer orderBy ;
private Integer numberPerPage ;
private Integer pageNumber ;
private String toCountTable ;
public SQLParam() {
addScalars = new ArrayList<String>() ;
setStrings = new HashMap<String , String>() ;
setDates = new HashMap<String , Date>() ;
setLongs = new HashMap<String , Long>() ;
setIntegers = new HashMap<String , Integer>() ;
setTimestamps = new HashMap<String , Date>() ;
sql = null ;
condition = null ;
orderBy = null ;
toCountTable = null ;
numberPerPage = -1 ;
pageNumber = -1 ;
}
public void addScalar(String... keys){
for(String key : keys)
addScalars.add(key) ;
}
public void setString(String key , String value){
setStrings.put(key, value) ;
}
public void setLong(String key , Long value){
setLongs.put(key, value) ;
}
public void setDate(String key , Date value){
setDates.put(key, value) ;
}
public void setInteger(String key , Integer value){
setIntegers.put(key, value) ;
}
public void setTimestamp(String key , Date value){
setTimestamps.put(key, value) ;
}
public Map<String, Date> getSetTimestamps() {
return setTimestamps;
}
public List<String> getAddScalars() {
return addScalars;
}
public Map<String, String> getSetStrings() {
return setStrings;
}
public Map<String, Long> getSetlongs() {
return setLongs ;
}
public Map<String, Integer> getSetIntegers() {
return setIntegers ;
}
public Map<String, Date> getSetDates() {
return setDates;
}
public void setSql(StringBuffer sql) {
this.sql = sql;
}
public StringBuffer getSql() {
return sql;
}
public void setCondition(StringBuffer condition) {
this.condition = condition;
}
public void setOrderBy(StringBuffer orderBy) {
this.orderBy = orderBy;
}
public Integer getNumberPerPage() {
return numberPerPage;
}
public void setNumberPerPage(Integer numberPerPage) {
this.numberPerPage = numberPerPage;
}
public Integer getPageNumber() {
return pageNumber;
}
public void setPageNumber(Integer pageNumber) {
this.pageNumber = pageNumber;
}
public String getToCountTable() {
return toCountTable;
}
public void setToCountTable(String toCountTable) {
this.toCountTable = toCountTable;
}
public String getQuerySql(){
return new StringBuffer( sql ).append( condition ).append( orderBy == null ? "" : orderBy ).toString() ;
}
public String getCountSql(){
if(toCountTable == null)
return new StringBuffer( "select count(1) " ).append( condition ).toString() ;
else
return new StringBuffer( "select count(" + toCountTable + ") " ).append( condition ).toString() ;
}
}