spring-mybatis-data-common-2.0新增分表机制,在1.0基础上做了部分调整.

基于机架展示分库应用
数据库分表实力创建

create table tb_example_1(
id bigint primary key auto_increment ,
eId bigint,
exampleName varchar(40),
exampleTitle varchar(200),
exampleDate datetime
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; create table tb_example_2 like tb_example_1; create table tb_example_3 like tb_example_1; create table tb_example(
id bigint primary key auto_increment ,
eId bigint,
exampleName varchar(40),
exampleTitle varchar(200),
exampleDate datetime
)ENGINE=MERGE UNION=(tb_example_1,tb_example_2,tb_example_3) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;

程序构建分表操作
1.spring-mybatis-common-data中提供了com.spring.mybatis.data.common.model.ExampleModel用于Demo的实体类
添加maven依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.mybatis</groupId>
<artifactId>com-spring-mybatis-common-data-demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>com-spring-mybatis-common-data-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.mybatis.data.version>2.0</spring.mybatis.data.version>
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- spring-mybatis-data-common begin -->
<dependency>
<groupId>com.spring.mybatis</groupId>
<artifactId>spring-mybatis-data-common</artifactId>
<version>${spring.mybatis.data.version}</version>
</dependency>
<!-- spring-mybatis-data-common end -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>0.2.26</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
</dependencies>
<build>
<finalName>com-spring-mybatis-common-data-demo</finalName>
</build>
</project>

2.持久层继承分表Dao接口,也可以自己定义

@Repository
public interface ExampleModelDao extends ShardCudDao<ExampleModel>,ShardReadDao<ExampleModel>{ /**get common base table max auto_increment id*/
public Long selectMaxId() throws DaoException; }

在持久层自定义了一个selectMaxId()用于多个分表共享同一个自增策略,这里采用程序级别控制
3.业务层继承分表,业务层操作可以自定义,也可以继承com.spring.mybatis.data.common.service.BaseService中提供的常规业务

@Service
public class ExampleModelService extends BaseShard{ @Autowired
private ExampleModelDao exampleModelDao; @Override
public String getBaseShardTableName() {
return "tb_example_";
} @Override
public int getShardTableCount() {
return 3;
} public int deleteObject(ExampleModel entity) throws ServiceException {
try {
return this.exampleModelDao.delete(getShardTableName(entity.geteId()+"", 1), entity.getId());
} catch (DaoException e) {
e.printStackTrace();
}
return 0;
} public int save(ExampleModel entity) throws ServiceException {
long mxId = 1;
try {
Long maxId = this.exampleModelDao.selectMaxId();
if(null != maxId && maxId >= 1){
mxId = maxId + 1;
}
} catch (DaoException e) {
LogUtils.dao.error("insert exampleModel before get Max Id error.",e);
e.printStackTrace();
}
try {
entity.setId(mxId);
return this.exampleModelDao.insert(getShardTableName(entity.geteId()+"", 1), entity);
} catch (DaoException e) {
LogUtils.dao.error("insert exampleModel to table " + getShardTableName(entity.geteId()+"", 1) + " error");
e.printStackTrace();
}
return 0;
} public ExampleModel selectObject(ExampleModel entity)
throws ServiceException {
try {
return this.exampleModelDao.selectById(getShardTableName(entity.geteId()+"", 1), entity.geteId());
} catch (DaoException e) {
e.printStackTrace();
}
return null;
} public void setExampleModelDao(ExampleModelDao exampleModelDao) {
this.exampleModelDao = exampleModelDao;
} }

BaseShard是一个抽象类,继承它需要实现两个方法.

    /**
* get shard table count
* @return
*/
public abstract int getShardTableCount(); /**
* get base shard name
* @return
*/
public abstract String getBaseShardTableName();

getShardTableCount()用于返回分表数量, public abstract String getBaseShardTableName()用于返回分表表名统一前缀.
如实例中的分表为tb_example、tb_example_1、tb_example_2、tb_example_3,分表表名前缀为"tb_example_",分表数量为3.
BaseShard中获取映射表名的操作

    /**
* get shard table name <br>
*
* shard table index start with 0
*
* just like follows
*
* tb_example_0
* tb_example_1
* tb_example_2
* tb_example_3
*
* @param tableName
* @return
*/
public String getShardTableName(String shardKey); /**
* get shard table name <br>
*
* shard table index start with (0+baseNumber)
*
* just like follows
*
* tb_example_(0+baseNumber)
* tb_example_(1+baseNumber)
* tb_example_(2+baseNumber)
* tb_example_(3+baseNumber)
*
*
* @param shardKey
* @param baseNumber
* @return
*/
public String getShardTableName(String shardKey,int baseNumber);

4.持久层实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.mybatis.common.data.demo.dao"> <!--insert entity-->
<insert id="insert" parameterType="exampleModel" flushCache="true">
INSERT INTO ${tablename}(
id,
eId,
exampleName,
exampleTitle,
exampleDate)
VALUES(
#{object.id},
#{object.eId},
#{object.exampleName},
#{object.exampleTitle},
#{object.exampleDate}
)
</insert> <select id="selectMaxId" resultType="long">
select max(id) from tb_example
</select> <delete id="delete" parameterType="long" flushCache="true">
DELETE FROM
${tablename}
WHERE
id=#{id}
</delete> <select id="selectById" parameterType="long" resultType="exampleModel">
SELECT
id AS id,eId AS eId,exampleName AS exampleName,exampleTitle AS exampleTitle,exampleDate AS exampleDate
FROM
${tablename}
WHERE
id=#{id}
</select> </mapper>

程序运行结果

查询各个分表

实例下载: http://files.cnblogs.com/dennisit/spring-mybatis-data-common-2.0-and-demo.7z

转载请注明地址:[http://www.cnblogs.com/dennisit/p/3793501.html]

spring-mybatis-data-common程序级分表操作实例的更多相关文章

  1. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  2. 3.springMVC+spring+Mybatis整合Demo(单表的增删该查,这里主要是贴代码,不多解释了)

    前面给大家讲了整合的思路和整合的过程,在这里就不在提了,直接把springMVC+spring+Mybatis整合的实例代码(单表的增删改查)贴给大家: 首先是目录结构: 仔细看看这个目录结构:我不详 ...

  3. Mybatis(四)多表操作

    数据库如下: 一.创建数据库所对应的bean类 public class User { private Integer uId; private String username; private St ...

  4. Spring Cloud Data Flow用Shell来操作,方便建立CICD

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 之前我们用两篇文章讲解了Spring Cloud Data Flow,例子都是用UI操作的,但我们在Linux系统上经常是无 ...

  5. MariaDB数据表操作实例

    1. MariaDB 数据库操作实例 MariaDB>create database class; //创建class数据库 MariaDB>use class; MariaDB>c ...

  6. C#简单注册表操作实例

    1.简介操作 //设置注册值 private void Button_Click(object sender, RoutedEventArgs e) { //路径及间隔符号要正确 //1.如果指定路径 ...

  7. Spring Data JPA 实现多表关联查询

    本文地址:https://liuyanzhao.com/6978.html 最近抽出时间来做博客,数据库操作使用的是 JPA,相对比 Mybatis 而言,JPA 单表操作非常方便,增删改查都已经写好 ...

  8. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  9. Spring Cloud Data Flow整合UAA使用外置数据库和API接口

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制 ...

随机推荐

  1. [转]使用tee记录mysql client 所有的操作,十个节省时间的mysql命令

    查看:tail -f /tmp/jack.txt 一:tee方法一.配置文件在服务器上的/etc/my.cnf中的[client]加入 tee =/tmp/client_mysql.log即可. 方法 ...

  2. PLSQL程序设计(Oracle)

    Hello World set serveroutput on; declare --说明部分 begin --程序 dbms_output.put_line('Hello World'); end; ...

  3. Smali语法

    看阿里巴巴的<深入探索Android热修复>,里面的代码看不懂,一查才知道是Smali语法,百度了语法,转载如下 转载自smali 语言语法 1.smali apk文件通过apktool反 ...

  4. python实现用户登陆(sqlite数据库存储用户信息)

    python实现用户登陆(sqlite数据库存储用户信息) 目录 创建数据库 数据库管理 简单登陆 有些地方还未完善. 创建数据库 import sqlite3 #建一个数据库 def create_ ...

  5. ajax那些事儿

    一.Ajax的定义浏览器与服务器之间,采用HTTP协议通信.用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出HTTP请求.Ajax全称Asynchronou ...

  6. python在使用MySQLdb模块时报Can't extract file(s) to egg cacheThe following error occurred while trying to extract file(s) to the Python eggcache的错误。

    这个是因为python使用MySQLdb模块与mysql数据库交互时需要一个地方作为cache放置暂存的数据,但是调用python解释器的用户(常常是服务器如apache的www用户)对于cache所 ...

  7. Windows 下安装 swoole 具体步骤(php)

    Windows 下安装 swoole 具体步骤: Swoole,原本不支持在Windows下安装的,所以我们要安装Cygwin来使用.在安装Cygwin下遇到了很多坑,百度经验上的文档不是很全,所以我 ...

  8. 运营商DNS系统安全解决方案

    DNS系统面临的主要风险 目前,DNS面临的安全问题主要可以分为三类:DNS欺骗攻击.拒绝服务攻击.系统漏洞,下文将分别进行介绍.  DNS欺骗攻击 当一个DNS服务器遭到欺骗攻击,使用了来自一个恶 ...

  9. 洛谷.2292.[HNOI2004]L语言(Trie DP)

    题目链接 /* 简单的DP,查找是否有字典中的单词时在Trie树上做 要注意在最初Match(0)一遍后,i还是要从0开始匹配,因为如果有长度为1的单词,Match(i+1)不会从1更新 1M=102 ...

  10. Solidworks实例学习

    1. 扫描绘制 2. 拉伸切除1 3. 拉伸切除2 4. 旋转切除1 5. 旋转切除2 6. 基准面构建 7. 扫描薄壁 8. 放样1 9. 放样2 10. 放样3