简介:
在MyBatis中,可以通过在映射器接口上使用注解来定义SQL语句,从而避免使用XML映射文件。
一、基础 CRUD 注解
1. @Insert:执行插入操作。
• 示例场景:简单单表插入。
• 补充说明:配合@Options(useGeneratedKeys=true, keyProperty="id")返回自增主键。
• 示例:
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
2. @Delete:执行删除操作。
• 示例场景:根据条件删除记录(如按 ID 删除)。
• 示例:
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUserById(Long id);
3. @Select:执行查询操作。
• 示例场景:单表查询、条件查询。
• 示例:
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(Long id);
4. @Update:执行更新操作。
• 示例场景:更新记录字段。
• 示例:
@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")
int updateUser(User user);
二、结果映射注解
1. @Results和@Result
• 用途:将查询结果映射到 Java 对象属性(解决数据库表的列名与Java对象的属性名不一致问题)。
• 示例场景:数据库表列名与实体类属性名不同(如user_name→userName)。
• 说明:
• @Results:定义多个列与属性的映射关系。
• @Result:定义单个映射关系,支持column(列名)、property(属性名)、id=true(标记主键)等。
• 示例:
@Results({
@Result(column = "user_id", property = "id", id = true),
@Result(column = "user_name", property = "userName"),
@Result(column = "user_age", property = "age")
})
@Select("SELECT user_id, user_name, user_age FROM user WHERE id = #{id}")
User selectUserWithCustomMapping(Integer id);
2. @One(一对一关联)
• 用途:实现一对一关联查询(如用户与部门)。
• 示例场景:查询用户时关联部门信息。
• 说明:通过select属性指定关联查询方法。
• 示例:
@Result(column = "dept_id", property = "department",
one = @One(select = "com.example.mapper.DeptMapper.selectDeptById"))
3. @Many(一对多关联)
• 用途:实现一对多关联查询(如用户与订单)。
• 示例场景:查询用户时关联其订单列表。
• 示例:
@Result(column = "user_id", property = "orders",
many = @Many(select = "com.example.mapper.OrderMapper.selectOrdersByUserId"))
三、动态 SQL 提供者注解
通过 Java 方法动态生成 SQL(适合复杂场景)。
@InsertProvider/@DeleteProvider/@SelectProvider/@UpdateProvider
• 用途:通过 Provider 类动态生成 SQL。
• 示例场景:复杂条件查询、批量操作。
• 说明:type:指定 Provider 类。
method:指定 Provider 类中的方法名。
• 示例:
// Provider 类
public class UserSqlProvider {
public String insertUser(User user) {
return new SQL() {{
INSERT_INTO("user");
if (user.getName() != null) VALUES("name", "#{name}");
if (user.getAge() != null) VALUES("age", "#{age}");
}}.toString();
}
}
@InsertProvider(type = UserSqlProvider.class, method = "insertUser")
int insertUser(User user);
四、其他常用注解
1. @Options
• 用途:配置操作属性(如主键回填、超时时间、事务隔离级别等)。
• 示例:
@Insert("INSERT INTO user(name) VALUES(#{name})")
@Options(useGeneratedKeys = true, keyProperty = "id", timeout = 5000)
int insertUser(User user);
2. @Param
• 用途:当方法有多个参数时,指定参数名(避免混淆)。
• 示例:
User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age);
@Select("SELECT * FROM user WHERE name = #{name} AND age = #{age}")
3. @ResultMap
• 用途:注解与 XML 共存(可通过@ResultMap引用 XML 中的<resultMap>,实现混合使用。)
• 示例:
@ResultMap("com.example.mapper.UserMapper.userResultMap")
User selectUserWithXmlMapping(Long id);
五、总结