38

Java 妹子与数据库老头的交流

 4 years ago
source link: https://www.tuicool.com/articles/uyiqiqQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【这是一猿小讲的 第 23 篇 原创分享】

01

关注"一猿小讲"朋友,都知道以往的文章一直倡导拒绝 CRUD,那到底什么是 CRUD?今天咱们就聊聊 Java 妹子小猿与数据库老头交互的事儿。

产品小汪铿锵有力的说: 小猿同学,咱们近期要推一 爆款 产品,你先实现用户基本的登录的功能。

啥玩意? 小猿内心嘀咕嘀咕: 爆款产品,还基本的登录,那不就是实现用户的 CRUD(增删改查)么?

小汪一句话,累死三军。扯皮一上午的会议终于结束了,于是小猿便叫了个外卖, 填补了肚子的空虚后,小猿习惯性的在脑海里,开始了爆款产品的从 0 到 1 的脑图搭建。

7Vreyu2.png!web

小猿的思路是这样的:先分析一下产品汪的需求,看看是否会有遗漏的需求功能点;然后进行数据库表结构设计;接着就是小猿喜欢的码代码操作。

小猿码代码的方式,那是出了名的相当特别的认真,所以引来了大家的围观。

之前只是道听途说,今日一见果然名不虚传。只见小猿先是在 sqlmaps 文件苦下了一番功夫,一个字母、一个标点的去编写映射文件;接着又一个一个去定义实体类,数据库表的字段一个一个的进行映射;然后用同样认真的方式去编写 dao 的代码;最后又回过头确认数据库表字段与实体类是否一一对应。

看着小猿认真的态度,确实值得赞扬。但是围观小猿码代码之后,看得我反而肾疼,这不都是重复性劳动么,难道就没有什么好的方式可以推荐给小猿吗?

02

带着小猿徒手造工具。

小猿,你找个你比较钟意的目录,创建个文件夹,你命名为 mybatis-generator ,其实起啥名字无所谓啊,这个就是你的工具包目录,下面的东西都放这个目录中。

小猿,看看你电脑上有没有连接数据库的驱动包,没有咱就下载一个,给你个下载链接,再给你一分钟时间,把 jar 包下载一下,后面会用到,我去抽根烟。

https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

小猿你下载好了没,我一根烟都抽完啦。

既然你下载完了,那就再看看电脑上有没有这个包 mybatis-generator-core-1.3.2.jar ,别管它是干啥用的,没有就按照下面的地址下载就是啦,反正后面要用到。

https://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/1.3.2/mybatis-generator-core-1.3.2.jar

小猿,到这咱们的准备工作差不多了,但是还需要你创建个配置文件 generatorConfig.xml ,不用操心文件内容,直接把下面的代码拿过去改吧改吧就行啦。注意一定要把里面涉及到的目录,都改成你电脑上的目录,你先修改一会儿,我去泡杯咖啡喝喝。 内容如下( 注意一定要修改目录

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE generatorConfiguration

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

<!-- 指定数据连接驱动jar地址 -->

<classPathEntry

location="/app/mybatis-generator/mysql-connector-java-5.1.38.jar" />


<!-- 指定数据连接驱动jar地址 -->

<context id="db2Tables" targetRuntime="MyBatis3">

<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

<commentGenerator>

<property name="javaFileEncoding" value="UTF-8"/>

<!-- 是否生成注释代时间戳 -->

<property name="suppressDate" value="true" />

<!-- 是否取消注释 -->

<property name="suppressAllComments" value="false" />

</commentGenerator>


<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->

<jdbcConnection driverClass="com.mysql.jdbc.Driver"

connectionURL="jdbc:mysql://localhost:3306/baokuan"

userId="root" password="root" />


<!-- targetProject:生成实体类存放的目录 -->

<javaModelGenerator targetPackage="com.cool.baokuan.modules.model"

targetProject="/app/mybatis-generator/src">

<property name="enableSubPackages" value="true" />

<property name="trimStrings" value="true" />

</javaModelGenerator>


<!-- targetProject:mapper映射文件生成的位置 -->

<sqlMapGenerator targetPackage="com.cool.baokuan.modules.dao"

targetProject="/app/mybatis-generator/src">

<property name="enableSubPackages" value="true" />

</sqlMapGenerator>


<!-- targetPackage:mapper接口生成的位置 -->

<javaClientGenerator targetPackage="com.cool.baokuan.modules.dao"

targetProject="/app/mybatis-generator/src" type="XMLMAPPER">

<property name="enableSubPackages" value="true" />

</javaClientGenerator>


<!-- 指定数据库表 -->

<table tableName="T_USER" domainObjectName="User"

enableCountByExample="false" enableUpdateByExample="false"

enableDeleteByExample="false" enableSelectByExample="false"

selectByExampleQueryId="false"/>

</context>

</generatorConfiguration>

小猿,改完目录了吧?

既然改完了,那就差最后一步了,你在创建个执行脚本,你的系统是 Windows,所以脚本名称为 run.bat ,我的是Mac,所以我的脚本名称为 run.sh 。创建完成再把下面的内容 copy 进去。

Java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite

好了,小猿,恭喜你已经徒手完成工具包的搭建,你自己看看效果,满意不?

fauEnun.jpg!web

小猿,是骡子是马,咱们都应该牵出来溜溜。到你小试牛刀、一展歌喉的时候啦。一键运行 run.bat 或者 run.sh 试试。

QVbUreN.jpg!web

哇塞,看到上面的效果,小猿着实惊呆啦,因为有了这个工具,以后再也不用重复的写映射文件、写实体类、写 dao 了,就只配置配置数据库的表名就行啦,简直太帅啦。

小猿,切莫欣喜过度。你以后使用这个工具时,一定要注意修改 generatorConfig.xml 文件中的以下几个地方,不然会出幺蛾子。

1. 修改指定数据连接驱动 jar 地址;

2. 修改数据库连接的url、用户名、密码;

3. 修改 targetProject 目录为你电脑的目录;

4. 修改数据库表。

好了,小猿,师傅领进猿门,修行在于个人,以后就看你自己的造化啦( )。

03

造化弄人,小猿忙想招。

产品刚上线没几天,用户量陡增,真是爆款产品啊,用户查询越来越慢。

产品小汪牛掰哄哄的说: 小猿,最近有好多用户反应系统体验越来越慢,是不是代码有 Bug 啊?

啥玩意,代码有 Bug,代码怎么可能有 Bug!其实小猿内心跟明镜一样,比任何人都清楚,是用户表太大了,以至于查询过慢,那该咋办呢?

只见小猿,拿出神笔,在本本上重重的写下啦“分库分表”,于是开始了分库分表一系列的烧脑的验算过程,不得不佩服小猿的数学功底,趁小猿不注意,我偷摸的记了一些,赶紧分享给你们。

分库分表的规则

若有 M 个数据库主节点,数据表总计拆分成 N 张子表,拆表字段可数值化转换为 X,则 数据库实例的序号为  X % M;  数据表的序号为 X % N。

例如: 当主节点个数 M=6,总计拆表数 N=1200 时,单库内子表个数为 200,那么 数据库实例的序号为 X % 6; 数据表的序号为 X % 1200。

那么 序号为 0 的数据库中,会有序号为 0,6,12,18… 的数据表; 序号为 1 的数据库中,会有序号为 1,7,13,19… 的数据表,以此类推。

拆表字段数值化机制

取拆表依据字段,对其取 crc32,之后取绝对值,即为上述“分库分表公式”中的 X。

没想到小猿,还专门为此写了段伪代码。

java.util.zip.CRC32 crc32 = new java.util.zip.CRC32();

// 拆分字段进行crc32

crc32.update(splitField.getBytes(DEFAULT_ENCODING));

long x = java.lang.Math.abs(crc32.getValue());


// 数据库下标

long n = x % dbNum;

String dbPos = String.format("%02d", n);

System.out.println("数据库的下标:" + dbPos);


// 表下标

long m = x % tableNum;

String tablePos = String.format("%03d", m);

System.out.println("表的下标:" + tablePos);

而且,小猿在稿纸最后落款的时候,还写了三遍:Sharding-Jdbc、Sharding-Jdbc、Sharding-Jdbc。尤其是写了三遍,所以各位看官要自行脑补一下这个玩意啦,不然以后就永远跟不上小猿的节奏啦。

04

不愧是能让大家一起围观的小猿,看到这我也只能 ORZ 膜拜小猿。引用一句经典:你大爷还是你大爷,但是小猿已经不再是以前重复 CRUD 的小猿啦。士别三日当刮目相待,所以不要小看身边的每一位小猿呦。

ZveERzR.jpg!web

往期原创文章分享推荐:

机器学习如何为业务赋能?

经验分享一箩筐,从此再也不入坑

码农斗胆来支招


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK