๐ Problem
You want to integrate MyBatis with a custom DataSource (like HikariCP) and use XML-based mappers to interact with a relational database (e.g., MySQL).
Your goals:
- Connect to a database using a connection pool.
- Separate SQL statements from Java code using XML mappers.
- Maintain clean and scalable configuration.
๐ Solution Overview
You will:
- Add required dependencies (MyBatis, MySQL, HikariCP).
- Configure the
DataSource
using HikariCP. - Load MyBatis configuration via
mybatis-config.xml
. - Use a mapper interface + XML file for SQL operations.
- Call the mapper in a Java application.
๐งฑ Step 1: Add Maven Dependencies
xml
<!-- MyBatis Core -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MyBatis Spring Support (Optional, for Spring users) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- HikariCP (Connection Pool) -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
๐ง Step 2: Configure DataSource Using HikariCP
java
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
public class DataSourceConfig {
public static DataSource getDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("password");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
config.setIdleTimeout(30000);
return new HikariDataSource(config);
}
}
โ๏ธ Step 3: MyBatis Configuration File (mybatis-config.xml
)
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mappers/UserMapper.xml"/>
</mappers>
</configuration>
๐งฉ Step 4: Mapper Interface (UserMapper.java)
java
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
public interface UserMapper {
User getUserById(int id);
void insertUser(User user);
}
๐ Step 5: Mapper XML File (UserMapper.xml
)
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<select id="getUserById" parameterType="int" resultType="User">
SELECT id, name FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (id, name) VALUES (#{id}, #{name})
</insert>
</mapper>
๐ค Step 6: Create the User
POJO
java
public class User {
private int id;
private String name;
// Getters & Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
๐งช Step 7: SqlSessionFactory and Mapper Usage
java
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MyBatisExample {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
// Insert a new user
User user = new User();
user.setId(1);
user.setName("John Doe");
userMapper.insertUser(user);
session.commit();
// Retrieve the user
User fetched = userMapper.getUserById(1);
System.out.println("โ
User fetched: " + fetched.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
โ
Output
sql
โ
User fetched: John Doe
๐ง Key Highlights
ComponentRoleHikariCPEfficient connection poolingmybatis-config.xmlCentral MyBatis configurationMapper InterfaceMaps methods to SQL statementsMapper XMLClean separation of SQL from Java codeSqlSessionExecutes SQL and manages transactions
๐ก๏ธ Best Practices
- Store DB credentials securely (e.g., in
application.properties
or environment variables). - For complex projects, consider Spring Boot +
MyBatis-Spring
. - Always close SqlSession to avoid leaks (use try-with-resources).
- For read-heavy workloads, tune connection pool settings in HikariCP.