MyBatis详解以及在IDEA中的开发

发布于:2025-07-17 ⋅ 阅读:(22) ⋅ 点赞:(0)

MyBatis概述

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程。

核心特点

优势:

  • SQL语句与Java代码分离,便于维护
  • 支持动态SQL,灵活性高
  • 提供了强大的映射功能
  • 与Spring框架集成良好
  • 学习成本相对较低

与其他框架对比:

  • 相比Hibernate:更轻量级,SQL可控性更强
  • 相比JDBC:减少了大量样板代码
  • 相比JPA:更适合复杂查询和性能优化

MyBatis核心组件

1. SqlSessionFactory

// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2. SqlSession

// 获取SqlSession
SqlSession session = sqlSessionFactory.openSession();
try {
    // 执行操作
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(1);
} finally {
    session.close();
}

3. Mapper接口

public interface UserMapper {
    User selectUser(int id);
    List<User> selectAllUsers();
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

4. 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="com.example.mapper.UserMapper">
    <select id="selectUser" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    
    <insert id="insertUser" parameterType="User">
        INSERT INTO users (name, email) VALUES (#{name}, #{email})
    </insert>
</mapper>

IDEA中的MyBatis开发

1. 项目创建与依赖配置

Maven依赖:

<dependencies>
    <!-- MyBatis核心依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    
    <!-- 数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- Spring Boot集成(可选) -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.2</version>
    </dependency>
</dependencies>

2. IDEA插件推荐

MyBatis相关插件:

  • MyBatis Log Plugin:日志格式化显示
  • MyBatis Mapper Generator:代码生成
  • Free MyBatis Plugin:XML与Mapper跳转
  • MyBatis Plus:增强功能支持

3. 配置文件设置

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/mybatis_db"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

4. 实体类设计

public class User {
    private Integer id;
    private String name;
    private String email;
    private Date createTime;
    
    // 构造方法、getter、setter省略
}

5. Mapper接口与XML映射

UserMapper.java:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectById(Integer id);
    
    List<User> selectAll();
    
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);
    
    void update(User user);
    
    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteById(Integer id);
}

UserMapper.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="com.example.mapper.UserMapper">
    
    <resultMap id="userResultMap" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    
    <select id="selectAll" resultMap="userResultMap">
        SELECT id, name, email, create_time FROM users
    </select>
    
    <update id="update" parameterType="User">
        UPDATE users SET 
            name = #{name},
            email = #{email}
        WHERE id = #{id}
    </update>
    
    <!-- 动态SQL示例 -->
    <select id="selectByCondition" parameterType="User" resultMap="userResultMap">
        SELECT * FROM users
        <where>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT('%', #{name}, '%')
            </if>
            <if test="email != null and email != ''">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>

动态SQL详解

1. if标签

<select id="selectByCondition" parameterType="User" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

2. choose、when、otherwise

<select id="selectByIdOrName" parameterType="User" resultType="User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="id != null">
                id = #{id}
            </when>
            <when test="name != null and name != ''">
                name = #{name}
            </when>
            <otherwise>
                1 = 1
            </otherwise>
        </choose>
    </where>
</select>

3. foreach标签

<select id="selectByIds" parameterType="list" resultType="User">
    SELECT * FROM users WHERE id IN
    <foreach collection="list" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>

Spring Boot集成

1. 配置文件

# application.yml
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true
    
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_db
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

2. 主启动类

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. Service层实现

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    public User getUserById(Integer id) {
        return userMapper.selectById(id);
    }
    
    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }
    
    @Transactional
    public void saveUser(User user) {
        userMapper.insert(user);
    }
}

IDEA开发技巧

1. 代码生成器使用

MyBatis Generator配置:

<generatorConfiguration>
    <context id="MySQLTables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis_db"
                        userId="root"
                        password="password"/>
        
        <javaModelGenerator targetPackage="com.example.entity" 
                           targetProject="src/main/java"/>
        
        <sqlMapGenerator targetPackage="mapper" 
                        targetProject="src/main/resources"/>
        
        <javaClientGenerator type="XMLMAPPER" 
                           targetPackage="com.example.mapper" 
                           targetProject="src/main/java"/>
        
        <table tableName="users" domainObjectName="User"/>
    </context>
</generatorConfiguration>

2. 调试技巧

  • 使用MyBatis Log Plugin查看SQL执行情况
  • 在IDEA中设置断点调试Mapper方法
  • 利用Database工具直接测试SQL语句

3. 性能优化

  • 合理使用缓存机制
  • 避免N+1查询问题
  • 使用批量操作提高效率
  • 监控SQL执行计划
  1. 命名规范:Mapper接口与XML文件保持一致的命名
  2. 事务管理:合理使用@Transactional注解
  3. 异常处理:统一处理数据访问异常
  4. 参数验证:在Service层进行业务逻辑验证
  5. 日志记录:记录关键操作的执行日志

网站公告

今日签到

点亮在社区的每一天
去签到