Programming & Development / April 19, 2025

How to Use MyBatis with an External DataSource (HikariCP + Mapper Example)

MyBatis HikariCP MySQL example MyBatis XML mapper with DataSource MyBatis integration with connection pool MyBatis with external DataSource SqlSessionFactory config Java

๐Ÿ“Œ 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.



Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex