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>