Isso é conhecido como Mojibake . Este não é um problema de codificação de banco de dados, mas um problema de codificação HTTP. Definir a codificação de caracteres da solicitação POST como você fez é realmente a solução adequada.
Pontos de interrogação ocorrem quando os ambos lados da conexão estão conscientes de sua própria codificação. Caracteres enviados/recuperados que não são cobertos pela codificação de um lado serão substituídos por pontos de interrogação. Os caracteres arábicos não ocorrem na ISO-8859-1 e, portanto, são substituídos por pontos de interrogação. Essa é a diferença com o Mojibake em que os caracteres são enviados sem verificar se a codificação usada pelo outro lado realmente suporta o caractere. Você acabará com caracteres codificados incorretamente que se apresentam como uma sequência ininteligível de caracteres.
Neste caso em particular, o driver JDBC está ciente de que está usando ISO-8859-1 por padrão para transmitir os caracteres para o banco de dados, enquanto os caracteres recuperados estão em UTF-8 (o driver MySQL JDBC não olha para o banco de dados codificação de tabela, mesmo que tenha sido configurado corretamente para UTF-8 no seu caso). Você precisa dizer explicitamente ao driver JDBC para usar UTF-8 para decodificar caracteres antes de transmitir dados para o banco de dados. Isso deve ser feito como propriedades de conexão JDBC que são definidas como parâmetros de string de consulta na URL JDBC da seguinte forma:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Se você estiver usando uma fonte de dados gerenciada por contêiner, basta especificar essas propriedades separadamente da mesma maneira que fez para o nome de usuário e a senha
useUnicode=yes
characterEncoding=UTF-8