java+mybatis分表路由

       分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

1、定义路由接口

public interface RouteTableAble {
	/**
	 * 共多少表,默认10
	 * @return
	 */
	public int tableSize();
	/**
	 * 使用该值 % tableSize 
	 * @return
	 */
	public int routeValue();
	/** 
	 * 路由table的后缀
	 * @return
	 */
	public String tableExt();
	/**
	 * 连接table的字符串
	 * @return
	 */
	public String concat();
}

  2、实现接口(默认10张子表,以‘_’作为连接符,采用routeValue和子表总数取模作为表序号) 

public abstract class AbstractRouteTable implements RouteTableAble {
 
	@Override
	public int tableSize() {
		// TODO Auto-generated method stub
		return 10;
	}
	@Transient
	@Override
	public String concat() {
		// TODO Auto-generated method stub
		return "_";
	}
	
	@Transient
	@Override
	public String tableExt() {
		// TODO Auto-generated method stub
		return concat().concat(String.valueOf(routeValue() % tableSize()));
	}
 
}

3、继承父类,重写子表总数方法,采用VIN字段后8位的hashcode作为routeValue   

public class CarHealthBasic extends AbstractRouteTable implements Serializable {
	
	private static final long serialVersionUID = 2291302184719452210L;
 
	/**
     * id
     */
	@Id
    private Long id;
	/**
	 * 上传的企业id
	 */
	private Long companyid;
    /**
     * 车牌号码
     */
    private String vehicleplatenumber;
 
    /**
     * 维修企业名称
     */
    private String companyname;
 
    /**
     * 维修企业编码
     */
    private String companycode;
 
    /**
     * 车辆实别代码
     */
    private String vin;
 
    /**
     * 送修日期
     */
    private Date repairdate;
 
    /**
     * 送修里程
     */
    private String repairmileage;
 
    /**
     * id
     * @return id id
     */
    public Long getId() {
        return id;
    }
 
    /**
     * id
     * @param id id
     */
    public void setId(Long id) {
        this.id = id;
    }
 
    /**
     * 车牌号码
     * @return vehicleplatenumber 
     */
    public String getVehicleplatenumber() {
        return vehicleplatenumber;
    }
 
    /**
     * 车牌号码
     * @param vehicleplatenumber 
     */
    public void setVehicleplatenumber(String vehicleplatenumber) {
        this.vehicleplatenumber = vehicleplatenumber == null ? null : vehicleplatenumber.trim();
    }
 
    /**
     * 维修企业名称
     * @return companyname 
     */
    public String getCompanyname() {
        return companyname;
    }
 
    /**
     * 维修企业名称
     * @param companyname 
     */
    public void setCompanyname(String companyname) {
        this.companyname = companyname == null ? null : companyname.trim();
    }
 
    /**
     * 维修企业编码
     * @return companycode 
     */
    public String getCompanycode() {
        return companycode;
    }
 
    /**
     * 维修企业编码
     * @param companycode 
     */
    public void setCompanycode(String companycode) {
        this.companycode = companycode == null ? null : companycode.trim();
    }
 
    /**
     * 车辆实别代码
     * @return vin 
     */
    public String getVin() {
        return vin;
    }
 
    /**
     * 车辆实别代码
     * @param vin 
     */
    public void setVin(String vin) {
        this.vin = vin == null ? null : vin.trim();
    }
 
    /**
     * 送修日期
     * @return repairdate 
     */
    public Date getRepairdate() {
        return repairdate;
    }
 
    /**
     * 送修日期
     * @param repairdate 
     */
    public void setRepairdate(Date repairdate) {
        this.repairdate = repairdate;
    }
 
    /**
     * 送修里程
     * @return repairmileage 
     */
    public String getRepairmileage() {
        return repairmileage;
    }
 
    /**
     * 送修里程
     * @param repairmileage 
     */
    public void setRepairmileage(String repairmileage) {
      	 this.repairmileage = repairmileage == null ? null : repairmileage.trim();
   }
    public Long getCompanyid() {
	return companyid;
   }
 
    public void setCompanyid(Long companyid) {
	this.companyid = companyid;
   }
    @Override
    public int routeValue() {
	// TODO Auto-generated method stub
	return vin.substring(vin.length()-8, vin.length()).hashCode();
   }
    
    @Override
    public int tableSize() {
	// TODO Auto-generated method stub
	return 20;
    }    
	
}

4、mybatis(增删改差都需要拼接)

public String insertSQL(Object t) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("INSERT INTO ").append(getTableFromClass(t.getClass())).append(getRouteTableFromObject(t)).append(" ");
		try {
			List<com.ctjy.support.mybaits.provider.Entry>	list = getKeyValueEntry(t);
			buffer.append("(");
			for (com.ctjy.support.mybaits.provider.Entry entry : list) {
				buffer.append(entry.getColumn()).append(",");
			}
			String str = buffer.substring(0, buffer.length() - 1);
			buffer.setLength(0);
			buffer.append(str).append(") ");
			buffer.append("VALUES (");
			
			for (com.ctjy.support.mybaits.provider.Entry entry : list) {
				buffer.append("?").append(",");
			}
			
			str = buffer.substring(0, buffer.length() - 1);
			buffer.setLength(0);
			buffer.append(str).append(") ");
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}
	
		return buffer.toString();
	}

5、getRouteTableFromObject方法代码如下:判断该pojo是否为RouteTable的子类,如果是则返回表名后缀 

public String getRouteTableFromObject(Object obj) {
		if (obj == null) {
			return "";
		}
		
		String ext = null;
		if (RouteTableAble.class.isAssignableFrom(obj.getClass())) {
			RouteTableAble route = (RouteTableAble) obj;
			ext = route.tableExt();
		}
		
		return ext == null ? "" : ext;
	}

6、关于mapper文件的处理,通过tablesize拼接sql语句中的表名(查询参数中多加一个tablesize,该值通过分表规则算出)

<!-- 查询维修记录 -->
	<select id="findRepairLog" resultType="com.ctjy.wxmis.carhealth.dto.CarHealthBasicSuperviseDto">
	select a.id,a.vehicleplatenumber,
	a.companyname,a.companycode,a.vin,a.repairdate,
	a.repairmileage,a.settledate,a.faultdescription,a.costlistcode
	from 
	<choose>
		<when test="healthParam.tablesize != null">
			car_health_basic${healthParam.tablesize} a
		</when>
		<otherwise>
				car_health_basic a
		</otherwise>
	</choose>
	<include refid="cond" />
	limit #{index},#{pagesize}
	</select>

 其中的limit #{index},#{pagesize}表示分页查询。

一:分页需求:

客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:

比如:

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

二:通过上面的分析,可以得出符合我们自己需求的分页sql格式是:select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。

参考于:https://blog.csdn.net/heking124/article/details/77447906

https://blog.csdn.net/qq_26599807/article/details/79240435

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java是一种编程语言,Vue是一种前端框架,Spring Boot是一种后端框架,Maven是一种构建工具,MyBatis是一种ORM框架,MySQL是一种关系型数据库。这些技术可以一起使用来开发Web应用程序。 ### 回答2: Java、Vue、SpringBoot、Maven、MyBatis 和 MySQL 是现代软件开发中常见的工具和技术。Java 是一门强大的编程语言,非常适合构建企业级应用程序。Vue 是一种现代的 JavaScript 框架,用于构建可交互的单页应用程序。SpringBoot 是一种基于 Spring 框架的服务端开发解决方案,可用于构建 RESTful Web 服务或基于微服务体系结构的应用程序。Maven 是一个构建工具,可用于自动化构建和管理软件项目的依赖项。MyBatis 是一个数据持久化框架,可以方便地将 Java 应用程序连接到各种关系型数据库中。MySQL 是一个流行的、开源的关系型数据库管理系统,是许多 Web 应用程序的默认选择。 在软件开发中,Java、Vue、SpringBoot、Maven、MyBatis 和 MySQL 可以相互配合使用,以构建跨平台、云端部署、高效稳定的应用程序。Java 和 SpringBoot 可用于构建 Web 服务和 RESTful API,而 Vue 和 SpringBoot 可用于构建面向用户的 Web 应用程序。Maven 可用于管理项目依赖项和自动化构建过程,而 MyBatis 可以方便地将数据从数据库中提取并转换为对象。MySQL 可用于存储应用程序生成的数据。 总之,在软件开发中,选择适合您团队和项目需求的工具和技术非常重要。Java、Vue、SpringBoot、Maven、MyBatis 和 MySQL 已经得到了广泛的应用和实践验证,并且可以帮助您轻松地构建高效、可靠和安全的应用程序。 ### 回答3: Java是一种面向对象的高级编程语言,被广泛使用于开发各种应用程序,从桌面应用程序到企业级应用程序。它具有强大的编程能力、跨平台兼容性和开源社区的支持。Java中有很多库、框架和工具,可以简化编程任务并提高应用程序的性能和稳定性。 Vue是一个流行的JavaScript前端框架,用于构建用户界面。它被设计为轻量级、高效和灵活,可以用来建立单页应用程序和大型复杂应用程序。Vue提供了许多有用的工具和组件,可以帮助开发人员快速建立优秀的用户界面。 Spring Boot是一个基于Spring框架的轻量级应用程序开发框架,目的是简化企业级应用程序的开发过程。Spring Boot具有自动配置、快速启动、简单的部署和许多其他特性,可以快速构建高性能应用程序。它还具有用于构建RESTful API和微服务的功能。 Maven是一个强大的项目管理和构建工具,用于构建Java应用程序。Maven可以帮助开发人员自动化项目构建过程,并可以帮助组织项目结构和管理库依赖。Maven具有许多插件和工具,可以帮助开发人员编译、测试和打包应用程序。 MyBatis是一个流行的Java持久层框架,用于简化与关系型数据库的交互。它使用SQL映射文件将Java对象映射到数据库表中,提供了一种简单而强大的方式来处理数据库操作。MyBatis还提供了许多有用的特性,如动态SQL、事务管理和缓存。 MySQL是一个开源的关系型数据库管理系统,被广泛使用于Web应用程序和企业级应用程序。MySQL具有可靠的性能、高度可扩展性和广泛的API支持,可以处理大型数据集和高并发访问。它还拥有丰富的特性和工具,支持多种编程语言和操作系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值