This topic introduces how to build an application by using the JFinal framework and OceanBase Database. It also covers the use of the application for fundamental database operations, including table creation, data insertion, and data query.
Prerequisites
- You have installed OceanBase Database.
- You have installed Java Development Kit (JDK) 1.8 and Maven.
- You have installed IntelliJ IDEA.
Note
The tool used to run the sample code in this topic is IntelliJ IDEA 2021.3.2 (Community Edition), but you can also choose a tool that suits your personal preference to run the code.
Procedure
Note
The steps outlined in this topic are for the Windows environment. If you are using a different operating system or compiler, the steps may vary slightly.
- Obtain the OceanBase Database connection string.
- Import the
java-oceanbase-Jfinalproject into IDEA. - Set up the Tomcat runtime environment for the
java-oceanbase-Jfinalproject. - Modify the database connection information in the
java-oceanbase-Jfinalproject. - Run the
java-oceanbase-Jfinalproject.
Step 1: Obtain the OceanBase Database connection string
Contact the deployment personnel or administrator of OceanBase Database to obtain the connection string.
obclient -hxx.xx.xx.xx -P2883 -uroot@sys#cluster -p**** -AFill in the URL below based on the deployed OceanBase database.
Note
The URL here is required in the
config.propertiesfile.jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$passwordwhere:
hostspecifies the IP address for connecting to OceanBase Database. For connection through OceanBase Database Proxy (ODP), use the IP address of an ODP. For direct connection, use the IP address of an OBServer node.portspecifies the port for connecting to OceanBase Database. For connection through ODP, the default value is2883, which can be customized when ODP is deployed. For direct connection, the default value is2881, which can be customized when OceanBase Database is deployed.schema_namespecifies the name of the schema to be accessed.user_namespecifies the tenant account. For connection through ODP, two account formats are supported:username@tenant name#cluster nameandcluster name:tenant name:username. For direct connection, theusername@tenant nameformat is supported.passwordspecifies the password of the account.
For more information about URL parameters, see Database URL.
Step 2: Import the java-oceanbase-Jfinal project to IntelliJ IDEA
Start IntelliJ IDEA and choose File > Open....

In the Open File or Project window, select the project files and click OK to import the files.
IntelliJ IDEA automatically identifies various files in the project. You can view project information such as the directory structure, file list, module list, and dependencies in the Project window. Generally, the Project window is at the leftmost of the UI of IntelliJ IDEA and is opened by default. If the Project window is closed, you can choose View > Tool Windows > Project in the menu bar or press the keyboard shortcut Alt + 1 to open it.
Note
When you use IntelliJ IDEA to import a project, IntelliJ IDEA automatically detects the
pom.xmlfile in the project, downloads the required dependency libraries based on the dependencies described in the file, and adds them to the project.View the project.

Step 3: Set up a Tomcat runtime environment for the java-oceanbase-Jfinal project
Download Tomcat 8.5.95. Download the package of Tomcat 8.5.95 from the official website of Apache Tomcat. Decompress the package to the directory where you want to install Tomcat.
Configure Tomcat in IDEA.
- Open IntelliJ IDEA, click File and choose Settings > Plugins.
- In the search box in the middle of the Settings window, search for Smart Tomcat.
- Download the plug-in and then choose Apply. The Tomcat Server tab appears at the bottom of the left side of the Settings window.
- On the Tomcat Server tab, click the + button on the right, select the directory where you decompressed the Tomcat package, click Apply, and then click OK to complete the configuration.

Create a Tomcat runtime configuration.
- In the top toolbar of IDEA, choose Run > Edit Configurations.
- In the Run/Debug Configurations window, click + and choose Tomcat Server.
- Enter the running server name in Name.
- In the Configuration section, select the version that you installed for Tomcat sever, change the value of Context path to
/, and set SSL port to8080. - In the Before launch section, click + and choose Launch Web Browser.
- Click Edit and enter the URL
http://localhost:8080/hello/getData. - Click Apply and then click OK to complete the configuration.

Run the Tomcat server.
- In the top toolbar of IDEA, select the Tomcat runtime configuration that you have just created.
- Click the green triangle to start the Tomcat server. You can view the startup logs of the Tomcat server in the Run window of IDEA.
Step 4: Modify the database connection information in the java-oceanbase-Jfinal project
Modify the database connection string in the config.properties file based on the information obtained in Step 1: Obtain the OceanBase Database connection string.
Here is an example:
- The name of the database driver is
com.oceanbase.jdbc.Driver. - The IP address of the OBServer node is
10.10.10.1. - The access port is 2881.
- The name of the schema to be accessed is
sys. - The tenant account is
sys@xyoracle.xyoracleis an Oracle user tenant created in OceanBase Database, andsysis the username of a user in thexyoracletenant. - The password is
******.
Here is the sample code:
db.app.driver=com.oceanbase.jdbc.Driver
db.app.url=jdbc:oceanbase://10.10.10.1:2881/sys
db.app.user=sys@xyoracle
db.app.password=******
db.app.poolInitialSize=3
db.app.poolMaxSize=10
db.app.connectionTimeoutMillis=100
db.app.validationQuery=select 1 from dual
Step 5: Run the java-oceanbase-Jfinal project
Specify the run path.
In the top navigation bar of IntelliJ IDEA, select the Tomcat runtime configuration you just created. Click the Run button (a green triangle) to start the Tomcat server. Enter the URL
http://localhost:8080/hello/getDatain Google Chrome or Internet Explorer to view the running result.View the running result.
[{"ID":1,"NAME":"John"},{"ID":2,"NAME":"Jane"}]
Project code
Click here to download the project code, which is a package named java-oceanbase-Jfinal.
Decompress the package to obtain a folder named java-oceanbase-Jfinal. The directory structure is as follows:
│--pom.xml
│
├─.idea
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ └─testjfinal
│ │ │ ├─config
│ │ │ │ └─UserConfig.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ └─UserController.java
│ │ │ │
│ │ │ └─pojo
│ │ │ └─User.java
│ │ │
│ │ ├─resources
│ │ │ └─config.properties
│ │ │
│ │ └─webapp
│ │ └─WEB-INF
│ │ └─web.xml
│ │
│ │
│ │
│ └─test
│ └─java
│
│
└─target
Here is a breakdown of the files and directories:
pom.xml: the configuration file of the Maven project, which contains the dependencies, plug-ins, and build information of the project..idea: the directory used in the Integrated Development Environment (IDE) for storing project-related configurations.src: the directory for storing source code of the project.main: the directory for storing main source code and resource files.java: the directory for storing Java source code.com: the root directory for storing the Java package.oceanbase: the root directory for storing the project.testjfinal: stores the relevant code of the JFinal framework.config: the directory that stores configuration files of the application.UserConfig.java: the user configuration class file.controller: the directory that stores controller files of the application.UserController.java: the user controller class file.pojo: stores JavaBeans or entity classes.User.java: stores the user entity class.resources: the directory that stores resource files, such as configuration files and SQL files.config.properties: the configuration file that stores database connection information.webapp: the web application directory that stores static resources and configuration files of the web application.WEB-INF: the WEB-INF directory that stores configuration files and other protected resource files of the web application.web.xml: the deployment descriptor file for the web application.test: the directory that stores the test code and resource files.target: the directory that stores compiled class files and JAR packages.
Code in pom.xml
Note
If you just want to verify the sample project, use the default code without modification. You can also modify the pom.xml file as required based on the following instructions.
To configure the pom.xml file, perform the following steps:
Declare the file.
Declare the file to be an XML file that uses the XML standard 1.0 and character encoding format UTF-8.
Here is the sample code:
<?xml version="1.0" encoding="UTF-8"?>Configure namespaces and the POM version.
xmlns: the default XML namespace for the POM, which is set tohttp://maven.apache.org/POM/4.0.0.xmlns:xsi: the XML namespace for XML elements prefixed withxsi, which is set tohttp://www.w3.org/2001/XMLSchema-instance.xsi:schemaLocation: the location of an XML schema definition (XSD) file. The value consists of two parts: the default XML namespace(http://maven.apache.org/POM/4.0.0)and the URI of the XSD file (http://maven.apache.org/xsd/maven-4.0.0.xsd).<modelVersion>: the POM version used by the POM file, which is set to4.0.0.
Here is the sample code:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> </project>Configure basic information.
<groupId>: the ID of the project group, which is set tocom.oceanbase.<artifactId>: the name of the project, which is set tojava-oceanbase-jfinal.<version>: the version of the project, which is set to1.0-SNAPSHOT.<packaging>: the packaging mode of the project, which is set towar. In this mode, archive files of the web application are packaged in the WAR format.
Here is the sample code:
<groupId>com.oceanbase</groupId> <artifactId>java-oceanbase-jfinal</artifactId> <version>1.0-SNAPSHOT</version> <!-- Packaging method (default to jar) --> <packaging>war</packaging>Configure the Maven version.
Set both the source code version and target code version of the compiler to Java 8 by using
<maven.compiler.source>and<maven.compiler.target>.Here is the sample code:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>Configure core dependencies.
Define a dependency named
jfinalthat belongs to thecom.jfinalgroup and whose version is5.0.6. With this dependency, you can use features of the JFinal framework.Here is the sample code:
<dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>5.0.6</version> </dependency>Define a dependency named
druidthat belongs to thecom.alibabagroup and whose version is1.2.8. With this dependency, you can use the Druid library to manage and optimize the acquisition and release of database connections.Here is the sample code:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>Define a dependency named
oceanbase-clientthat belongs to thecom.oceanbasegroup and whose version is2.4.3. With this dependency, you can use the features of OceanBase Command-Line Client (OBClient), such as connections, queries, and transactions.Here is the sample code:
<dependencies> <dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.3</version> </dependency> </dependencies>
Code in config.properties
The config.properties file stores the connection information of OceanBase Database, including the class name of the database driver and the URL, username, password, and connection pool configurations. You can use the following parameters to establish and manage database connections for database operations in the application:
db.app.driver: the database driver used to establish a connection with OceanBase Database, which is set tocom.oceanbase.jdbc.Driver.db.app.url: the URL for connecting to the database.db.app.user: the username for connecting to the database.db.app.password: the password for connecting to the database.db.app.poolInitialSize: the initial size of the database connection pool, which is set to3, indicating that three database connections are initially created.db.app.poolMaxSize: the maximum number of database connections allowed for the connection pool, which is set to10, indicating that you can create a maximum of 10 database connections in a connection pool.db.app.connectionTimeoutMillis: the timeout period for obtaining a database connection, which is set to100 ms, indicating that if a connection cannot be obtained within 100 ms, a timeout exception is thrown.db.app.validationQuery: the SQL query statement for verifying database connections, which is set toselect 1 from dual. When you request a connection from the connection pool, this query statement is executed to verify the connection.Here is the sample code:
db.app.driver=com.oceanbase.jdbc.Driver db.app.url=jdbc:oceanbase://host:port/schema_name db.app.user=user_name db.app.password=****** db.app.poolInitialSize=3 db.app.poolMaxSize=10 db.app.connectionTimeoutMillis=100 db.app.validationQuery=select 1 from dual
Code in web.xml
The web.xml file configures a filter for the web application.
To configure the web.xml configuration file, perform the following steps:
Declare the file.
Declare the file to be an XML file that uses the XML standard 1.0 and character encoding format UTF-8.
Here is the sample code:
<?xml version="1.0" encoding="UTF-8"?>Configure the XML namespace and the XML model version.
xmlns:xsi: the XML namespace for XML elements prefixed withxsi, which is set tohttp://www.w3.org/2001/XMLSchema-instance.xmlns: the default XML namespace, which is set tohttp://java.sun.com/xml/ns/javaee.xsi:schemaLocation: a mapping from the default XML namespace (http://java.sun.com/xml/ns/javaee) to the location of the XML schema definition (XSD) file (http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd).<id>and<version>: the ID and version of the web application, which are respectively set toWebApp_IDand3.0.
Here is the sample code:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">Configure a JFinal filter.
Configure a filter named
jfinal. With this filter, you can use the JFinal framework in the web application. Set the class of the filter tocom.jfinal.core.JFinalFilter. Use the initialization parameterconfigClassto specifycom.oceanbase.testjfinal.config.UserConfigas the location of the configuration class for the JFinal framework. This filter allows the web application to use the JFinal framework and defines the behavior of the JFinal framework based on the specified configuration class.Here is the sample code:
<filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <!-- your jfinal configuration location --> <param-value>com.oceanbase.testjfinal.config.UserConfig</param-value> </init-param> </filter>Configure mappings of the JFinal filter.
Apply the JFinal filter named
jfinalto all request paths, namely, to all requests in the application.Here is the sample code:
<filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Code in UserConfig.java
The UserConfig.java file configures the routing, plug-in, and database connection information of the application.
Perform the following steps to configure the UserConfig.java file:
Reference other classes and interfaces.
Declare this file to contain the following interfaces and classes:
StatFilterclass: collects statistics about the database access performance.JdbcConstantsclass: defines database type constants.WallFilterclass: prevents SQL injection attacks.PropKitclass: reads configuration files.ActiveRecordPluginclass: operates the database.Dbclass: executes database operations.OracleDialectclass: specifies a dialect of the database.DruidPluginclass: connects to the database.Engineclass: configures the template engine.UserControllerclass: processes user requests.Userclass: transmits and stores user data.
Here is the sample code:
import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.wall.WallFilter; import com.jfinal.config.*; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.dialect.OracleDialect; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.template.Engine; import com.oceanbase.testjfinal.controller.UserController; import com.oceanbase.testjfinal.pojo.User;Define the
UserConfigclass.Rewrite the methods in the
JFinalConfigclass to configure constant, routing, plug-in, and database connection information.Define the
configConstantmethod.Use this method to configure constants of the JFinal framework and use
PropKitto read configurations from the configuration file.Here is the sample code:
@Override public void configConstant(Constants constants) { PropKit.use("config.properties"); }Define the
configRoutemethod.Use this method to configure route mappings. Call the
routes.addmethod to map the "/hello" path to the default access page of theUserControllerclass.Here is the sample code:
@Override public void configRoute(Routes routes) { routes.add("/hello", UserController.class, "/"); }Define the
configEnginemethod.Use this method to configure the template engine.
Here is the sample code:
@Override public void configEngine(Engine engine) { }Define the
configPluginmethod.Use this method to configure plug-ins of the application. Call the
initmethod to initialize the database connection and schema. Create theDruidPluginandActiveRecordPluginplug-ins and add them toplugins. Call theaddMappingmethod ofactiveRecordPluginto map theUserentity class to theTEST_USERdatabase table.Here is the sample code:
@Override public void configPlugin(Plugins plugins) { init(); DruidPlugin druidPlugin = createDruidPlugin(); plugins.add(druidPlugin); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); activeRecordPlugin.addMapping("TEST_USER", User.class); plugins.add(activeRecordPlugin); }Define the
createDruidPluginmethod.This method creates a
DruidPluginplug-in and configures related parameters, including the connection pool size, SQL firewall, and connection error handling.Call the
getmethod ofPropKitto obtain database connection attributes from the configuration file, including the URL, username, password, and driver class. Then, create aDruidPluginobject and use the obtained attribute values to initialize the object.Call the
addFiltermethod to add aStatFilterinstance toDruidPluginfor collecting access performance statistics of the database. Create aWallFilterinstance, call thesetDbTypemethod to set the database type to OceanBase Database, and then add the instance toDruidPluginfor SQL firewall-based filtering.Call the
setInitialSizemethod to set the initial size of the connection pool, thesetMaxPoolPreparedStatementPerConnectionSizemethod to set the maximum number of prepared statements allowed in each connection pool, thesetTimeBetweenConnectErrorMillismethod to set the interval for a retry upon an error, and thesetValidationQuerymethod to set the query statement for verifying connections. Then, return the createdDruidPlugininstance.Here is the sample code:
private DruidPlugin createDruidPlugin() { DruidPlugin druidPlugin = new DruidPlugin( PropKit.get("db.app.url"), PropKit.get("db.app.user"), PropKit.get("db.app.password"), PropKit.get("db.app.driver") ); druidPlugin.addFilter(new StatFilter()); WallFilter wallFilter = new WallFilter(); wallFilter.setDbType(JdbcConstants.OCEANBASE); druidPlugin.addFilter(wallFilter); druidPlugin.setInitialSize(PropKit.getInt("db.app.poolInitialSize")); druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.poolMaxSize")); druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.connectionTimeoutMillis")); druidPlugin.setValidationQuery("select 1 from dual"); return druidPlugin; }
Define the
initmethod.Use this method to initialize database connections and create database tables. Call the
initDbConnectionmethod to initialize the database connection and return anActiveRecordPlugininstance. Execute an SQL statement to query whether the user tableTEST_USERexists. If the user table does not exist, execute theCREATE TABLEstatement to create a table namedTEST_USERthat contains theIDandNAMEfields. Close the connection of theActiveRecordPluginplug-in to release the database connection.Here is the sample code:
public void init() { ActiveRecordPlugin arp = initDbConnection(); boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = 'TEST_USER'") > 0; if (!tableExists) { String sql = "CREATE TABLE TEST_USER (ID NUMBER(10), NAME VARCHAR2(50))"; Db.update(sql); } arp.stop(); }Define the
initDbConnectionmethod.Use this method to initialize the database connection. First, call the
createDruidPluginmethod to create aDruidPluginobject and assign it to thedruidPluginvariable. This method is used to create and configureDruidPluginobjects for database connection pool management. Then, call thecreateActiveRecordPluginmethod to create anActiveRecordPluginobject and pass theDruidPluginobject as parameters to thecreateActiveRecordPluginmethod. This method is used to create and configureActiveRecordPluginobjects for database operation management. Call thedruidPlugin.startmethod to start theDruidPluginobject to initialize the database connection pool. Finally, call theactiveRecordPlugin.startmethod to start theActiveRecordPluginobject. This method initializes database operation settings based on configurations.Here is the sample code:
private ActiveRecordPlugin initDbConnection() { DruidPlugin druidPlugin = createDruidPlugin(); ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin); druidPlugin.start(); activeRecordPlugin.start(); return activeRecordPlugin; }Define the
ConfigInterceptorandConfigHandlermethods.Use these methods for global configuration during system initialization.
Here is the sample code:
@Override public void configInterceptor(Interceptors interceptors) { } @Override public void configHandler(Handlers handlers) { }
Code in UserController.java
The UserController.java file uses the getData method to insert data into the database, query data from the database, and return the query result to the client in the JSON format. The Db class provided by the JFinal framework is used to perform database operations, and the custom User class is used to map data, thereby implementing database operations and result returning.
Perform the following steps to configure the UserController.java file:
Reference other classes and interfaces.
Declare this file to contain the following interfaces and classes:
Controllerclass: processes requests and responses.Dbclass: executes database operations.Userclass: maps database tables.Listinterface: operates the query result set.
Here is the sample code:
import com.jfinal.core.Controller; import com.jfinal.plugin.activerecord.Db; import com.oceanbase.testjfinal.pojo.User; import java.util.List;Define the
UserControllerclass.Use this class to provide a controller for the JFinal framework, and use the
getDatamethod to insert data into and query data from the database.- Insert data. Call the
Db.updatemethod to execute an SQL statement to insert two data records "1, John" and "2, Jane" into theTEST_USERtable. - Query data. Call the
User.dao.findmethod to execute an SQL statement to query all data from theTEST_USERtable. The query result is assigned to theusersvariable of theListtype. - Render data into the JSON format. Call the
renderJsonmethod to render the data stored in theusersobject into the JSON format and return it to the client. - Handle exceptions. Call the
catchstatement block to print the stack information of an exception that is thrown during the execution.
Here is the sample code:
public class UserController extends Controller { public void getData(){ try { // Insert data. String insertDataSql = "INSERT INTO TEST_USER (ID, NAME) VALUES (?, ?)"; Db.update(insertDataSql, 1, "John"); Db.update(insertDataSql, 2, "Jane"); // Query data. List<User> users; users = User.dao.find("SELECT * FROM TEST_USER"); renderJson(users); }catch (Exception e){ e.printStackTrace(); } } }- Insert data. Call the
Code in User.java
The User.java file maps database tables and Java objects.
To configure the User.java file, perform the following steps:
Reference the
Modelclass.Use the
Modelclass to map database tables and operate data.Define the
Userclass.The
Userclass inherits the methods provided in theModelclass for database operations.Here is the sample code:
import com.jfinal.plugin.activerecord.Model; public class User extends Model<User> { public static final User dao = new User(); }
Complete code
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.oceanbase</groupId>
<artifactId>java-oceanbase-jfinal</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Packaging method (default to jar) -->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
</project>
db.app.driver=com.oceanbase.jdbc.Driver
db.app.url=jdbc:oceanbase://host:port/schema_name
db.app.user=user_name
db.app.password=
db.app.poolInitialSize=3
db.app.poolMaxSize=10
db.app.connectionTimeoutMillis=100
db.app.validationQuery=select 1 from dual
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!-- your jfinal configuration location -->
<param-value>com.oceanbase.testjfinal.config.UserConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
package com.oceanbase.testjfinal.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.oceanbase.testjfinal.controller.UserController;
import com.oceanbase.testjfinal.pojo.User;
public class UserConfig extends JFinalConfig {
@Override
public void configConstant(Constants constants) {
// Read properties configuration
PropKit.use("config.properties");
}
@Override
public void configRoute(Routes routes) {
// Set the default access page for project startup, which does not need to be set in the web.
routes.add("/hello", UserController.class, "/");
}
@Override
public void configEngine(Engine engine) {
}
@Override
public void configPlugin(Plugins plugins) {
init();
DruidPlugin druidPlugin = createDruidPlugin();
plugins.add(druidPlugin);
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
activeRecordPlugin.addMapping("TEST_USER", User.class);
plugins.add(activeRecordPlugin);
}
private DruidPlugin createDruidPlugin() {
DruidPlugin druidPlugin = new DruidPlugin(
PropKit.get("db.app.url"),
PropKit.get("db.app.user"),
PropKit.get("db.app.password"),
PropKit.get("db.app.driver")
);
druidPlugin.addFilter(new StatFilter());
WallFilter wallFilter = new WallFilter();
wallFilter.setDbType(JdbcConstants.OCEANBASE);
druidPlugin.addFilter(wallFilter);
druidPlugin.setInitialSize(PropKit.getInt("db.app.poolInitialSize"));
druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(PropKit.getInt("db.app.poolMaxSize"));
druidPlugin.setTimeBetweenConnectErrorMillis(PropKit.getInt("db.app.connectionTimeoutMillis"));
druidPlugin.setValidationQuery("select 1 from dual");
return druidPlugin;
}
private ActiveRecordPlugin createActiveRecordPlugin(DruidPlugin druidPlugin) {
ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
activeRecordPlugin.setDialect(new OracleDialect());
return activeRecordPlugin;
}
public void init() {
ActiveRecordPlugin arp = initDbConnection();
boolean tableExists = Db.queryInt("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = 'TEST_USER'") > 0;
if (!tableExists) {
String sql = "CREATE TABLE TEST_USER (ID NUMBER(10), NAME VARCHAR2(50))";
Db.update(sql);
}
arp.stop();
}
private ActiveRecordPlugin initDbConnection() {
DruidPlugin druidPlugin = createDruidPlugin();
ActiveRecordPlugin activeRecordPlugin = createActiveRecordPlugin(druidPlugin);
druidPlugin.start();
activeRecordPlugin.start();
return activeRecordPlugin;
}
@Override
public void configInterceptor(Interceptors interceptors) {
}
@Override
public void configHandler(Handlers handlers) {
}
}
package com.oceanbase.testjfinal.controller;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.oceanbase.testjfinal.pojo.User;
import java.util.List;
public class UserController extends Controller {
public void getData(){
try {
// Insert data.
String insertDataSql = "INSERT INTO TEST_USER (ID, NAME) VALUES (?, ?)";
Db.update(insertDataSql, 1, "John");
Db.update(insertDataSql, 2, "Jane");
// Query data.
List<User> users;
users = User.dao.find("SELECT * FROM TEST_USER");
renderJson(users);
}catch (Exception e){
e.printStackTrace();
}
}
}
package com.oceanbase.testjfinal.pojo;
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User> {
public static final User dao = new User();
}
References
For more information about OceanBase Connector/J, see OceanBase Connector/J.
Download the java-oceanbase-Jfinal sample project