目录
1.MyBatis常用注解
分类 | 注解 | 位置 | 对应的XML标签 | 作用 |
---|---|---|---|---|
SQL语句映射 | @select | 方法 | <select> | 标记查询语句 |
@Insert @Update @Delete | <insert> <update> <delete> | 增删改 | ||
结果集映射 | @Results | 方法 | <resultMap> | 结果映射的列表,可指定多个@Result注解 |
@Result | resultType属性 | 指定查询结果集的映射关系 | ||
@ResultType | <resultMap> | 用于指定查询结果集的类型 | ||
@ResultMap | <resultMap> | 标记结果集映射规则 | ||
常用 | @SelectKey | 方法 | 插入后,获取到自增 id 的值 | |
@Options | 指定插入语句的选项,映射语句的属性 | |||
@Param | 参数 | 指定方法参数名称 | ||
关系映射 | @One | 方法 | <association> | 指定一对一关联关系 |
@Many | <collection> | 指定一对多关联关系 | ||
动态SQL | @InsertProvider @UpdateProvider @DeleteProvider @SelectProvider | 方法 | <insert> <update> <delete> <select> | 指定动态生成SQL语句的提供者 |
缓存 | @CacheNamespace | 类 | <cache> | 开启二级缓存 |
2.注解使用方法
首先介绍一下Mybatis注解的使用方法:
- 在全局配置文件里的配置映射
<!--SqlMapConfig.xml-->
<mappers>
<mapper class="com.by.mapper.UserMapper"/>
</mappers>
- 在mapper接口的方法的上面添加注解
//UserMapper
@Select("select * from user where uid = #{uid}")
public User findUserById(int uid);
- 创建会话调用此方法。
public static void main(String[] args){
//1.Resources:加载配置文件
String resource = "SqlMapConfig.xml";
inputStream = Resources.getResourceAsStream(resource);
//2.SqlSessionFactoryBuilder:构建SqlSessionFactory工厂
//3.sqlSessionFactory:创建SqlSession对象
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//4.SqlSession:创建代理对象
sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//执行方法
User user = userMapper.findUserById(1);
System.out.println(user);
}
3.SQL语句映射
@Select
- 作用:标记查询语句。
@Select用于标记查询语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Select注解时,需要在注解中指定SQL语句。
- 示例:
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") Long id);
@Insert
- 作用:标记插入语句。
@Insert用于标记插入语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Insert注解时,需要在注解中指定SQL语句。
- 示例:
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
int addUser(User user);
@SelectKey
-
作用:插入后,获取到自增 id 的值
-
示例:
@Insert("insert into user(id,name) values(#{id},#{name})")
@SelectKey(statement = "select last_insert_id()", keyProperty = "id", keyColumn = "id", resultType = int,before = false)
public int insert(User user);
//@SelectKey 各个属性含义如下。
//statement:表示要运行的 SQL 语句;
//keyProperty:可选项,表示将查询结果赋值给代码中的哪个对象;
//keyColumn:可选项,表示将查询结果赋值给数据表中的哪一列;
//resultType:指定 SQL 语句的返回值;
//before:默认值为 true,在执行插入语句之前,执行 selectlast_insert_id()。
// 值为 flase,则在执行插入语句之后,执行 select last_insert_id()。
@Update
- 作用:标记更新语句。
@Update用于标记更新语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Update注解时,需要在注解中指定SQL语句。
- 示例:
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
int updateUser(User user);
@Delete
- 作用:标记删除语句。
@Delete用于标记删除语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Delete注解时,需要在注解中指定SQL语句。
- 示例:
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteUserById(@Param("id") Long id);
@Param
- 作用:用于指定方法参数名称。
@Param用于为SQL语句中的参数指定参数名称。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Param注解时,需要指定参数名称。
- 示例:
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age);
@Options
- 作用:用于指定插入语句的选项。
@Options用于指定一些可选的配置项。该注解可以用于接口方法或XML文件中,通常与@Insert、@Update、@Delete等注解一起使用。使用@Options注解时,可以指定一些可选的配置项。
- 示例:
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
4.结果集映射
@ResultType
- 作用:用于指定查询结果集的类型。
@ResultType用于指定查询结果的类型。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@ResultType注解时,需要指定查询结果的类型。
- 示例:
@Select("SELECT name, age FROM users WHERE id = #{id}")
@ResultType(User.class)
User getUserById(Long id);
@Results
- 作用:用于指定多个@Result注解。
@Results用于标记结果集映射,该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@Results注解时,需要指定映射规则。
- 示例:
@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id = "userResultMap", value = {
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
User getUserById(@Param("id") Long id);
@Result
- 作用:用于指定查询结果集的映射关系。
@Result用于标记单个属性与结果集中的列之间的映射关系。该注解可以用于接口方法或XML文件中,通常与@Results注解一起使用。使用@Result注解时,需要指定映射规则。
- 示例:
@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id = "userResultMap", value = {
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
User getUserById(@Param("id") Long id);
@ResultMap
- 作用:用于指定查询结果集的映射关系。
@ResultMap用于标记结果集映射规则。该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@ResultMap注解时,需要指定映射规则。
- 示例:
@Select("SELECT * FROM users WHERE id = #{id}")
@ResultMap("userResultMap")
User getUserById(@Param("id") Long id);
5.关系映射
@One
- 作用:用于在一对一关联查询中指定查询结果的映射方式。
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(property = "role", one = @One(resultMap = "userResultMap"))
})
public List<User> findAll();
@Many
作用:用于在一对多关联查询中指定查询结果的映射方式。
示例:
@Mapper
public interface UserDao {
@Results(id = "userResultMap", value = {
@Result(property = "userId", column = "user_id", id = true),
@Result(property = "userName", column = "user_name"),
@Result(property = "accounts", column = "user_id", javaType = List.class,
many = @Many(select = "com.sugarian.dao.AccountDao.findAccountByUserId"))
})
@Select(value = "SELECT * FROM users WHERE user_id=#{id}")
public User findUserById(@Param("id") Integer id);
}
6.动态SQL
@SelectProvider
- 作用:用于指定动态生成SQL语句的提供者。
@SelectProvider是用于在Mapper接口中动态生成查询SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@SelectProvider注解时,需要指定Provider类和Provider方法。
- 示例:
@SelectProvider(type = UserSqlProvider.class, method = "getUserByIdSql")
User getUserById(Long id);
@InsertProvider
- 作用:用于指定动态生成SQL语句的提供者。
@InsertProvider用于在Mapper接口中动态生成插入SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@InsertProvider注解时,需要指定Provider类和Provider方法。
- 示例:
@InsertProvider(type = UserSqlProvider.class, method = "insertUserSql")
int insertUser(User user);
@UpdateProvider
- 作用:用于指定动态生成SQL语句的提供者。
@UpdateProvider用于在Mapper接口中动态生成更新SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@UpdateProvider注解时,需要指定Provider类和Provider方法。
- 示例:
@UpdateProvider(type = UserSqlProvider.class, method = "updateUserSql")
int updateUser(User user);
@DeleteProvider
- 作用:用于指定动态生成SQL语句的提供者。
@DeleteProvider用于在Mapper接口中动态生成删除SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@DeleteProvider注解时,需要指定Provider类和Provider方法。
- 示例:
@DeleteProvider(type = UserSqlProvider.class, method = "deleteUserSql")
int deleteUser(Long id);
7. 缓存
@CacheNamespace
- 作用:主要用于mybatis二级缓存,等同于属性。默认情况下,MyBatis 3 没有开启二级缓存,要开启二级缓存,注解只能写在类前,其中的属性都有自己的默认值。
- 示例:
@CacheNamespace()
public interface StudentMapper(
@Select("select * from student where studentNo = #{studentNo}")
@Options(useCache = true)
List<Student> findById(int studentNo);
}
这样就用注解开启了二级缓存,记得不要忘记在全局配置文件中也要配置一下。
<setting name="cacheEnabled" value="true"/>
属性 | 描述 |
---|---|
eviction | 缓存回收策略,有这几种回收策略: LRU - 最近最少回收,移除最长时间不被使用的对象 FIFO - 先进先出,按照缓存进入的顺序来移除它们 SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象 WEAK - 弱引用,更积极的移除基于垃圾收集器和弱引用规则的对象 |
flushinterval | 缓存刷新间隔,缓存多长时间刷新一次,默认不清空,设置一个毫秒值 |
readOnly | 是否只读;true 只读,MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据 |
size | 指定缓存可存放多少个元素 |
以上就是MyBatis的相关注解及使用示例了,实际开发中不一定每个都能用到,但是可以收藏起来,有备无患嘛!
总的来说,MyBatis的注解是一个非常强大的工具,它可以帮助你减少XML配置的工作量,让你的代码更加简洁、易读。但是,它也有一定的学习成本,你需要花一些时间去理解和掌握它。希望这篇文章能帮助你更好地理解和使用MyBatis的注解。