一时兴起,自觉得是的对Jdbc访问框架作了一个简单的摸底,近期主要采用Mybatis,以前也有很多采用Dbutils,所以但愿能让这两个框架折腾的更好用。
DbUtils:很是简单的Jdbc访问框架,极为轻量级,对数据查询结果集转换成目标的对象或列表或其它集合结构作了很好的支持(xxHandler)。
Mybatis:ibatis(暂未使用过)的升级版,目前所知它至少有两个坑,其一是假分页(参考DefaultResultSetHandler的skipRows方法),其二是不能支持对象列表存储时对自增id字段的赋值(至少包括3.2.6和3.3.0版本)。java
mybatis分页组件(也支持排序,经过外置增长的排序和分页选项,在mapper文件中配置sql不包含排序):mybatis-paginationmysql
Dbutilsgit
Mybatisgithub
试想一下,当使用原生Jdbc执行SQL时,咱们但愿它有哪些feature呢?sql
除去标准SQL支持,不一样数据库的SQL语法略有差别(虽然知道的很少),好比分页,MySQL采用limit关键字支持,Oracle则采用rownum支持。数据库
方言枚举(目前仅支持MySQL和Oracle,其它的暂时用不到)express
package org.wit.ff.jdbc.dialect; /** * Created by F.Fang on 2015/11/19. */ public enum DialectType { MYSQL, ORACLE }
方言定义
请参考mybatis-pagination项目里关于方言的定义,此处就不引用他的代码了,请为他的Job增长人气。apache
请参考Mybatis的AbstractSQLBuilder和SQLBuilder数组
/* * Copyright 2009-2012 The MyBatis Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wit.ff.jdbc.sql; import org.wit.ff.jdbc.dialect.Dialect; public abstract class SQLBuilder extends AbstractSQLBuilder<SQLBuilder> { protected boolean paging; protected int offset; protected int pageSize; @Override public SQLBuilder getSelf() { return this; } protected abstract Dialect getDialect(); public SQLBuilder PAGE(int offset, int pageSize) { paging = true; // 这里做为底层接口不作任何检查,上层业务调用时检查. this.offset = offset; this.pageSize = pageSize; return this; } @Override public String toString() { if(paging){ return getDialect().getLimitString(super.toString(), offset, pageSize); }else{ return super.toString(); } } }
package org.wit.ff.jdbc.sql.db; import org.wit.ff.jdbc.dialect.Dialect; import org.wit.ff.jdbc.dialect.db.MySQLDialect; import org.wit.ff.jdbc.sql.SQLBuilder; /** * Created by F.Fang on 2015/2/16. * Version :2015/2/16 */ public class MySQLBuilder extends SQLBuilder { private Dialect dialect = new MySQLDialect(); @Override public Dialect getDialect() { return dialect; } }
package org.wit.ff.jdbc.sql.db; import org.wit.ff.jdbc.dialect.Dialect; import org.wit.ff.jdbc.dialect.db.OracleDialect; import org.wit.ff.jdbc.sql.SQLBuilder; /** * Created by F.Fang on 2015/11/20. */ public class OracleBuilder extends SQLBuilder { private Dialect dialect = new OracleDialect(); @Override public Dialect getDialect() { return dialect; } }
自定义接收主键数据的接口网络
package org.wit.ff.jdbc.id; /** * Created by F.Fang on 2015/2/16. * Version :2015/2/16 */ public interface IdGenerator { /** * 参数为数组的缘由是考虑联合主键,虽然暂时不会有对联合主键的支持. * @param value */ void parseGenKey(Object[] value); }
package org.wit.ff.jdbc.access; import org.wit.ff.jdbc.converter.ParamsConverter; import java.util.List; /** * Created by F.Fang on 2015/3/31. * 简单公共数据访问层. * Version :2015/3/31 */ public interface IDataAccessor { /** * 查询 * @param sql * @param resultType 对象类型 * @param <T> * @return */ <T> List<T> query(String sql, Class<T> resultType); /** * 查询,若是返回类型是具体类型,那么就采用 * @param sql 查询语句 * @param params 查询参数 * @param resultType 返回类型 * @param <T> * @return */ <T> List<T> query(String sql, Object[] params, Class<T> resultType); /** * insert 对象列表. * @param sql insert语句. * @param params 对象参数列表. * @param paramsType 参数类型. * @param converter 参数转换器. * @param <T> */ <T> void insert(String sql, List<T> params, Class<T> paramsType, ParamsConverter<T> converter); /** * insert batch. * @param sql * @param params */ void insert(String sql, Object[][] params); /** * single insert. * @param sql * @param params */ void insert(String sql, Object[] params); /** * batch update. * @param sql * @param params * @return */ int[] update(String sql, Object[][] params); /** * single update. * @param sql * @param params * @return */ int update(String sql, Object[] params); /** * 删除,删除可采用条件替代批量. * @param sql * @param params * @return */ int delete(String sql, Object[] params); }
package org.wit.ff.jdbc.converter; /** * Created by F.Fang on 2015/3/31. * 用于参数转换的接口. * Version :2015/3/31 */ public interface ParamsConverter<T> { Object[] convert(T obj); }
暂无(目前开源社区有大量的相关API)