基于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);
    }
}

发布了21 篇原创文章 · 获赞 47 · 访问量 3920

猜你喜欢

转载自blog.csdn.net/richyliu44/article/details/104851498