其實一直以來 我使用了 不少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; } }