Então aqui está a solução:
Se você não usa a instrução prepare e está apenas inserindo usando uma instrução SQL string, não precisa se preocupar porque o JDBC simplesmente move sua instrução para o servidor MySQL e o servidor MySQL pode analisar corretamente a string para o número 64 não assinado (BigInt-20).
Se você usar uma instrução prepare, então você está com problemas. Se você fizer:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
você receberá uma exceção MySqlDataTruncation porque o JDBC deseja truncar isso para longo assinado.
Se você fizer:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Isso funcionará porque o valor está dentro do comprimento assinado do Java.
Portanto, a solução alternativa que sempre funciona é:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Você acaba passando os dados como uma string e deixa o servidor MySQL analisá-los corretamente.
Alguém deveria consertar o driver JDBC porque números de 64 bits não assinados continuam aparecendo em muitos aplicativos estatísticos.