JDBC Type 4 driver for MySQL with X DevAPI support for document store operations
Utility classes for string manipulation, time handling, encoding, and other common operations used throughout the driver.
WARNING: Most utilities documented in this file are internal implementation classes located in com.mysql.cj.util and other core-impl packages. These are NOT part of the official public API and may change without notice between versions. Use at your own risk. Only rely on public API interfaces from com.mysql.cj.jdbc and com.mysql.cj.xdevapi packages for stable, supported functionality.
Comprehensive string manipulation utilities.
package com.mysql.cj.util;
public class StringUtils {
// String to byte array conversion
public static String toString(byte[] bytes);
public static String toString(byte[] bytes, int offset, int length);
public static String toString(byte[] bytes, String encoding);
public static String toString(byte[] bytes, int offset, int length, String encoding);
public static byte[] getBytes(String s);
public static byte[] getBytes(String s, String encoding);
public static byte[] getBytes(char[] chars);
public static byte[] getBytes(char[] chars, String encoding);
// String checks
public static boolean isNullOrEmpty(String str);
public static boolean isEmptyOrWhitespaceOnly(String str);
// Comment stripping
public static String stripComments(String src, String stringOpens, String stringCloses,
boolean slashStarComments, boolean slashSlashComments,
boolean hashComments, boolean dashDashComments);
// Case-insensitive operations
public static int indexOfIgnoreCase(String searchIn, String searchFor);
public static int indexOfIgnoreCase(int startingPosition, String searchIn, String searchFor);
public static int lastIndexOfIgnoreCase(String searchIn, String searchFor);
public static boolean startsWithIgnoreCase(String searchIn, String searchFor);
public static boolean endsWithIgnoreCase(String searchIn, String searchFor);
// String splitting
public static List<String> split(String stringVal, String delimiter, boolean trim);
public static String[] split(String stringVal, String delimiter, String markers,
String markerCloses, boolean trim);
// String joining
public static String join(Collection<?> collection, String delimiter);
public static String join(Object[] array, String delimiter);
// Escaping
public static String escapeQuote(String x, String quoteChar);
// Wildcards
public static String wildcardCompareToRegex(String wildcard);
// Padding
public static String padString(String stringVal, int length);
public static String safeTrim(String toTrim);
// Other utilities
public static boolean isValidIdChar(char c);
public static String stripEnclosure(String source, String prefix, String suffix);
public static String getUniqueSavepointId();
}Usage:
// Convert strings to bytes with encoding
byte[] bytes = StringUtils.getBytes("Hello", "UTF-8");
String str = StringUtils.toString(bytes, "UTF-8");
// Check if string is null or empty
if (StringUtils.isNullOrEmpty(userName)) {
throw new IllegalArgumentException("Username required");
}
// Case-insensitive search
int index = StringUtils.indexOfIgnoreCase("SELECT * FROM users", "from");
// Split string
List<String> parts = StringUtils.split("host1,host2,host3", ",", true);
// Join strings
String joined = StringUtils.join(parts, ", ");
// Strip SQL comments
String sql = "SELECT * FROM users /* comment */ WHERE id = 1";
String stripped = StringUtils.stripComments(sql, "'\"", "'\"", true, true, true, true);Advanced string inspection with marker support.
package com.mysql.cj.util;
public class StringInspector {
// Constructor - requires all parameters for full marker-aware parsing
public StringInspector(String source, String openingMarkers, String closingMarkers,
String overridingMarkers, Set<SearchMode> defaultSearchMode);
// Search methods
public int indexOfIgnoreCase(String searchFor, Set<SearchMode> searchMode);
public int indexOf(String searchFor);
// Character checks
public boolean startsWith(String searchFor);
public char charAt(int index);
// Length
public int length();
}
public enum SearchMode {
ALLOW_BACKSLASH_ESCAPE,
SKIP_BETWEEN_MARKERS,
SKIP_BLOCK_COMMENTS,
SKIP_LINE_COMMENTS,
SKIP_WHITE_SPACE;
}Usage:
import java.util.EnumSet;
String sql = "SELECT * FROM users WHERE name = 'O''Reilly'";
// Full constructor with opening markers, closing markers, overriding markers, and search modes
StringInspector inspector = new StringInspector(sql, "'\"", "'\"", "",
EnumSet.of(SearchMode.SKIP_BETWEEN_MARKERS));
// Find WHERE keyword ignoring string literals
int wherePos = inspector.indexOfIgnoreCase("WHERE",
EnumSet.of(SearchMode.SKIP_BETWEEN_MARKERS));Date and time conversion utilities.
Note: TimeUtil is primarily an internal implementation class. For date/time conversion, most applications should use standard java.sql types and ResultSet methods (getTimestamp(), getDate(), getTime()) which handle conversions automatically.
package com.mysql.cj.util;
public class TimeUtil {
// Time adjustment methods (internal use - adjust times between calendars/timezones)
public static Time adjustTime(Time time, Calendar fromCal, Calendar toCal);
public static Timestamp adjustTimestamp(Timestamp timestamp, Calendar fromCal, Calendar toCal);
public static Timestamp adjustTimestamp(Timestamp timestamp, TimeZone fromTz, TimeZone toTz);
// Timezone utilities
public static TimeZone getCanonicalTimeZone(String timezoneStr);
}Usage:
// Adjust timezone (internal implementation detail - normally handled by driver)
TimeZone serverTz = TimeZone.getTimeZone("UTC");
TimeZone clientTz = TimeZone.getTimeZone("America/New_York");
Timestamp ts = new Timestamp(System.currentTimeMillis());
Timestamp adjusted = TimeUtil.adjustTimestamp(ts, serverTz, clientTz);Base64 decoding utility.
package com.mysql.cj.util;
public class Base64Decoder {
// Constructor
public Base64Decoder();
// Decode operations
public byte[] decode(byte[] base64Data, int offset, int length);
}Usage:
Base64Decoder decoder = new Base64Decoder();
String base64 = "SGVsbG8gV29ybGQ=";
byte[] base64Bytes = base64.getBytes("UTF-8");
byte[] decoded = decoder.decode(base64Bytes, 0, base64Bytes.length);
String text = new String(decoded, "UTF-8"); // "Hello World"DNS SRV record lookup and sorting.
package com.mysql.cj.util;
public class DnsSrv {
// SRV record representation
public static class SrvRecord {
public String getHost();
public int getPort();
public int getPriority();
public int getWeight();
}
// Lookup SRV records
public static List<SrvRecord> lookupSrvRecords(String serviceName);
// Sort SRV records according to RFC 2782
public static List<SrvRecord> sortSrvRecords(List<SrvRecord> records);
}Usage:
// Lookup MySQL SRV records
List<DnsSrv.SrvRecord> records = DnsSrv.lookupSrvRecords("_mysql._tcp.example.com");
// Sort by priority and weight
List<DnsSrv.SrvRecord> sorted = DnsSrv.sortSrvRecords(records);
for (DnsSrv.SrvRecord record : sorted) {
System.out.println(record.getHost() + ":" + record.getPort() +
" (priority: " + record.getPriority() +
", weight: " + record.getWeight() + ")");
}Least Recently Used cache implementation.
package com.mysql.cj.util;
public class LRUCache<K, V> {
// Constructor
public LRUCache(int maxElements);
// Cache operations
public void put(K key, V value);
public V get(K key);
public void clear();
public int size();
public void remove(K key);
}Usage:
// Create LRU cache for prepared statements
LRUCache<String, PreparedStatement> stmtCache = new LRUCache<>(100);
// Cache prepared statement
stmtCache.put(sql, pstmt);
// Retrieve from cache
PreparedStatement cached = stmtCache.get(sql);
if (cached != null) {
// Reuse cached statement
}Utilities for data type manipulation.
package com.mysql.cj.util;
public class DataTypeUtil {
// JDBC type mapping
public static int getJdbcType(String mysqlType);
public static String getJavaClassName(int jdbcType);
// Character encoding
public static String getJavaEncodingFromMysqlCharset(String mysqlCharset);
public static String getMysqlCharsetFromJavaEncoding(String javaEncoding);
// Type checks
public static boolean isNumericalType(int jdbcType);
public static boolean isCharacterType(int jdbcType);
public static boolean isBinaryType(int jdbcType);
public static boolean isDateTimeType(int jdbcType);
}Usage:
// Convert MySQL type to JDBC type
int jdbcType = DataTypeUtil.getJdbcType("VARCHAR");
// Get Java class for JDBC type
String javaClass = DataTypeUtil.getJavaClassName(Types.VARCHAR);
// Character set conversion
String javaEncoding = DataTypeUtil.getJavaEncodingFromMysqlCharset("utf8mb4");Tokenizer for JDBC escape sequences.
package com.mysql.cj.util;
public class EscapeTokenizer {
// Constructor
public EscapeTokenizer(String s);
// Tokenization
public boolean hasMoreTokens();
public String nextToken();
public char getLastChar();
}Usage:
String sql = "{call myproc(?, ?)}";
EscapeTokenizer tokenizer = new EscapeTokenizer(sql);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
// Process token
}Lazy string evaluation for efficient memory usage.
package com.mysql.cj.util;
public class LazyString {
// Constructor
public LazyString(byte[] buffer, int offset, int length, String encoding);
// String operations
public String toString();
public int length();
}SASL string preparation (RFC 4013).
package com.mysql.cj.util;
public class SaslPrep {
// Prepare string according to SASLprep profile
public static String prepare(String str);
public static String prepare(String str, boolean allowUnassigned);
}Usage:
// Prepare password for SASL authentication
String password = "pässwörd";
String prepared = SaslPrep.prepare(password);Sequential ID allocation for connection pools.
package com.mysql.cj.util;
public class SequentialIdLease {
// Constructor
public SequentialIdLease();
// Allocate ID
public int allocate();
// Release ID
public void release(int id);
}Usage:
SequentialIdLease idLease = new SequentialIdLease();
// Allocate ID for new connection
int connId = idLease.allocate();
// Use connection...
// Release ID when connection closed
idLease.release(connId);General utility methods.
package com.mysql.cj.util;
public class Util {
// Version checks
public static boolean isJdbc4();
public static boolean isJdbc42();
// Stack trace
public static String stackTraceToString(Throwable t);
// MySQL edition checks
public static boolean isCommunityEdition(String serverVersion);
public static boolean isEnterpriseEdition(String serverVersion);
// System properties
public static String getSystemProperty(String key);
// Class loading
public static <T> T getInstance(String className, Class<T> interfaceClass);
}See logging-monitoring.md for LogUtils details.
Utilities for testing (not for production use).
package com.mysql.cj.util;
public class TestUtils {
// Get properties from test suite
public static Properties getPropertiesFromTestsuiteUrl();
// Build test URL
public static String getBuildTestUrl(Properties props);
// Get test connection
public static Connection getConnection() throws SQLException;
// Check if running in test environment
public static boolean isRunningOnTestServer();
}Factory for creating server configuration caches.
package com.mysql.cj.util;
public class PerVmServerConfigCacheFactory {
// Get or create cache for server
public static CacheAdapter<String, Map<String, String>> getCacheAdapter(String serverConfigCacheKey);
}Install with Tessl CLI
npx tessl i tessl/maven-com-mysql--mysql-connector-j