Mybatis中如何搭建注解式

发布时间:2021-07-30 14:31:01 作者:Leah
来源:亿速云 阅读:142
# Mybatis中如何搭建注解式

## 前言

MyBatis作为一款优秀的持久层框架,提供了多种SQL映射方式。除了传统的XML配置方式外,注解式开发因其简洁性越来越受到开发者青睐。本文将全面讲解如何在MyBatis中搭建注解式开发环境,涵盖基础配置、CRUD操作、动态SQL、关联查询等核心内容。

---

## 一、注解式开发概述

### 1.1 什么是注解式开发
MyBatis注解式开发是指通过在接口方法上添加特定注解(如`@Select`、`@Insert`等)来直接编写SQL语句,无需额外的XML映射文件。

**优势对比:**
| 特性        | XML方式       | 注解方式      |
|------------|--------------|-------------|
| 代码简洁性   | 需要额外XML文件 | 直接写在接口上 |
| 可读性      | SQL与Java分离  | SQL与Java结合 |
| 维护性      | 修改需切换文件  | 集中维护      |
| 动态SQL支持 | 强大          | 有限支持      |

### 1.2 适用场景
- 小型项目或快速原型开发
- SQL语句简单、无复杂动态SQL
- 团队偏好"约定优于配置"的开发模式

---

## 二、环境搭建

### 2.1 基础依赖配置
```xml
<!-- 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.25</version>
    </dependency>
</dependencies>

2.2 核心配置

// SqlSessionFactory配置示例
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = 
    new SqlSessionFactoryBuilder().build(inputStream);

对应的mybatis-config.xml

<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="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 注解接口扫描 -->
    <mappers>
        <mapper class="com.example.mapper.UserMapper"/>
    </mappers>
</configuration>

三、核心注解详解

3.1 CRUD基础注解

查询操作

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
    
    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}

插入操作

@Insert("INSERT INTO users(name,email) VALUES(#{name},#{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);

更新与删除

@Update("UPDATE users SET name=#{name} WHERE id=#{id}")
int updateUser(User user);

@Delete("DELETE FROM users WHERE id=#{id}")
int deleteUser(int id);

3.2 结果映射注解

@Results@Result

@Results(id = "userResultMap", value = {
    @Result(property = "id", column = "user_id"),
    @Result(property = "name", column = "user_name"),
    @Result(property = "email", column = "user_email")
})
@Select("SELECT user_id, user_name, user_email FROM users")
List<User> getUsersWithCustomMapping();

复用结果映射

@ResultMap("userResultMap")
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserWithReusedMapping(int id);

四、高级应用

4.1 动态SQL实现

使用@SelectProvider

public class UserSqlProvider {
    public String getUsersByCondition(final User user) {
        return new SQL(){{
            SELECT("*");
            FROM("users");
            if (user.getName() != null) {
                WHERE("name like #{name} || '%'");
            }
            if (user.getEmail() != null) {
                WHERE("email = #{email}");
            }
        }}.toString();
    }
}

// 接口中使用
@SelectProvider(type = UserSqlProvider.class, method = "getUsersByCondition")
List<User> getUsersByCondition(User user);

4.2 关联查询

一对一关系

@Select("SELECT * FROM orders WHERE id = #{id}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "user", column = "user_id",
            one = @One(select = "com.example.mapper.UserMapper.getUserById"))
})
Order getOrderWithUser(int id);

一对多关系

@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "orders", column = "id",
            many = @Many(select = "com.example.mapper.OrderMapper.getOrdersByUserId"))
})
User getUserWithOrders(int id);

五、最佳实践与注意事项

5.1 性能优化建议

  1. 批量操作:使用@InsertProvider实现批量插入

    @InsertProvider(type = UserSqlProvider.class, method = "batchInsert")
    void batchInsert(List<User> users);
    
  2. 二级缓存:在映射器接口添加缓存注解

    @CacheNamespace(implementation = org.mybatis.caches.ehcache.EhcacheCache.class)
    public interface UserMapper {...}
    

5.2 常见问题解决

问题1:注解SQL过长影响可读性 解决方案: - 使用@SelectProvider拆分复杂SQL - 合理使用字符串拼接(Java15+支持文本块)

问题2:参数绑定错误 正确示范:

@Select("SELECT * FROM users WHERE name = #{param1} AND email = #{param2}")
User getUserByNameAndEmail(String name, String email);

5.3 混合开发模式

可以同时使用XML和注解:

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
    <mapper class="com.example.mapper.AnnotationMapper"/>
</mappers>

六、完整示例代码

6.1 实体类

public class User {
    private Integer id;
    private String name;
    private String email;
    // getters/setters...
}

6.2 Mapper接口

public interface UserMapper {
    @Insert("INSERT INTO users(name,email) VALUES(#{name},#{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectById(Integer id);

    @Update("UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}")
    int update(User user);

    @Delete("DELETE FROM users WHERE id=#{id}")
    int delete(Integer id);
}

6.3 测试类

public class MyBatisTest {
    public static void main(String[] args) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            
            User user = new User();
            user.setName("John");
            user.setEmail("john@example.com");
            
            mapper.insert(user);
            System.out.println("Inserted user with ID: " + user.getId());
            
            User fetchedUser = mapper.selectById(user.getId());
            System.out.println("Fetched user: " + fetchedUser);
        }
    }
}

结语

注解式开发为MyBatis提供了更轻量级的实现方式,特别适合快速开发和简单项目。但需要注意: 1. 复杂SQL仍建议使用XML方式 2. 团队需要统一规范以避免注解泛滥 3. 合理选择开发模式(纯注解/混合模式)

通过本文的全面讲解,相信您已经掌握MyBatis注解式开发的核心要点。建议在实际项目中根据具体需求选择合适的实现方式。

最佳实践提示:对于中型以上项目,推荐采用”基础CRUD使用注解,复杂查询使用XML”的混合开发模式,兼顾开发效率和维护性。 “`

注:本文实际约4500字,完整5300字版本需要扩展更多示例和性能优化细节。建议补充: 1. 更多动态SQL实现示例 2. 与Spring集成配置 3. 分页查询实现 4. 批量操作性能对比测试数据

推荐阅读:
  1. Mybatis中注解怎么用
  2. springboot中怎么实现mybatis注解形式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mybatis

上一篇:如何让ThinkPHP的模板引擎达到最佳效率

下一篇:php-fpm如何开启状态统计

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》