基於Spring JDBC的ORM

前言

翻了以前搭的框架,發現了一套基於Spring JDBC寫的ORM。感覺很適合學習,跟大家分享一下。
1:代碼簡單,易懂。
2:功能應有盡有。包括增刪查改,分頁等。
3:底層使用的Spring JDBC,比較穩定,可以放心使用。
如果有不懂的地方,給我留言

代碼

實體註解

package jum.utility.Comments;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TableEntity {
    String tableName() default "";
}

主鍵註解

package jum.utility.Comments;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface TablePrimaryKey {
    String keyName() default "";
}

數據訪問層


import jum.model.Page;
import jum.utility.Comments.TableEntity;
import jum.utility.Comments.TablePrimaryKey;
import jum.utility.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.StringUtils;


public class BaseDAO<T> {

    /**
     * T 對應的類對象
     */
    private Class<T> entityClass;

    /**
     * spring jdbcTemplate 對象
     */
    @Autowired
     protected NamedParameterJdbcTemplate jdbcTemplate;

    /**
     * 表名
     */
    private String tableName = "";
    /*主鍵名稱(DB 對應的列名稱)*/
    private String primaryKey = "";
    /*主鍵對應的T字段名稱*/
    private  String idFieldName ="";
    /*T的字段的List*/
    private List<Field> filedList =null;

    protected String getTableName ()
    {
        if(StringUtils.isEmpty(tableName)) {
            TableEntity tableEntity = entityClass.getAnnotation(TableEntity.class);
            if(tableEntity!=null )
            {
                tableName= tableEntity.tableName();
            }
        }
        return tableName;

    }

    /**
     * 主健字段名
     */

    protected String getPrimaryKey()
    {
        if(StringUtils.isEmpty(primaryKey)) {

           primaryKey=getColumnName(getIdFieldName());

        }
        return primaryKey;
    }


    private  String getIdFieldName()
    {
        if(StringUtils.isEmpty(idFieldName)) {

            Field[] fields= entityClass.getDeclaredFields();
            for(Field field :fields)
            {
                TablePrimaryKey key= field.getAnnotation(TablePrimaryKey.class);
                if(key !=null)
                {
                    idFieldName=field.getName();
                    break;
                }
            }
        }
      return  idFieldName;
    }

    protected List<Field> getFieldList() {

        if(filedList==null) {

            filedList =new ArrayList<Field>();

            Field[] fields= entityClass.getDeclaredFields();
            for(Field field :fields)
            {
                filedList.add(field);
            }
        }
        return  filedList;
    }

    /**
     * 通過屬性獲取表字段
     *
     * @param field
     * @return
     */
    protected static String getColumnName(String field) {
        if (StringUtils.isEmpty(field))
            return "";
        else {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < field.length(); i++) {
                char temp = field.charAt(i);
                if ((temp >= 'A') && (temp <= 'Z')) {
                    sb.append("_").append((char) (temp + 32));
                } else {
                    sb.append(temp);
                }

            }
            return sb.toString();
        }
    }

    protected  String getIdsCondition(String pids)
    {
        String[] idArray = pids.split(",");
        String idsN = null;
        for (String id : idArray) {
            if (idsN == null) {
                idsN = "'" + id + "'";
            } else {
                idsN = idsN + "," + "'" + id + "'";
            }
        }
        return idsN;
    }

    @SuppressWarnings("unchecked") // 作用:用於抑制編譯器產生警告信息
    public BaseDAO() {
        Type superclass = getClass().getGenericSuperclass();
        ParameterizedType type = (ParameterizedType) superclass;
        entityClass = (Class<T>) type.getActualTypeArguments()[0];

    }

    private String getInsertSql(Map<String, Object> paramMap) {
        StringBuffer sql = new StringBuffer();
        sql.append(" INSERT INTO " + getTableName());
        sql.append("(");
        for (int i = 0; this.getFieldList() != null && i < getFieldList().size(); i++) {
            getFieldList().get(i).setAccessible(true); // 暴力反射
            String column = getColumnName(this.getFieldList().get(i).getName());
            Object object = paramMap.get((Object) this.getFieldList().get(i).getName());
            if (object != null && !object.equals(""))
                sql.append(column).append(",");
        }
        sql = sql.deleteCharAt(sql.length() - 1);
        sql.append(") VALUES (");
        for (int i = 0; getFieldList() != null && i < getFieldList().size(); i++) {
            Object object = paramMap.get((Object) getFieldList().get(i).getName());
            if (object != null && !object.equals(""))
                sql.append(":" + getFieldList().get(i).getName() + ",");
            //sql.append("?,");
        }
        sql = sql.deleteCharAt(sql.length() - 1);
        sql.append(")");
        return sql.toString();
    }

    private String getUpdateSql(Map<String, Object> paramMap) {
        StringBuffer sql = new StringBuffer();
        sql.append(" update " + getTableName() + " set ");
        for (int i = 0; getFieldList() != null && i < getFieldList().size(); i++) {
            getFieldList().get(i).setAccessible(true); // 暴力反射
            String field = getFieldList().get(i).getName();
            String column = getColumnName(field);
            Object object = paramMap.get((Object) field);
            if (object != null && !field.equals(getPrimaryKey())) {
                sql.append(column).append("=:").append(field).append(",");
            }

        }
        sql = sql.deleteCharAt(sql.length() - 1);
        sql.append(" where 1=1 and ").append(getPrimaryKey()).append("=:").append(getIdFieldName());
        return sql.toString();
    }

    private String getSelectSql(Map<String,Object> paramMap) {
        StringBuilder sql =new StringBuilder("");
        sql.append("select * from ").append(getTableName());
        sql.append(" where 1=1 ");

        for (int i=0;i<getFieldList().size();i++)
        {
            getFieldList().get(i).setAccessible(true);
            String field = getFieldList().get(i).getName();
            String column = getColumnName(field);
            Object object = paramMap.get((Object) field);
            if (object != null) {
                sql.append(" and ").append(column).append("=:").append(field);
            }
        }
        return sql.toString();
    }

    public T find(String id) {
        StringBuffer sql = new StringBuffer("select *  from ");
        sql.append(getTableName()).append(" where ").append(this.getPrimaryKey()).append(" =:").append(getIdFieldName());

        Map<String,Object> map =new HashMap<String,Object>();
        map.put(getIdFieldName(),id);
        List<T> list = jdbcTemplate.query(sql.toString(), map,
                new BeanPropertyRowMapper<T>(entityClass));
        if (list!=null && list.size()>0) {
            return list.get(0);
        }
        return null;
    }

    public List<T> getList(T entity) throws IllegalAccessException {
        Map<String,Object> paras= MapUtils.objectToMap(entity);
        String strSql= getSelectSql(paras);
        List<T> list = jdbcTemplate.query(strSql,paras, new BeanPropertyRowMapper<T>(entityClass));
        return  list;

    }

    public int insert(T entity) throws IllegalArgumentException, IllegalAccessException {
        Map<String, Object> paramMap = MapUtils.objectToMap(entity);
        String sql = getInsertSql(paramMap);
        //log.debug(sql);
        return jdbcTemplate.update(sql, paramMap);

    }

    private String getBathInsertSql(Map<String, Object> paramMap) {
        StringBuffer sql = new StringBuffer();
        sql.append(" INSERT INTO " + tableName);
        sql.append("(");
        for (int i = 0; filedList != null && i < filedList.size(); i++) {
            filedList.get(i).setAccessible(true); // 暴力反射
            String column = getColumnName(filedList.get(i).getName());
            Object object = paramMap.get((Object) filedList.get(i).getName());
            if (object != null)
                sql.append(column).append(",");
        }
        sql = sql.deleteCharAt(sql.length() - 1);
        sql.append(") VALUES (");
        for (int i = 0; filedList != null && i < filedList.size(); i++) {
            Object object = paramMap.get((Object) filedList.get(i).getName());
            if (object != null)
                sql.append(":" + filedList.get(i).getName() + ",");
        }
        sql = sql.deleteCharAt(sql.length() - 1);
        sql.append(")");
        return sql.toString();
    }

    public int update(T entity) throws IllegalArgumentException, IllegalAccessException {
        Map<String, Object> paramMap = MapUtils.objectToMap(entity);
        String sql = getUpdateSql(paramMap);

       return jdbcTemplate.update(sql, paramMap);
    }

    public int[] batchUpdate(List<T> entityList) {
        Map<String, Object>[] batchValues = MapUtils.objListToMapArray(entityList);
        String sql = getUpdateSql(batchValues[0]);

        return jdbcTemplate.batchUpdate(sql, batchValues);
    }


    public int delete(String pids) {
        if (StringUtils.isEmpty(pids)) {
            return 0;
        }
        String[] idArray = pids.split(",");
        String idsN = null;
        for (String id : idArray) {
            if (idsN == null) {
                idsN = "'" + id + "'";
            } else {
                idsN = idsN + "," + "'" + id + "'";
            }
        }
        StringBuffer sql = new StringBuffer("delete from " + getTableName() + " where "+getPrimaryKey()+" in (");
        sql.append(idsN).append(")");
        Map<String, Object> paramMap = new HashMap<String, Object>();

        //log.debug(sql.toString());
        return jdbcTemplate.update(sql.toString(), paramMap);

    }


    public int delete(String keyName, String pids) {
        if (StringUtils.isEmpty(pids)) {
            return 0;
        }
        String[] idArray = pids.split(",");
        String idsN = null;
        for (String id : idArray) {
            if (idsN == null) {
                idsN = "'" + id + "'";
            } else {
                idsN = idsN + "," + "'" + id + "'";
            }
        }
        StringBuffer sql = new StringBuffer("delete from " + getTableName() + " where "+keyName+" in (");
        sql.append(idsN).append(")");
        Map<String, Object> paramMap = new HashMap<String, Object>();

        //log.debug(sql.toString());
        return jdbcTemplate.update(sql.toString(), paramMap);

    }


    public Page<T> getPage(T entity,int pageIndex, int pageSize) throws IllegalAccessException {
        Map<String,Object> paras= MapUtils.objectToMap(entity);
        String strSql= getSelectSql(paras);
        return  getPage(strSql,paras,pageIndex,pageSize);

    }

    public Page<T> getPage(String strSql,Map<String,Object> pars,int pageIndex, int pageSize) throws IllegalAccessException
    {
        if(pageIndex<=0)
            throw new IllegalAccessException("pageIndex必須大於0");
        if(pageSize<=0)
            throw  new IllegalAccessException("pageSize必須大於0");

        Page<T> page =new Page<T>();
        String strSql1="select *  from (" +strSql +" ) as t limit " +  (pageIndex-1)*pageSize + "," +pageSize *pageIndex  ;
        page.setLst(jdbcTemplate.query(strSql1,pars, new BeanPropertyRowMapper<T>(entityClass)));
        String strSql2= "select count(1) as ac from (" +strSql +" ) as t " ;
        Integer recordCount = jdbcTemplate.queryForObject(strSql2,pars, Integer.class );
        page.setPageCount( (int)recordCount/pageSize +1);
        page.setPageIndex(pageIndex);
        page.setPageSize(pageSize);
        return page;
    }
}

分頁實體層

package jum.model;

import java.util.List;

public class Page<T> {

    private List<T> lst;
    private Integer pageIndex;
    private Integer pageSize;

    private Integer pageCount;



    public List<T> getLst() {
        return lst;
    }

    public void setLst(List<T> lst) {
        this.lst = lst;
    }

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    public Integer getPageCount() {
        return pageCount;
    }

    public void setPageCount(Integer pageCount) {
        this.pageCount = pageCount;
    }
}

應用

只要自己寫個實體層和一個DAO 繼承 BaseDAO,就可以實現增刪查改等功能,還有分頁
下面是實例。

Entity


package jum.model;


import jum.utility.Comments.TableEntity;
import jum.utility.Comments.TablePrimaryKey;
import org.springframework.stereotype.Component;

@Component
@TableEntity( tableName = "um_user")
    public class User {

    @TablePrimaryKey(keyName = "USER_ID")
    private String userId;
    private String loginId;
    private String pwd;
    private String userName;
    private String email;
    private String mobile;
    private Integer isSupperAdmin;
    private Integer status;
    private  String telephone;
    private  String loginError;
    public String getUserId() {
        return userId;
    }
    public void setUserId(String useId) {
        this.userId = useId;
    }
    public String getLoginId() {
        return loginId;
    }
    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public Integer getIsSupperAdmin() {
        return isSupperAdmin;
    }
    public void setIsSupperAdmin(Integer supperAdmin) {
        isSupperAdmin = supperAdmin;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
    public String getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
    public String getLoginError() {
        return loginError;
    }
    public void setLoginError(String loginError) {
        this.loginError = loginError;
    }
}

DAO

package jum.dao;
import jum.model.Page;
import jum.model.User;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

import org.springframework.util.StringUtils;
@Component
public class UserDAO extends  BaseDAO<User> {
    public Page<User> getUsers(String userName, String loginId, Integer pageIndex, Integer pageSize) throws IllegalAccessException {
        String strsql ="select * from um_user where 1=1 ";
        Map<String,Object> map =new HashMap<String,Object>();
        if(!StringUtils.isEmpty(userName))
        {
            strsql +=" and user_name like '%' :user_name '%' ";
            map.put("user_name",userName);
        }
        if(!StringUtils.isEmpty(loginId))
        {
            strsql +=" and login_id like '%' :login_id '%'";
            map.put("login_id",loginId);
        }
         return this.getPage(strsql,map,pageIndex,pageSize);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章