Spring Jdbc 泛型使用

其實一直以來 我使用了 不少hibernate mybatis 都挺簡單,可是性能 方面 一直感受通常般,我的偏向使用原生的jdbc 其實寫起來 也挺簡單的,當能力跨越了這一個層次的時候 ,這些mybatis hibernate 其實並不那麼重要了 我其實也再也不戶什麼框架不框架了 ,這裏分享一個我經常使用的jdbc的類 。這是我去年一直使用的類,最開始在一個博客上收集的一個,可是缺乏了 不少類,因而我本身補全了 全部的類,使用jdbc 原生類 jdbcTemplate性能 速度 仍是很好的。我不太喜歡 mybatis 雖然mybatis mybatis 當類太多 mapper.xml太多的時候閱讀起來很煩的。java




1.BASEDAO
spring

/**
 * 
 * 
 * @zhuyuping
 * @2014-3-30      
 * @doc:
 */
public abstract class BaseDao<T>  {
	/** 具體操做的實體類對象 */
    private Class<T>       entityClass;

    /** 名稱加工處理器 */
    private NameHandler    nameHandler;
	/**
	 * jdbcTemplate
	 */
	@Resource
	protected JdbcTemplate jdbcTemplate;
	/**
	 * nameJdbcTemplate
	 */
	@Resource
	protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    /**
     * 構造方法,獲取運行時的具體實體對象
     */
    public BaseDao() {
        Type superclass = getClass().getGenericSuperclass();
        ParameterizedType type = (ParameterizedType) superclass;
        entityClass = (Class<T>) type.getActualTypeArguments()[0];
    }

    /**
     * 獲取實際運行時的名稱處理器
     *
     * @return
     */
    private NameHandler getActualNameHandler() {
        if (nameHandler == null) {
            synchronized (this) {
                if (nameHandler == null) {
                    nameHandler = this.getNameHandler();
                }
            }
        }
        return nameHandler;
    }

    /**
     * 獲得名稱處理器,子類覆蓋此方法實現本身的名稱轉換處理器
     *
     * @return
     */
    protected NameHandler getNameHandler() {
        return new DefaultNameHandler();
    }

    /**
     * 插入一條記錄
     *
     * @param entity
     */
    public Long insert(T entity) {
        final SqlContext sqlContext = SqlUtils.buildInsertSql(entity, this.getActualNameHandler());
       
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                PreparedStatement ps = con.prepareStatement(sqlContext.getSql().toString(),
                    new String[] { sqlContext.getPrimaryKey() });
                int index = 0;
                for (Object param : sqlContext.getParams()) {
                    index++;
                    ps.setObject(index, param);
                }
                return ps;
            }
        }, keyHolder);
        return keyHolder.getKey().longValue();
    }

    /**
     * 更新記錄
     * 
     * @param entity
     */
    public void update(T entity) {
        SqlContext sqlContext = SqlUtils.buildUpdateSql(entity, this.getActualNameHandler());
        jdbcTemplate.update(sqlContext.getSql().toString(), sqlContext.getParams().toArray());
    }

    /**
     * 刪除記錄
     *
     * @param id
     */
    public void delete(Serializable id) {
        String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName());
        String primaryName = this.getNameHandler().getPrimaryName(entityClass.getSimpleName());
        String sql = "DELETE FROM " + tableName + " WHERE " + primaryName + " = ?";
        jdbcTemplate.update(sql, id);
    }

    /**
     * 刪除全部記錄
     */
    public void deleteAll() {
        String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName());
        String sql = " TRUNCATE TABLE " + tableName;
        jdbcTemplate.execute(sql);
    }

    /**
     * 獲得記錄
     *
     * @param id
     * @return
     */
    public T getById(Serializable id) {
        String tableName = this.getNameHandler().getTableName(entityClass.getSimpleName());
        String primaryName = this.getNameHandler().getPrimaryName(entityClass.getSimpleName());
        String sql = "SELECT * FROM " + tableName + " WHERE " + primaryName + " = ?";
        return (T) jdbcTemplate.query(sql,
            new DefaultRowMapper(entityClass, this.getActualNameHandler()), id).get(0);
    }

    /**
     * 查詢全部記錄
     * 
     * @return
     */
    public List<T> findAll() {
        String sql = "SELECT * FROM "
                     + this.getActualNameHandler().getTableName(entityClass.getSimpleName());
        return (List<T>) jdbcTemplate.query(sql,
            new DefaultRowMapper(entityClass, this.getActualNameHandler()));
    }

    /**
     * 查詢記錄數
     * 
     * @param entity
     * @return
     */
    public int queryCount(T entity) {
        String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName());
        StringBuilder countSql = new StringBuilder("select count(*) from ");
        countSql.append(tableName);
        SqlContext sqlContext = SqlUtils.buildQueryCondition(entity, this.getActualNameHandler());
        if (sqlContext.getSql().length() > 0) {
            countSql.append(" where ");
            countSql.append(sqlContext.getSql());
        } 
        return jdbcTemplate.queryForObject(countSql.toString(), sqlContext.getParams().toArray(),Integer.class);
       
    }

   /* *//**
     * 查詢分頁列表
     * 
     * @param entity
     * @return
     *//*
    public Pager queryPageList(T entity) {
        Pager pager = new Pager();
        PagingOrder pagingOrder = (PagingOrder) entity;
        pager.setCurPage(pagingOrder.getCurPage());
        pager.setItemsPerPage(pagingOrder.getItemsPerPage());

        String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName());
        String primaryName = this.getActualNameHandler()
            .getPrimaryName(entityClass.getSimpleName());
        StringBuilder querySql = new StringBuilder("select * from ");
        StringBuilder countSql = new StringBuilder("select count(*) from ");
        querySql.append(tableName);
        countSql.append(tableName);
        //不調用queryCount方法,條件共同組裝一次,減小反射獲取的次數
        SqlContext sqlContext = SqlUtils.buildQueryCondition(entity, this.getActualNameHandler());
        if (sqlContext.getSql().length() > 0) {
            querySql.append(" where ");
            countSql.append(" where ");
            querySql.append(sqlContext.getSql());
            countSql.append(sqlContext.getSql());
        }
        querySql.append(" order by ");
        querySql.append(primaryName);
        querySql.append(" desc ");
        querySql.append("limit ?,?");
        List<Object> queryParams = new ArrayList<Object>(sqlContext.getParams());
        queryParams.add(pager.getBeginIndex());
        queryParams.add(pager.getItemsPerPage());

        List<T> list = (List<T>) jdbcTemplate.query(querySql.toString(), queryParams.toArray(),
            new DefaultRowMapper(entityClass, this.getActualNameHandler()));

        int totalCount = jdbcTemplate.queryForInt(countSql.toString(), sqlContext.getParams()
            .toArray());
        pager.setList(list);
        pager.setItems(totalCount);
        return pager;
    }*/

}

2.NameHandlersql

/**
 * 把 駝峯法 改爲 下劃線 model userName -----> db user_name
 * 
 * @zhuyuping
 * @2015-3-30      
 * @doc:
 */
public class DefaultNameHandler implements NameHandler {


   

    /**
     * 根據實體名獲取表名
     *
     * @param entityName
     * @return
     */
    @Override
    public String getTableName(String entityName) {
        //Java屬性的駱駝命名法轉換回數據庫下劃線「_」分隔的格式
        return ColumnFormatUtil.underLineName(entityName);
    }

    /**
     * 根據表名獲取主鍵名
     *
     * @param entityName
     * @return
     */
    @Override
    public String getPrimaryName(String entityName) {
//        String underlineName = ColumnFormatUtil.underLineName(entityName);
//        //正如前面說到的,數據庫列名統一以「_」開始,主鍵以表名加上「_id」 如user表主鍵即「_user_id」
//        return  underlineName + PRI_SUFFIX;
    	return "id";
    }

    /**
     * 根據屬性名獲取列名
     *
     * @param fieldName
     * @return
     */
    @Override
    public String getColumnName(String fieldName) {
        String underlineName = ColumnFormatUtil.underLineName(fieldName);
        
        return  underlineName;
    }
    public static void main(String[] args) {
		System.out.println("DefaultNameHandler.main()"+new DefaultNameHandler().getColumnName("userName"));
		System.out.println("DefaultNameHandler.main()"+new DefaultNameHandler().getTableName("userName"));
	
	}
    
}

 3.Mapper數據庫

  

import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.zsuper.base.utils.ClassUtils;


/**
 * 
 * 
 * @zhuyuping
 * @2014-3-30      
 * @doc:通用映射器
 */
public class DefaultRowMapper implements RowMapper<Object> {

    /** 轉換的目標對象 */
    private Class<?>    clazz;

    /** 名稱處理器 */
    private NameHandler nameHandler;

    public DefaultRowMapper(Class<?> clazz, NameHandler nameHandler) {
        this.clazz = clazz;
        this.nameHandler = nameHandler;
    }

    @Override
    public Object mapRow(ResultSet resultSet, int i) throws SQLException {
        Object entity = ClassUtils.newInstance(this.clazz);
        BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(this.clazz);
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            String column = nameHandler.getColumnName(pd.getName());
            Method writeMethod = pd.getWriteMethod();
            if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                writeMethod.setAccessible(true);
            }
            try {
                writeMethod.invoke(entity, resultSet.getObject(column));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return entity;
    }
}

  4。Jdbcmybatis

   

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.zsuper.base.utils.SqlUtils;


public  class JdbcExector  {
	/** 具體操做的實體類對象 */

    /** 名稱加工處理器 */
    private NameHandler    nameHandler;

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

    /**
     * 構造方法,獲取運行時的具體實體對象
     */
    public JdbcExector() {
    }

    /**
     * 獲取實際運行時的名稱處理器
     *
     * @return
     */
    private NameHandler getActualNameHandler() {
        if (nameHandler == null) {
            synchronized (this) {
                if (nameHandler == null) {
                    nameHandler = this.getNameHandler();
                }
            }
        }
        return nameHandler;
    }

    /**
     * 獲得名稱處理器,子類覆蓋此方法實現本身的名稱轉換處理器
     *
     * @return
     */
    protected NameHandler getNameHandler() {
        return new DefaultNameHandler();
    }

    /**
     * 插入一條記錄
     *
     * @param entity
     * @throws Exception 
     * @throws IllegalArgumentException 
     */
    public <T> Long insert(T entity) throws Exception {
        final SqlContext sqlContext = SqlUtils.buildInsertSql(entity, this.getActualNameHandler());
        System.out.println(entity+"==="+sqlContext.getSql());
        /*KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                PreparedStatement ps = con.prepareStatement(sqlContext.getSql().toString(),
                    new String[] { sqlContext.getPrimaryKey() });
                int index = 0;
                for (Object param : sqlContext.getParams()) {
                    index++;
                    ps.setObject(index, param);
                }
                return ps;
            }
        }, keyHolder);
        return keyHolder.getKey().longValue();*/
        return null;
    }

    
    public static void main(String[] args) throws Exception {
		//new JdbcExector().insert(TestUser.class);
    	TestUser testUser=new TestUser();
    	testUser.setAge(22);
    	testUser.setCnName("xxx");
    	testUser.setTestUserId(1);
    	SqlContext context=SqlUtils.buildUpdateSql(testUser, new DefaultNameHandler());
    	System.out.println("JdbcExector.main()         "+context.getSql());
	}
   
}
5.SqlContext

/**
 * 
 * 
 * @zhuyuping
 * @2014-3-30      
 * @doc:sql 上下文 
 */
public class SqlContext {

    public StringBuilder getSql() {
		return sql;
	}

	public void setSql(StringBuilder sql) {
		this.sql = sql;
	}

	public String getPrimaryKey() {
		return primaryKey;
	}

	public void setPrimaryKey(String primaryKey) {
		this.primaryKey = primaryKey;
	}

	public List<Object> getParams() {
		return params;
	}

	public void setParams(List<Object> params) {
		this.params = params;
	}

	/** 執行的sql */
    private StringBuilder sql;

    /** 主鍵名稱 */
    private String        primaryKey;

    /** 參數,對應sql中的?號 */
    private List<Object>  params;

    public SqlContext(StringBuilder sql, String primaryKey, List<Object> params) {
        this.sql = sql;
        this.primaryKey = primaryKey;
        this.params = params;
    }

}
相關文章
相關標籤/搜索