Mybatis 的注解开发和 xml 配置在使用原理上是相同的,注解开发只是将在 xml 中配置的信息转移到注解上进行配置而已。
- MyBatis 配置:可以直接引入接口类,也可以引入所在的包(MyBatis 会自动扫描包下的接口类)。
<mappers>
<!-- <mapper class="com.lyj.mapper.UserMapper"/>-->
<package name="com.lyj.mapper"/>
</mappers>
注意,如果我们某个接口使用了注解开发,就不能再使用映射文件进行配置,即两种方式只能选择其中一种。
1、单表CRUD
1.1 查询所有数据
// 查询User表全部信息
@Select("SELECT * FROM user")
public List<User> findAll();
1.2 根据id查询数据
// 根据id查询表
@Select("SELECT * FROM user WHERE id = #{id}")
public User findById(Integer id);
1.3 模糊查询
// 根据用户名模糊查询
@Select("SELECT * FROM user WHERE username LIKE #{name}")
public List<User> findByName(String name);
1.4 更新数据
// 更新用户数据
@Update("UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id}")
public int updateUser(User user);
1.5 添加数据
// 添加用户
@Update("INSERT INTO user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})")
public void addUser(User user);
1.6 删除数据
// 根据id删除用户
@Delete("DELETE FROM user WHERE id = #{id}")
public int deleteUser(Integer id);
1.7 查询用户总数
// 查询用户总数
@Select("SELECT count(id) FROM user")
int countUser();
1.8 实体类属性与表列名的映射配置
// 查询User表全部信息
@Select("SELECT * FROM user")
@Results(id = "userMap",value = {
@Result(id = true,property = "my_id",column = "id"),
@Result(property = "my_username",column = "username"),
@Result(property = "my_birthday",column = "birthday"),
@Result(property = "my_sex",column = "sex"),
@Result(property = "my_address",column = "address"),
})
public List<MyUser> findMyAll();
- @Results :定义映射结果集,id 属性为唯一标识,value 属性用于接收 @Result[] 注解类型的数组。
- @Result:定义实体类属性和表列名的映射,id 属性为主键标识。
- @ResultMap :用于引用 @Results 定义的映射结果集,避免了重复定义映射结果集。
2、复杂查询
2.1 多对一(一对一)查询实现
- AccountMapper
public interface AccountMapper {
// 查询账户表和每个账户关联的用户信息
@Select("SELECT * FROM account")
@Results(id = "AccountMap", value = {
@Result(id = true, property = "id", column = "id"),
@Result(property = "uid", column = "uid"),
@Result(property = "user", column = "uid",
one = @One(select = "com.lyj.mapper.UserMapper.findUserById", fetchType = FetchType.EAGER))
})
public List<Account> findAll();
...
}
- @One:相当于标签 association ,用来指定子查询返回单一对象的语句。
- select 属性:指定用于子查询的接口方法。
- fetchType 属性:用于指定是立即加载(FetchType.EAGER)或延迟加载(FetchType.LAZY)。
- UserMapper
public interface UserMapper {
...
// 根据id查询单个用户
@Select("SELECT * FROM user WHERE id = #{id}")
public User findUserById(Integer uid);
}
2.2 一对多查询实现
- UserMapper
public interface UserMapper {
// 查询User表和每个用户关联的账户信息
@Select("SELECT * FROM user")
@Results(id = "userMap", value = {
@Result(id = true, property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "sex", column = "sex"),
@Result(property = "address", column = "address"),
@Result(property = "accounts", column = "id",
many = @Many(select = "com.lyj.mapper.AccountMapper.findAccountsByUid", fetchType = FetchType.LAZY))
})
public List<User> findAll();
...
}
- @Many:相当于标签 collection ,用来指定子查询返回对象集合的语句。
- AccountMapper
public interface AccountMapper {
...
// 根据uid查询账户信息
@Select("SELECT * FROM account WHERE uid = #{uid}")
public List<Account> findAccountsByUid(Integer uid);
}
2.3 二级缓存开启
- MyBatis 配置:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 映射接口中开启注解:
@CacheNamespace(blocking = true)
public interface UserMapper {
...
}