mybatis 的常用注解说明
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与
- @Result 一起使用,封装多个结果集
- @ResultMap:实现引用
- @Results 定义的封装
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
- @SelectProvider: 实现动态 SQL 映射
- @CacheNamespace:实现注解二级缓存的使用
使用 Mybatis 注解实现基本 CRUD
- 注解开发就是不用配置文件,直接通过在接口中方法上用注解,可以直接使用方法
- 需要在SqlMapConifg.xml中加上一下配置
<!-- 配置 dao 接口的位置,它有两种方式
第一种:使用 mapper 标签配置 class 属性
第二种:使用 package 标签,直接指定 dao 接口所在的包
-->
<package name="com.lwb.dao"/>
- 查询
@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();
- 修改
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ")
int updateUser(User user);
- 保存
@Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address}
)")
@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before = false, statement = { "select last_insert_id()" })
int saveUser(User user);
- 删除
@Delete("delete from user where id = #{uid} ")
int deleteUser(Integer userId);
- 根据一个ID查询
@Select("select * from user where id = #{uid} ")
@ResultMap("userMap")
User findById(Integer userId);
使用注解实现复杂关系映射开发
- 复杂注解的介绍:
- @Results 注解:代替的是标签
<resultMap>
- 该注解中可以使用单个@Result 注解,也可以使用@Result 集合
- @Results({@Result(),@Result()})
- @Results(@Result())
- @Resutl 注解:代替了
<id>
标签和<result>
标签
- @Result 中 属性介绍:
- id 是否是主键字段
- column 数据库的列名
- property 需要装配的属性名
- one 需要使用的@One 注解:(@Result(one=@One)()))
- many 需要使用的@Many 注解:(@Result(many=@many)()))
- @One 注解(一对一):代替了
<assocation>
标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
- @One 注解属性介绍:
- select 指定用的 来多表查询的 sqlmapper
- fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
- 使用格式:
- @Result(column=" “,property=”",one=@One(select=""))
- @Many 注解(多对一):代替了
<Collection>
标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。
- 注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;
- 使用格式:@Result(property="",column="",many=@Many(select=""))
- 一对一查询
@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();
- 一对多查询
@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();
mybatis 基于注解的二级缓存
- 在 在 SqlMapConfig 中开启二级缓存支持
<!-- 配置二级缓存 -->
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
- 在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true)
public interface IUserDao {}