spring-mybatis-data-common程序级分库操作实例

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.zip

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

spring-mybatis-data-common程序级分库操作实例,布布扣,bubuko.com

时间: 2024-10-06 13:43:49

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

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

原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例,可以增加多个: 一般在一个微服务生态群中是不会出现多个Redis中间件的,所以这种场景很少见,但也不可避免,但是不建议使用,个人建议,勿喷. 基于Maven3.0搭建,spring1.5.9.RELEASE和JDK1.8 1.新建SpringBoot项目,添加依赖 <dependency> &l

chart.js操作实例(前后台互通)

前提:需要导入chart.js 我的项目环境是:SpringMVC+mongodb SpringMVC的controller层: /** * 查询得到财务信息报表 * @author liupeng * @param request * @return * @throws UnknownHostException * @throws ParseException */ @RequestMapping(value="/innerChartOutForFinal") public Mode

Mybatis、JDBC、Habernate、Mybatis+Spring的Mysql数据库操作实例

1.数据库操作实例: public static void JDBCTest() throws Exception { Connection conn = null; String url = "jdbc:mysql://localhost:3306/mysql_learn?" + "user=root&password=123qwe&useUnicode=true&characterEncoding=utf8"; String select

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条

ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)

在springmvc+spring+mybatis里整合ztree实现增删改查,上一篇已经写了demo,下面就只贴出各层实现功能的代码: Jsp页面实现功能的js代码如下: <script> //用于捕获分类编辑按钮的 click 事件,并且根据返回值确定是否允许进入名称编辑状态 function beforeEditName(treeId, treeNode) { var zTree = $.fn.zTree.getZTreeObj("treeDemo"); zTree.

spring,mybatis事务管理配置与@Transactional注解使用

spring,mybatis事务管理配置与@Transactional注解使用[转] 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基

Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文实现了一个后台由Spring+Mybatis+SpringMVC组成,分页采用PageHelper,前台展示使用bootstrap-paginator来显示效果的分页实例.整个项目由maven构成.这里主要讲了分页的实例,框架怎么搭建就不再说明,主要是在这里的基础上来增加分页功能的.注意,此文是在这个基础 Spring+Mybatis+SpringMVC+Maven+MySql搭建

spring,mybatis事务管理配置与@Transactional注解使用[转]

spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence A

Spring+Mybatis+SpringMVC整合

这是来到博客园的第一篇文章,做java开发也好几年了,想从现在开始,在这里将自己会的.学到的做个系统的整理,便于自己掌握的更深.也便于以后复习.还便于给刚入门的攻城师们一点点参考(嘿嘿)--好了,废话不多说,第一篇文章就从最基本的javaWeb开发的三大框架整合开始. 至于为什么是从Spring+Mybatis+SpringMVC开始,而不是Spring+Struts+Hibernate,那是因为现在各个公司使用Spring+Mybatis+SpringMVC的越来越多,而Struts则是使用率