文章目录
Mybatis的注解开发
(1)注解使用说明:
这几年来注解开发越来越流行,Mybatis 也可以使用注解开发方式,
这样我们就可以减少编写 Mapper 映射文件了。
(注解进行开发,就是进行代替映射的xml文件,不写xml文件也可以进行使用Mybatis)
常见的注解:
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
注意的问题:
(1) 当在项目中配置了映射文件(在与接口在同样的目录结构下),在主配置文件中说明使用注释开发:会报错 ,虽然没有使用那个映射文件,但是还是在mybatis中进行加载
解决方法: 删除该映射文件或者不把映射文件放到与接口相同的目录结构下
(2)在写注解的时候,没有说明要封装的数据类型,和传入的形参,Mybatis怎么知道的????
mybatis在解析的时候,找到接口,在找到对应的方法,通过反射得到上面的注解信息,
还有的得到方法的返回类型和形参类型
(2)使用注解进行CRUD操作:
@Insert:实现新增
@Delete:实现删除
@Select:实现查询
@Update:实现更新
在使用注解的时候,要传入一个值value,@Select(value="相应的sql语句"),
其实value关键字写不写都可以,直接@Select("相应的sql语句")
(3)解决实体类和数据库的映射关系
@Results:
可以与@Result 一起使用,封装多个结果集,代替的是标签<resultMap>,
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
属性:
id属性定义一个唯一标准,方便后面的@Results的复用
怎么复用:
直接让value属性等于该id value={“MapId”} ,数组中只有一个元素直接写id就好
value属性:是一个数组,每一个数组的值为@Result
使用格式:
@Results({@Result(),@Result()})或 @Results(@Result())
@Result:
实现结果集封装,数据库中的什么数据对应实体类中的什么数据,
写好里面的column属性和property属性,和id属性(写一个就好),
代替了 <id> 标签和<result> 标签
属性:
id属性:是否是主键字段(默认为false)
column属性: 数据库表对应的列名
property属性:实体类相对应的属性,或者为 需要装配的属性名
@Select("select * from user")
@Results(
id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday")
})
List<User> findAll()
@Select("select * from user")
//@Results(valude="userMap")
//或者
@Results("userMap")
User findById(int UserId);
(4)一对多的配置
(在mybatis的多对一,就是一对一)怎么实现多对一????
主要就是进行对映射关系的配置
实现类里面有一个属性为User实体类对象,该如何进行配置???
@One 注解(一对一)
@One 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
属性:
select 指定用的 来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:
@Result(column=" ",property="",one=@One(select=""))
//封装的Account实体类中中有一个User实体类对象
@Select("select * from account")
@Results(id="accountMap",
value= {
@Result(id=true,column="id",property="id"),
@Result(column="uid",property="uid"),
@Result(column="money",property="money"),
@Result(column="uid", property="user",one=@One(select="com.itheima.dao.IUserDao.findById", fetchType=FetchType.LAZY))
})
List<Account> findAll();
(5)一对多的配置
@Many 注解(多对一)
@Many 代替了<Collection> 标签, 是多表查询的关键,在注解中用来指定子查询返回对象集合。
属性:
select属性:代表将要执行的 方法的全限定方法名
etchType属性:代表加载方式,加载的时机,一般如果要延迟加载都设置为 LAZY 的值
注意:
聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,
属性的 javaType (一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))
//封装的User实体类中有一个List<Account>集合对象
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday"),
@Result(column="id",property="accounts",many=@Many(select="com.itheima.dao.IAccountDao.findByUid",fetchType=FetchType.LAZY))
})
List<User> findAll();
(6)动态SQL语句的配置
@SelectProvider: 实现动态 SQL 映射
(7)注解配置缓存
一级缓存不需要配置他自己就已经有了,怎么通过注解实现二级缓存的配置??
@CacheNamespace:
实现注解二级缓存的使用(不需要向xml文件一样,配置当前文件和方法可以使用二级缓存)
属性:
blocking属性: 是否开启二级缓存
在主配置文件中配置Mybatis支持二级缓存:
<!-- 配置二级缓存 -->
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
方法上支持二级缓存:
//mybatis 基于注解方式实现配置二级缓存
@CacheNamespace(blocking=true)
public interface IUserDao {}