Create Database-driven Resource Bundles with Java and MySQL [con't]
Creating a DBResourceBundle
As I explained in my Isolate
Translatable Text in XML Files Using the Java 6 ResourceBundle.Control Class
article, instantiation of a resource bundle is generally handled by the newBundle()
method of the ResourceBundle.Control class. The advantage of overriding the
newBundle()
method is that it allows you to customize the default implementation
of bundle instantiation to suit your specific needs. In this section, you will establish a connection
to the database as you did previously so that you can populate ResourceBundles from
your resource_bundle
table. To fetch data from the table, you need to use the
Connection object's createStatement(int resultSetType, int resultSetConcurrency)
method. The resultSetType
parameter can be ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE,
or ResultSet.TYPE_SCROLL_SENSITIVE
. You only need to scroll forward. The resultSetConcurrency
can either be ResultSet.CONCUR_READ_ONLY
or ResultSet.CONCUR_UPDATABLE
. You can
make yours read only, as you aren't modifying any data.
String Utilities
Working with databases requires you to pay special attention to strings. A common mistake is to insert a variable into a table like so:
Without performing some kind of filtering on the variables, there is nothing to escape single quotes from the names. Notice the extra quote in the following SQL statement:
The StringBuilder is used to construct the query string, as it is designed for use as a replacement for StringBuffer in places where the string buffer is used by a single thread (as is generally the case). The Java docs recommended using this class instead of StringBuffer because it is faster under most implementations.
The StringUtils object is included with the MySQL Connector/J driver. Its static
isNullOrEmpty()
method replaces the cumbersome (somevalue == null || somevalue
= "")
test.
The StringEscapeUtils is what escapes special characters from query variables.
It is a third-party utility included in the org.apache.commons.lang3
package,
which is available from
their site.
Like MySQL Connector/J, the commons-lang-2.5.jar file must be copied
to the your $JAVA_HOME/jre/lib/ext
directory or added to your CLASSPATH environment
variable.
Fetching the Properties
An if
statement adds criteria to the query string based on the locale info
provided. The completed SQL statement is then executed and stored in a Resultset
object. You can then iterate through the results using the Recordset.next()
method
and add the name/value pairs to the Properties. Finally, the connection is closed
and a new DBResourceBundle is instantiated with the Properties object. Here
is the complete code for the newBundle()
method:
That's enough coding for one session. I believe that I hear a latte calling. In
this information-packed article, you learned how to communicate between Java
and a MySQL database using the MySQL Connector/J driver. You also created a test
database and table, reviewed some specialized string utilities and overrode
the newBundle()
method to fetch locale-aware strings from a database. My Next article will walk through
creating the DBResourceBundle class and creating a test program that will
output text for different locales to illustrate what is happening behind the
scenes. Last but not least, I'll discuss some ways to fine tune the loading
of your ResourceBundles using the getCandidateLocales()
method.
Have a suggestion for an article topic? Do you have a product or service that you'd like reviewed? Email it to Rob .
Rob Gravelle combined his love of programming and music to become a software guru and accomplished guitar player. He created systems that are used by Canada Border Services, CSIS and other Intelligence-related organizations. As a software consultant, Rob has developed Web applications for many businesses and recently created a MooTools version of PHPFreechat for ViziMetrics. Musically, Rob recently embarked on a solo music career, after playing with Ivory Knight since 2000. That band was rated as one Canada's top bands by Brave Words magazine (issue #92) and released two CDs. Rob's latest release is called "The Rabbit of Seville". Loosely based on Rossini's The Barber of Seville overture, Rob's amazing rendition includes a full orchestra and numerous guitar tracks. It is sold on his site as a high bitrate MP3 for only $0.99 cents! Rob is available for short-term software projects and recording session work. to inquire, but note that, due to the volume of emails received, he cannot respond to every email. Potential jobs and praise receive highest priority!
Original: July 8, 2010