话不多说,直接上代码举例说明
主配置文件方面(这里和xml开发时的配置相同)
<settings>
<!--在主配置文件中开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
<!--在主配置文件中开启Mybatis支持延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
注:必须要在主配置文件里指明接口的位置
<mappers>
<package name="com.nd.dao"></package>
</mappers>
接口上的注解格式:
如果要开启二级缓存,需要主配置文件开启之后,再在接口名上添上如下所示注解(不写该注解则默认为不开启二级缓存):
@CacheNamespace(blocking = true)
public interface IUserDao {
...
}
方法名上的注解(这里实现功能比较复杂的方法,以便展示各个功能的实现方式,简单的方法注解我在另一篇博客里有写,这里附上地址:mybatis的运行流程)
//查询所有的用户及其角色(多对多查询)
@Select("select * from User")
@Results(id="userRoleMap",value={
@Result(property = "userId",column = "id"),
@Result(property = "userName",column = "username"),
@Result(property = "userSex",column = "sex"),
@Result(property = "userAge",column = "age"),
@Result(property = "userBirthday",column = "birthday"),
@Result(property = "userAddress",column = "address"),
@Result(property = "roles",column = "id",many=@Many(select="com.nd.dao.IRoleDao.findRoleByUid",fetchType = FetchType.LAZY))
})
public List<User> findUserAndRole();
首先,第一行 @Select(“select * from User”)是该方法要执行的sql语句。
第二行,@Results注解是指明了返回值类型,id是该返回值类型的唯一标识,其他方法也想返回该返回值,则使用@ResultMap(value=""),value的值写成该id就可以使其注解的函数的返回值为该类型。
再往下,value值为多个@Result()注解,再这个标签里,指明了java实体类和数据库中的表的属性的一一对应的关系。property为java实体类中的属性名,column为数据库中java实体类对应的表的属性名。
最后一行@Result()注解中的many指明了这算是一个多对多或一对多的查询,其中select的值应该为该实体类多对多对应的另一个实体类的接口中的查询方法的全限定方法名。另外fetchType = FetchType.LAZY指定了这个方法要延迟加载,立即加载的指定方式为fetchType = FetchType.EAGER。
(多对一和一对一的多表查询,与以上格式基本相同,只需将many改为one即可)
以上方法是一个多表查询,涉及到另一个接口中的方法注解方式如下:
@Select("select * from role as r where r.id in(select rid from user_role as ur where ur.uid in (#{id}))")
@Results(id="roleMap",value={
@Result(property = "roleId",column = "id"),
@Result(property = "roleName",column = "rolename"),
@Result(property = "roleDesc",column = "roledesc")
})
public List<Role> findRoleByUid(int id[]);
总结
以上各代码的注解及相关实体类和数据库表之间的对应关系如下图所示