您好,登录后才能下订单哦!
# 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>
// 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>
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);
@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);
@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);
@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);
批量操作:使用@InsertProvider
实现批量插入
@InsertProvider(type = UserSqlProvider.class, method = "batchInsert")
void batchInsert(List<User> users);
二级缓存:在映射器接口添加缓存注解
@CacheNamespace(implementation = org.mybatis.caches.ehcache.EhcacheCache.class)
public interface UserMapper {...}
问题1:注解SQL过长影响可读性
解决方案:
- 使用@SelectProvider
拆分复杂SQL
- 合理使用字符串拼接(Java15+支持文本块)
问题2:参数绑定错误 正确示范:
@Select("SELECT * FROM users WHERE name = #{param1} AND email = #{param2}")
User getUserByNameAndEmail(String name, String email);
可以同时使用XML和注解:
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
<mapper class="com.example.mapper.AnnotationMapper"/>
</mappers>
public class User {
private Integer id;
private String name;
private String email;
// getters/setters...
}
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);
}
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. 批量操作性能对比测试数据
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。