java的enum类型直接插入mysql的enum字段不行吗

java的enum类型直接插入mysql的enum字段不行吗,第1张

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举  

两种中间件的枚举分片算法使用上无差别。

开发注意点

【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)

【分片索引】2. 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

【分片索引】3. 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

【扩容】1. 增加枚举值无需数据再平衡

【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

【缩容】1. 减少枚举值需要数据再平衡

【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为 <property name="defaultNode">、<property name="mapFile">和 <property name="type">

【配置项】2. 在 rule.xml 中配置 <property name="defaultNode"> 标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

【配置项】3. 在 rule.xml 中配置 <property name="mapFile"> 标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

【配置项】4. 编辑 mapFile 所配置的文件

记录格式为:<枚举值>=<分片编号>

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

【配置项】5. 在 rule.xml 中配置 <property name="type"> 标签;type 必须为整型;取值为 0 时,mapFile 的<枚举值>必须为整型;取值为非 0 时,mapFile 的<枚举值>可以是任意字符(除了=和换行符)

1.关于 Java Enum

Enum 一般用来表示一组相同类型常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较时候可以用 ”==” 来替换 equals 。是一种好的习惯。 JDK1.5 之前没有 Enum 这个类型,那时候一般用接口常量来替代。有了 JavaEnum 之后,可以更贴近的表示这种常量。

2. 如何使用 Java Enum

简单的用法: JavaEnum 简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:

//性别

public enum SexEnum { 

  male , female  

}

//颜色

public enum Color { 

  RED , BLUE,GREEN,BLACK  

}

枚举对象里面的值都必须是唯一的。

可以通过 Enum 类型名直接引用该常量,如 SexEnum.male,Color.RED.

复杂用法: Java 为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象,看个下面的例子:

WeekDay.java

/**

 * @author admin

 * 2015-12-03

 * 定义一个枚举类型,代表星期一到星期日的7个缩写常量

 * 同时还定义了枚举类型的属性day,该属性可以是final,也可是变量

 * 同时还定义了该枚举类型的一个方法printDay

 */

public enum WeekDay {

Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri(

        "Friday"), Sat("Saturday"), Sun("Sunday")

/**定义枚举类型自己的属性**/

private final String day

 

private WeekDay(String day) {

     this.day = day

}

/**定义枚举类型自己的方法**/

public static void printDay(int i){

     switch(i){

     case 1: System.out.println(WeekDay.Mon) break

     case 2: System.out.println(WeekDay.Tue)break

     case 3: System.out.println(WeekDay.Wed)break

     case 4: System.out.println(WeekDay.Thu)break

     case 5: System.out.println(WeekDay.Fri)break

     case 6: System.out.println(WeekDay.Sat)break

     case 7: System.out.println(WeekDay.Sun)break

     default:System.out.println("wrong number!")

     }

}

 

public String getDay() {

     return day

}

}

WeekDayTest.java

/**

 * @author admin

 * 2015-12-03

 * 测试枚举类型WeekDay.

 */

public class WeekDayTest {

  public static void main(String args[]) {

      for (WeekDay day : WeekDay.values()) {

         System.out.println(day + "====>" + day.getDay())

      }

      WeekDay.printDay(5)

  }

}

输出结果为:

Mon====>Monday

Tue====>Tuesday

Wed====>Wednesday

Thu====>Thursday

Fri====>Friday

Sat====>Saturday

Sun====>Sunday

Fri

楼上的。。mysql里有这种类型,是一种字符串类数据列类型

ENUM('value1','value2',...) 65535个成员 1或2字节

但是用的比较少。。。

你得写程序自己处理下,大概是下边这样

import java.sql.Connection

import java.sql.DriverManager

import java.sql.ResultSet

import java.sql.Statement

public class EnumTesting {

Connection connection

Statement statement

public EnumTesting() {

try {

Class.forName("com.mysql.jdbc.Driver").newInstance()

connection = DriverManager

.getConnection("jdbc:mysql://192.168.1.25/test?user=spider&password=spider")

} catch (Exception e) {

System.err.println("Unable to find and load driver")

System.exit(1)

}

}

public void doWork() {

try {

statement = connection.createStatement()

ResultSet rs = statement

.executeQuery("SHOW COLUMNS FROM enumtest LIKE 'status'")

rs.next()

String enums = rs.getString("Type")

System.out.println(enums)

int position = 0, count = 0

String[] availableEnums = new String[10]

while ((position = enums.indexOf("'", position)) >0) {

int secondPosition = enums.indexOf("'", position + 1)

availableEnums[count++] = enums.substring(position + 1,

secondPosition)

position = secondPosition + 1

System.out.println(availableEnums[count - 1])

}

rs.close()

statement.close()

connection.close()

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

Enum e = new Enum()

e.doWork()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/8339324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存