使用注解开发
使用注解开发不需要创建配置SQL语句的xml文件,使用起来比较方便,而且功能齐全,全部语句和映射写在接口文件中
配置环境
修改配置文件,指定带有注解的接口的包名
Configration.xml
<mappers>
<package name="com.my.dao"/>
</mappers>
使用方法
调用方法与前文提到的使用了动态代理的方法相同
常用注解
如果需要向SQL语句传入参数,依旧使用#{}
或${}
@Select
顾名思义,就是书写选择语句的注解,相当于<select>
标签,如果使用模糊查询,传入的参数应该形如getUserByUsername("%小%")
IUser.java
@Select("SELECT * FROM users")
//配置映射关系,id是唯一标识符,id=true说明是id字段
@Results(id="userMap", value = {
@Result(id = true, column = "id", property = "id", jdbcType = JdbcType.INTEGER),
@Result(column = "username", property = "username", jdbcType = JdbcType.VARCHAR),
})
List<User> getUsers();
@Select("SELECT * FROM users WHERE username LIKE #{username}")
//ResultMap用于引用前面已经定义的映射关系
@ResultMap("userMap")
List<User> getUserByUsername(String username);
@Results
配置映射关系的注解,相当于<resultMap>
标签,id
属性是唯一标识符,用于在后面的注解中引用,value
属性是@Result
注解的集合
@Result
与@Results
注解配合使用,相当于<result>
标签,用于配置列名和对象属性名的对应关系,id
用于标识是否是主键与<id>
标签类似,jdbcType
用于指定储存在数据库内的类型
@Update @Delete @Insert
使用方法与@Select
类似,不再赘述
在注解中拼接SQL语句
可以使用xml文件中的拼接标签,但是要加上<script>
父标签
//如需在注解内拼接SQL语句,则要加上<script>标签
@Select("<script>" +
" SELECT * FROM users" +
" <where>" +
" <if test='id != null'>id=#{id}</if>" +
" <if test='username != null'>username=#{username}</if>" +
" </where>" +
"</script>")
@ResultMap("userMap")
List<User> getUsers3(User user);
用注解实现一对多
IAccount.java
添加一个根据uid查询的方法
@Select("SELECT * FROM account WHERE uid = #{uid}")
@Results(id = "accountMap", value = {
@Result(id = true, column = "id",property = "id"),
@Result(column = "uid", property = "uid", jdbcType = JdbcType.INTEGER),
@Result(column = "money", property = "money", jdbcType = JdbcType.DOUBLE),
})
List<Account> getAccountByUid(Integer uid);
IUser.java
修改User类的成员,添加一个Account的集合
@Select("SELECT * FROM users")
@Results(value = {
@Result(id = true, column = "id", property = "id", jdbcType = JdbcType.INTEGER),
@Result(column = "username", property = "username", jdbcType = JdbcType.VARCHAR),
//配置为懒加载
@Result(property = "accounts", column = "id",
many = @Many(select = "com.my.dao.IAccount.getAccountByUid", fetchType = FetchType.LAZY))
})
List<User> getUsers2();
在映射Account集合成员的注解内的column
属性填入需要传入的查询方法的列名,在many
属性中填入@Many
标签,其中的select
属性用于指定查询方法的位置,fectchType
可以选择填入FetchType.LAZY
和FetchType.EAGER
,分别对应延迟加载和立即加载
用注解实现一对一
将@Result
中的many
属性和@Many
注解改为one
和@One
即可,不再赘述
开启二级缓存
配置Configration.xml文件,默认是开启的,所以可以不配置
Configration.xml
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
IUser.java
在接口前添加一条注解
//开启二级缓存
@CacheNamespace(blocking = true)