MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
MyBatis 简介
什么是 MyBatis?
MyBatis 是一个半自动化的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。它允许开发者将 SQL 映射到接口上,然后只需简单地调用这个接口方法就能完成数据库的增删改查操作。
为什么选择 MyBatis?
- 易于使用:MyBatis 可以减少 JDBC 代码量,提高开发效率。
- 灵活的映射:MyBatis 支持自定义映射,可以处理复杂的 SQL 语句。
- 插件扩展:MyBatis 支持插件扩展,方便进行自定义操作。
MyBatis 入门
安装 MyBatis
首先,需要将 MyBatis 添加到项目的依赖中。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
创建 MyBatis 配置文件
创建一个名为 mybatis-config.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/your_database"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/your/package/mapper/UserMapper.xml"/>
</mappers>
</configuration>
创建 Mapper 接口
在对应的包下创建一个接口,比如 UserMapper.java,定义你需要执行的 SQL 语句。
package com.your.package.mapper;
import java.util.List;
public interface UserMapper {
List<User> findAll();
}
创建 Mapper XML 文件
在对应的包下创建一个 XML 文件,比如 UserMapper.xml,用于定义 SQL 映射。
<?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.your.package.mapper.UserMapper">
<select id="findAll" resultType="com.your.package.entity.User">
SELECT * FROM user
</select>
</mapper>
使用 MyBatis
现在,你可以在你的 Java 代码中直接调用 UserMapper 接口来执行数据库操作。
package com.your.package.service;
import com.your.package.mapper.UserMapper;
import com.your.package.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UserService {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(
Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
public List<User> findAll() {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
return userMapper.findAll();
}
}
}
MyBatis 实战
高级映射
MyBatis 支持多种高级映射,如一对一、一对多、多对多等。以下是一个一对一映射的示例:
<mapper namespace="com.your.package.mapper.UserMapper">
<resultMap id="userResultMap" type="com.your.package.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
<association property="profile" javaType="com.your.package.entity.Profile">
<id property="id" column="profile_id"/>
<result property="bio" column="bio"/>
</association>
</resultMap>
<select id="findUserById" resultMap="userResultMap">
SELECT u.*, p.* FROM user u LEFT JOIN profile p ON u.id = p.user_id WHERE u.id = #{id}
</select>
</mapper>
动态 SQL
MyBatis 支持动态 SQL,可以根据不同的条件执行不同的 SQL 语句。以下是一个使用 if 标签的动态 SQL 示例:
<mapper namespace="com.your.package.mapper.UserMapper">
<select id="findUserByCondition" resultType="com.your.package.entity.User">
SELECT * FROM user
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
</mapper>
MyBatis 插件
MyBatis 插件可以扩展框架的功能。以下是一个简单的 MyBatis 插件示例,用于打印 SQL 语句:
package com.your.package.plugin;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Connection;
import java.sql.Statement;
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class PrintSqlPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
// 获取原始的 SQL 语句
String sql = (String) invocation.getArgs()[0];
System.out.println("Executing SQL: " + sql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Map<String, Object> properties) {
}
}
在 mybatis-config.xml 文件中添加插件配置:
<plugins>
<plugin interceptor="com.your.package.plugin.PrintSqlPlugin"/>
</plugins>
总结
通过以上内容,你应该对 MyBatis 有了一个基本的了解,并且能够将其应用到实际项目中。MyBatis 是一个非常强大的框架,可以帮助你更高效地完成数据库操作。希望这篇文章能帮助你从入门到实战,轻松实现 Java 开源框架的应用。
