MyBatis是一款优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,简单的Java对象)映射成数据库中的记录。
一、MyBatis简介
1.1 MyBatis的核心功能
- ORM(对象关系映射):MyBatis可以将Java对象映射到数据库表。
- 自定义SQL:支持自定义SQL语句,灵活处理复杂查询。
- 动态SQL:支持动态SQL语句的编写,如if、choose、foreach等。
- 缓存机制:提供一级缓存和二级缓存机制,提高查询效率。
- 插件扩展:支持插件扩展,如分页插件、日志插件等。
1.2 MyBatis的优势
- 简洁性:MyBatis的配置和映射文件相对简洁,易于理解和维护。
- 灵活性:支持多种SQL语句和XML配置,满足各种复杂查询需求。
- 性能:通过缓存机制提高查询效率,适用于高性能场景。
二、MyBatis入门
2.1 环境搭建
- Java开发环境:确保Java环境已正确安装。
- Maven或Gradle:使用Maven或Gradle管理依赖。
- MyBatis依赖:在pom.xml或build.gradle文件中添加MyBatis依赖。
<!-- Maven依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
2.2 MyBatis配置
- 配置文件:创建mybatis-config.xml文件,配置数据库连接、事务管理、映射文件路径等。
- 映射文件:创建XML映射文件,定义SQL语句和Java对象之间的映射关系。
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
2.3 编写Mapper接口
创建一个Mapper接口,定义与数据库表对应的CRUD(Create、Read、Update、Delete)操作。
package com.example.mapper;
import com.example.model.User;
public interface UserMapper {
int insert(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKey(User record);
int deleteByPrimaryKey(Integer id);
}
2.4 编写XML映射文件
在XML映射文件中定义SQL语句和Java对象之间的映射关系。
<?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="com.example.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.model.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
</resultMap>
<sql id="Base_Column_List">
id, name, age
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.User">
insert into user (id, name, age)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
</insert>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
update user
<set>
<if test="name != null">
name = #{name,jdbcType=VARCHAR},
</if>
<if test="age != null">
age = #{age,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete>
</mapper>
三、MyBatis进阶
3.1 动态SQL
MyBatis支持动态SQL,通过XML标签实现条件的动态拼接。
<select id="selectByCondition" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
<where>
<if test="name != null">
and name like '%' || #{name} || '%'
</if>
<if test="age != null">
and age = #{age}
</if>
</where>
</select>
3.2 缓存机制
MyBatis提供一级缓存和二级缓存机制,提高查询效率。
- 一级缓存:在同一个SqlSession中,对相同的数据进行查询,缓存该数据,后续查询直接从缓存中获取。
- 二级缓存:在同一个namespace中,对相同的数据进行查询,缓存该数据,后续查询直接从缓存中获取。
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
3.3 插件扩展
MyBatis支持插件扩展,如分页插件、日志插件等。
- 分页插件:MyBatis-PageHelper
- 日志插件:log4j、logback
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
public class UserMapper {
@Before("execution(* com.example.mapper.UserMapper.*(..))")
public void startPage() {
PageHelper.startPage(1, 10);
}
}
四、总结
MyBatis是一款功能强大、易于使用的Java持久层框架,能够有效地简化数据库操作,提高开发效率。通过本文的介绍,相信你已经对MyBatis有了初步的了解。在实际开发中,不断学习、实践和总结,你将能够更好地掌握MyBatis,并将其应用于各种项目中。
