简介
- 本质是反射机制
- 底层是动态代理
UserMapper.java
public interface UserMapper {
@Select("select * from user")
List<User> getUserList();
}
mybatis-config.xml
<mappers>
<mapper class="com.indi.dao.UserMapper"/>
</mappers>
UserMapperTest.java
@Test
public void getUserList(){
userMapper.getUserList().forEach(System.out::println);
}
CRUD
BaseUtils.java
public static SqlSession getSqlSession() {
//设置自动提交事务
return sqlSessionFactory.openSession(true);
}
UserMapper.java
public interface UserMapper {
@Select("select * from user")
List<User> getUserList();
//方法存在多个参数,所有的参数前面必须加上@param("id")注解,具体使用以@param()内的值为准
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id = #{id}")
int deleteUserById(@Param("id") int id);
}
UserMapperTest.java
//直接调用对应方法传参即可
@Param()注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不用加
- 如果只有一个基本类型的话,可以忽略,但是建议加上
- 在SQL中引用的就是@Param()中设定的属性名
注解实现复杂映射
@Results注解
代替了xml中的<resultMap>标签
该注解中可以使用单个@Result注解,也可以使用@Result集合
@Results的属性:
id 为当前Results设置一个唯一标识,可供其它接口引用
value 就是多个@Result组成的集合
@Result注解
代替了<id>标签和<result>标签
@Result的属性:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
@ResultMap注解
引用设置好的@Results注解
@ResultMap的属性:
value 需要使用的Results的id标识
PS: value只有一个属性的时候,可以省略value={}
举例:解决数据库字段与实体类中不一致的问题
@Select("select * from user")
@Results(id = "userMap", value = {
@Result(id = true, column = "id", property = "userID"),
@Result(column = "username", property = "userName")
})
List<User> findAll();
@Select("select * from user where id = #{id}")
@ResultMap("userMap")
User findByID(int id);
注解实现一对一*
设置Result的one属性的select与fetchType实现一对一
在一对一中,etchType通常使用EAGER
AccountMapper.java
public interface AccountMapper {
@Results(id = "accountMap", value = {
@Result(property = "user", column = "uID", one = @One(select = "com.indi.dao.UserMapper.findByID", fetchType = FetchType.EAGER))
})
List<Account> findAll();
}
UserMapper.java
public interface UserMapper {
@Select("select * from user where id = #{id}")
@ResultMap("userMap")
User findByID(int id);
}
注解实现一对多*
设置Result的one属性的select与fetchType实现一对多
在一对多中,etchType通常使用LAZY
UserMapper.java
public interface UserMapper {
@Select("select * from user")
@Results(id = "userMap", value = {
@Result(property = "accounts",column = "id",many = @Many(select = "com.indi.dao.AccountMapper.findAcountByUID",
fetchType = FetchType.LAZY))
})
List<User> findAll();
}
AccountMapper.java
public interface AccountMapper {
@Select("select * from account where uid = #{userID}")
List<Account> findAcountByUID(Integer userID);
}
注解使用二级缓存
/**
* 在需要使用二级缓存的接口类上添加引用
*/
@CacheNamespace(blocking = true)
public interface UserMapper {
}