Mybatis注解
背景
之前在学习的时候一直偏重于在映射文件中编写大量的sql,但是对于模块需要的sql语句比较简短,使用注解似乎效率似乎更高,还不需要创建对应的映射文件。所以在本文中,我重点学习低中等级的知识,对于高级部分只是简单了解。对于简单的可以使用基于注解的方式,稍微复杂的就选择映射方式。
以上是本人的个人观点,知识无穷尽,但人的精力是有限的。
由于已经具备了一些基础,所以下面的注解都是以例子的形式出现。
mybatis使用注解和使用映射文件的区别
基于xml的方式
必须有个一个XxxMapper.xml与之对应,方法名对应xml中的id,方法入参和方法出参都必须对应起来,很容易出问题。我们在开发的时候有的是可以使用代码生成器生成,但是有的是必须自己手写,有的公司也是要求必须手写,所以这里需要注意。
基于注解的方式
不需要
XxxMapper.xml文件,只需要在对应XxxMapper.java中的方法上加上注解就搞定了,但是这里是有坑的。毕竟把sql放到了我们的Java代码里了。
注意: 对于同一个java方法,映射和注解只能选其一,如果都选,则报错。
mybatis常用注解
| 注解 | 说明 |
|---|---|
| @Insert | 实现新增 |
| @Delete | 实现删除 |
| @Update | 实现更新 |
| @Select | 实现查询 |
| @Result | 实现结果集封装 |
| @ResultMap | 实现引用@Results 定义的封装 |
| @Results | 实现结果集封装 |
| @One | 实现一对一结果集封装 |
| @Many | 实现一对多结果集封装 |
| @SelectProvider | 实现动态 SQL 映射 |
| @CacheNamespace | 实现注解二级缓存的使用 |
mybatis的所有注解
简单注解使用
@Insert
插入sql,和 xml insert sql语法完全一致
@Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
void saveUser(User user);
@Delete
@Delete("delete from user where id=#{id}")
void deleteUser(Integer userId);
@Update
@Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
void updateUser(User user);
@Select
@Select("select * from user where id=#{id}")
User findById(Integer userId);
@Select("select * from user where username like '%${value}%'") //字符串拼接
List findByName(String username);
@Options
该注解一般用在两种场景:
- 设置缓存时间
- 为对象生成自增的主键值
@Insert("insert into user(id,name) values(#{id},#{name})")
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
public int insert(User user);
@SelectKey
@SelectKey为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。
其两大作用:
- 生成主键
- 获取刚刚插入数据的主键
@Insert("insert into user(id,name) values(#{id},#{name})")
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
@SelectKey(statement = "select last_insert_id()" ,keyProperty = "id",keyColumn = "id",resultType = int.class,before = false)
public int insert(User user);
/*
before属性,默认是true,在执行插入语句之前,执行select last_insert_id()。如果设置为flase,则在插入这个语句之后,执行select last_insert_id()
*/
参考文档
如果想知道结果集相关的注解使用,可以去看看下面的文章,里面都有讲到。
Mybatis注解开发(超详细)_牛哄哄的柯南的博客-CSDN博客_mybatis注解开发
Mybatis常用的11中注解—Mybatis中文网