使用mybatis拦截器做分表,mybatis与postgres josnb 数据类型映射
2017-03-23 22:59
169 查看
使用mybatis做分表很方便,即使用拦截器即可。
分表步骤如下使用注解做分表标示
抽取分表接口
自定义分表策略实现分表接口
编写拦截器
使用jsqlparser 安全替换表名
mybatis和postgres jsonb 类型映射步骤
编写JSONTypeHandler转换器
注册到全局Aliase
注册到TypeHandlers
实体json串使用Object 对象
mapper.xml文件中的配置使用
分表核心代码
注解:TableSplit.java/** * * @author xielongwang * * 标注是否需要分表 */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE }) public @interface TableSplit { // 是否分表 public boolean split() default true; // 表名 public String value(); // 获取分表策略 public String strategy(); public String ShardColumn(); }
分表接口:Strategy.java
/** * * @author xielong.wang * 分表接口 */ public interface Strategy { /** * 传入原sql 返回分表后的sql * @param tableName 基本表名 * @param sharedColumn 分表key的值 * @return */ String convert2( String tableName, Object sharedColumn); }
分表策略:DeviceHashStrategy.java
/** * * @author xielong.wang * * 具体的分表策略 */ public class DeviceHashStrategy implements Strategy{ /** * 根据分表键和算法返回相应的表名 * * @param baseTableName 原表名 * @param sharedKeyValue 分表键的值 * @return 转换后的表名 */ @Override public String convert2(String baseTableName, Object sharedKeyValue) { //生成表名 return hashTableAlgorithm(baseTableName,sharedKeyValue); } private String hashTableAlgorithm(String baseTableName, Object sharedKeyValue) { String hashKey = hashAlgorithm((String) sharedKeyValue); if (hashKey!=null){ return baseTableName+hashKey; } return baseTableName; } public static String hashAlgorithm(String sharedKeyValue) { int last= sharedKeyValue.hashCode()%5; return String.valueOf(last); } }
策略管理:StrategyManager.java
@Component public class StrategyManager { private Map<String,DeviceHashStrategy> strategies=new HashMap<String,DeviceHashStrategy>(); public Map<String, DeviceHashStrategy> getStrategies() { return strategies; } public void setStrategies(Map<String, DeviceHashStrategy> strategies) { this.strategies = strategies; } public Strategy getStrategy(String strategy) { return this.strategies.get(strategy); } }
以上为分表的核心代码。下面是postgres jsonb类型映射
类型映射器:JSONTypeHandler.java
/** * @author xielongwang * @create 2017-03-22 下午4:02 * @email xielong.wang@nvr-china.com */ @MappedJdbcTypes(JdbcType.OTHER) // 可有可无 @MappedTypes(Object.class) public class JSONTypeHandler extends BaseTypeHandler<Object> { private static final PGobject jsonObject = new PGobject(); @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { jsonObject.setType("jsonb"); jsonObject.setValue(parameter.toString()); ps.setObject(i, jsonObject); } @Override public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); } @Override public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } @Override public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } }
配置类型转换器
sqlSessionFactoryBean.setTypeAliasesPackage("org.gpstable.domain,org.gpstable.utils"); sqlSessionFactoryBean.setTypeHandlersPackage("org.gpstable.utils");
mapper.xml
<resultMap id="deviceEntity" type="org.gpstable.domain.Device" autoMapping="true"> <id property="id" column="id" javaType="Long"/> <result property="deviceNum" column="device_num" javaType="String"/> <result property="sensorData" column="sensor_data" javaType="Object" jdbcType="OTHER" typeHandler="JSONTypeHandler"/> </resultMap> <insert id="insert2" parameterType="org.gpstable.domain.Device" > insert into device (id,device_num,sensor_data) values(nextval('device_share_seq'),#{deviceNum},#{sensorData,javaType=Object,jdbcType=OTHER, typeHandler=JSONTypeHandler}); </insert>
以上为核心代码
具体参考 分表和jsonb类型映射
相关文章推荐
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
- MyBatis Generator(MBG)Oracle使用说明 公共同义词 LONG数据类型
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- 使用Maven 插件Mybatis Generator自动生成Mybatis数据映射代码
- 关于myBatis与SQLserver 配合使用,查询类型为Date的数据时,日期会减少两天的问题
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- 如何在MyEclipse中使用MyBatis将MySQL数据表生成相应的实体类和映射文件
- hibernate对象映射Date数据类型和input datetime使用注意事项
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- 使用mybatis更新时如果数据类型为boolean型
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
- 使用mybatis更新时如果数据类型为boolean型
- hibernate对象映射Date数据类型和input datetime使用注意事项
- Hibernate3.2(8):映射文件Xxx.hbm.xml使用的Hibernate中的数据类型
- mybatis使用association的resultMap方式进行映射少数据问题