实操java,分表mysql(简化版还有很多可以优化的地方)(附代码)

1 篇文章 0 订阅

目录

思路

环境:

任务:

好的开始上代码

1.配置一个数据库我配置的是mysql(可以考虑根高效率的数据库我这个会因为太快数据库反应不过来报错(数据还是正常进入没有影响))

2.写一个实体类我写的是一个学生实体类(这个随意只要是实体类就可以了建议不要一样)

3.写一个dao层(我这就没有写其他层了就一个dao层(因为不是项目操作就没分太细))

4.下面是我写的一个包装类(包装了学生di,阀值(对应的表名它和学生id的区别就是多了一个_下划线))

5.工具类最该优化一下的地方能力有限就暂时不浪费时间优化了()

思路

1.采用a,b,c形式区分数据库
2.在每一次启动系统必须得知最后一次加入的是哪个表(未达成)
3.采用自动化,建表自动化跟改表名,主键。
4.查询根据查询内容区分表。

环境:

idea2021.3.2

mysql :8.0.29

java:1.8

任务:


1.先做到可以分表
2.必须做到分表后自动跟换加入表,不考虑多写dao层。
3.如何在固定阀值获取到固定值(需要优化单纯是用判断太啦了)暂无办法

好的开始上代码

1.配置一个数据库我配置的是mysql(可以考虑根高效率的数据库我这个会因为太快数据库反应不过来报错(数据还是正常进入没有影响))

package com.zking.rende.util;

import java.sql.*;

/**
 * mysql连接池
 * 工具类
 */
public class Mysqllian {

    private static final String URL="jdbc:mysql://localhost:3306/xuexi_rende?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";//数据库连接字符串,这里的deom为数据库名
    private static final String NAME="root";//登录名
    private static final String PASSWORD="123456";//密码

	private Connection connection = null;
	private PreparedStatement preparedStatement = null;
	private ResultSet resultSet = null;


	public Connection getConnection() {//连上数据库
		try {
			//2、建立连接
			connection = DriverManager.getConnection(URL, NAME, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}



	//断开连接
	public void closeConnection() {
		//5、断开连接
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (preparedStatement != null) {
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}


	public static void main(String[] args) {

		Mysqllian sql =new Mysqllian();

	}
}

配置好后可以用下面的main方法是试一下

我就不写了我试过了点击进入mysql吧配置跟详细版(转载)

2.写一个实体类我写的是一个学生实体类(这个随意只要是实体类就可以了建议不要一样)

package com.zking.rende.fenbiao;

/**
 * 实体类学生类
 */
public class Students {
    private String id;
    private String name;
    private int age;

    public Students() {

    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Students(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Students{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.写一个dao层(我这就没有写其他层了就一个dao层(因为不是项目操作就没分太细))

package com.zking.rende.fenbiao;



import com.zking.rende.util.Baozlei;
import com.zking.rende.util.FZ;
import com.zking.rende.util.Mysqllian;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Studentdao {

    FZ fz=new FZ();

    private int [] siz= {1000, 2000,3000,4000,5000,6000,7000,8000,9000,10000};

    private PreparedStatement preparedStatement = null;

    private ResultSet resultSet = null;

    private Mysqllian sqla=new Mysqllian();


//mysql 查询入门版本
      public List<Students>  chaS() throws Exception {

          List<Students> list=new ArrayList<>();
          String sql="select * from students";//定义sql语句
          Statement stmt = sqla.getConnection().createStatement();//获取Statement
          resultSet= stmt.executeQuery(sql);//通过Statement获取返回值
          System.out.println(resultSet);//打印测试是否获得数据(也可通过判断来确定)
          if(resultSet!=null){//判断数据库返回是否为空
              while (resultSet.next()){//循环获取所有数据
                  Students su=new Students();//实例化list内的表用来当做载体必须写在这
                  su.setId( resultSet.getString("id"));
                  su.setName(resultSet.getString("name"));
                  su.setAge( resultSet.getInt("age"));
                  list.add(su);
              }
          }
          return list;
      }

    public boolean addS(Students students,String biaoming) throws Exception {

        String sql="INSERT INTO "+biaoming+"students  set id=\'"+students.getId()+"\', name = \'"+students.getName()+"\' , age="+students.getAge()+" ";//定义sql语句
        System.out.println(sql);
        Statement stmt = sqla.getConnection().createStatement();//获取Statement

        boolean bukey= stmt.execute(sql);//通过Statement获取返回值
        return bukey;
    }

    /***
     *  获取一个表名
     * @param aa 自动在该数据库生成一个分表
     * @return 是否生成成功
     * @throws Exception
     */
    public boolean biao(String aa) throws Exception {

        String sql=" CREATE TABLE `"+aa+"students`  (\n" +
                "  `id` varbinary(100) ,\n" +
                "  `name` varchar(255) ,\n" +
                "  `age` int(0) ) ";//定义sql语句
        System.out.println(sql);
        Statement stmt = sqla.getConnection().createStatement();//获取Statement

        boolean bukey= stmt.execute(sql);//通过Statement获取返回值
        return bukey;
    }

    public static void main(String[] args) throws Exception {
        Studentdao dao=new Studentdao();
        Students as=new Students();
        Baozlei fz=new Baozlei();
        if(fz.getFz()==null){
            fz.setFz("");
        }
        String a="a";
        for (int i = 0; i <= 10000; i++) {//测试循环增加数据(一万个)如果可以通过方法获得最后一次的查询目标就不用这样了
            as.setId(a+i);
            as.setName("二傻子"+i);
            as.setAge((int)(Math.random()*100));
            dao.addS(as,fz.getFz());
            for (int j = 0; j < 10; j++) {
                int siz = dao.siz[j];//获取分表阀值
                if(i==siz){//达到阀值(或者达到分表标准可以分表)(siz是当前增加的表的数据条数(1000))
                    fz = dao.fz.huaqufazhi(siz);
                    dao.biao(fz.getFz());//需要处理后续阀值得id,表名
                    a=fz.getId();
                }
            }
        }
//        int A_ascii=Integer.valueOf('A');//ASCII转换
//        System.out.println(A_ascii);
//        char a=(char)A_ascii;//ASCII转回
//        System.out.println(a);
    }
}

基本上核心代码就在这了但是的话这个代码是还可以优化的我就不做了有兴趣的朋友可以去试试(里面都写了注释就不解释了哈)

4.下面是我写的一个包装类(包装了学生di,阀值(对应的表名它和学生id的区别就是多了一个_下划线))

package com.zking.rende.util;

/***
 * 包装类 用来包装学生的编号和表名
 */
public class Baozlei {
    private String id;
    private String fz;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFz() {
        return fz;
    }

    public void setFz(String fz) {
        this.fz = fz;
    }
}

5.工具类最该优化一下的地方能力有限就暂时不浪费时间优化了()

package com.zking.rende.util;

/**
 *  工具类用来设置阀值 (可以优化成自动的后续不需要自己添加)
 */
public class FZ {

    public Baozlei huaqufazhi(int siz){
        Baozlei bao=new Baozlei();
        if(siz==1000){//第一个阀值
            bao.setId("b");
            bao.setFz("b_");
        }else if(siz==2000){
            bao.setId("c");
            bao.setFz("c_");
        }else if(siz==3000){
            bao.setId("d");
            bao.setFz("d_");
        }else if(siz==4000){
            bao.setId("e");
            bao.setFz("e_");
        }else if(siz==5000){
            bao.setId("f");
            bao.setFz("f_");
        }else if(siz==6000){
            bao.setId("g");
            bao.setFz("g_");
        }else if(siz==7000){
            bao.setId("h");
            bao.setFz("h_");
        }else if(siz==8000){
            bao.setId("i");
            bao.setFz("i_");
        }else if(siz==9000){
            bao.setId("j");
            bao.setFz("j_");
        }else if(siz==10000){
            bao.setId("k");
            bao.setFz("k_");
        }
        return bao;
    }
}

可以优化的点(把他改成不需要手动添加判断就基本可以了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃亏了的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值