MyBatis ORM Framework Implementation

MyBatis Core Concepts

MyBatis is a Java persistence framework that simplifies database interactions through SQL mapping. As a semi-automated ORM tool, it bridges Java objects and relasional databases by mapping:

  • Objects: Java application entities
  • Relations: Database table structures
  • Mappping: Bidirectional conversion between records and objects

Basic Configuration Setup

Core Configuration (config.xml)

<configuration>
  <environments default="dev">
    <environment id="dev">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/app_db"/>
        <property name="username" value="admin"/>
        <property name="password" value="securepass"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="VehicleMapper.xml"/>
  </mappers>
</configuration>

SQL Mapping (VehicleMapper.xml)

<mapper namespace="vehicleData">
  <insert id="addVehicle">
    INSERT INTO vehicle_table 
      (identifier, registration, model, price, manufacture_date, fuel_type)
    VALUES 
      (null, 'VH300', 'Tesla Model S', 85000.00, '2023-05-20', 'Electric')
  </insert>
</mapper>

Execution Workflow

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream configStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory factory = builder.build(configStream);

try (SqlSession session = factory.openSession()) {
  int records = session.insert("vehicleData.addVehicle");
  session.commit();
}

CRUD Operations

Parameter Handling

<!-- Insert with parameters -->
<insert id="addVehicle">
  INSERT INTO vehicle_table VALUES (
    null, 
    #{registrationId}, 
    #{modelName}, 
    #{basePrice}, 
    #{productionDate}, 
    #{energySource}
  )
</insert>

Result Mapping

<select id="getVehicle" resultType="com.example.model.Vehicle">
  SELECT 
    identifier,
    registration AS regId,
    model,
    price AS basePrice,
    manufacture_date AS productionDate,
    fuel_type AS energySource
  FROM vehicle_table
  WHERE identifier = #{id}
</select>

Dynamic SQL Features

Conditional Queries

<select id="findVehicles" resultType="Vehicle">
  SELECT * FROM vehicle_table
  <where>
    <if test="modelName != null">
      AND model LIKE CONCAT('%', #{modelName}, '%')
    </if>
    <if test="maxPrice != null">
      AND price <= #{maxPrice}
    </if>
  </where>
</select>

Batch Operations

<insert id="insertBatch">
  INSERT INTO vehicle_table VALUES
  <foreach item="item" collection="vehicles" separator=",">
    (null, #{item.regId}, #{item.model}, #{item.price}, 
     #{item.prodDate}, #{item.energyType})
  </foreach>
</insert>

Advanced Mapping

One-to-Many Relationship

<resultMap id="DealerResult" type="Dealer">
  <id property="dealerId" column="dealer_id"/>
  <collection property="vehicles" ofType="Vehicle">
    <id property="vehicleId" column="vehicle_id"/>
    <result property="model" column="model_name"/>
  </collection>
</resultMap>

Caching Mechanisms

Configuration

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
</settings>

<mapper namespace="VehicleMapper">
  <cache eviction="LRU" flushInterval="60000" size="512"/>
</mapper>

Tags: MyBatis SQL Mapping Java Persistence ORM Dynamic SQL

Posted on Sun, 09 Aug 2026 16:38:31 +0000 by carsonk