带你学习Mybatis之使用注解方式



使用注解方式

有些人习惯于用映射文件xml方式配置,有些人习惯于使用注解的方式来编写映射语句,这里来说明一下注解的使用方式

@Insert注解

用于定义insert语句,作用等同于xml配置中<insert>标签

@Insert("insert  into classes (name) values (#{name})")
@Options(useGeneratedKeys = true,keyProperty = "id") // 使用@Options来设置主键自增
int insertClasses(Classes classes);

@Update注解

用于定义update语句,作用等同于xml配置中<update>标签

@Update("update classes set name = #{name} where id = #{id}")
int updateClasses(Classes classes);

@Delete注解

用于定义delete语句,作用等同于xml配置中<delete>标签

@Delete("delete from classes where id = #{id}")
int deleteClasses(int id);

@Select注解

用于定义select语句,作用等同于xml配置中<select>标签

@Select("select id,name from classes where id = #{id}")
Classes getById(int id);

@Results

作用等同于xml配置中<resultMap>标签

@Select("select * from classes where id = #{id}")
@Results(
        {
                @Result(id = true,column = "id",property = "id"),
                @Result(column = "name",property = "name")
        }
)
Classes get(int id);

@ResultMap注解

由于使用@Results注解需要重复的写很多相同的配置,所以可以在xml中配置resultMap,然后使用@ResultMap注解引用

<mapper namespace="com.zhanghe.study.mybatis.mapper.ClassesMapper">
    <resultMap id="baseResultMap" type="com.zhanghe.study.mybatis.model.Classes">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
    </resultMap>
</mapper>
    @Select("select * from classes where id = #{id}")
    @ResultMap("com.zhanghe.study.mybatis.mapper.ClassesMapper.baseResultMap")
    Classes get(int id);

注意要将该mapper.xml注册到mappers中

缓存使用注解

@CacheNamespace

相当于xml配置中的<cache>标签

@CacheNamespaceRef

相当于xml配置中的<cache-ref>标签

级联使用注解

@One一对一关联关系

对应于xml配置中的<association>标签

@One中的select属性会将对应column属性的值作为参数传递过去

    @Select("select * from student where id = #{id}")
    @Results(
            {
                    @Result(id = true,property = "id",column = "id"),
                    @Result(property = "name",column = "name"),
                    @Result(property = "classes",column = "class_id",
                            one = @One(select = "com.zhanghe.study.mybatis.mapper.ClassesMapper.getById"))
            }

    )
    Student getAssociationById(int id);

当然这种方式不太方便,可以使用xml方式配置resultMap,以便重复使用

<resultMap id="associaResultMap" type="com.zhanghe.study.mybatis.model.Student">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <association property="classes" select="com.zhanghe.study.mybatis.mapper.ClassesMapper.getById" column="class_id">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
    </association>
</resultMap>
 @Select("select * from student where id = #{id}")
@ResultMap("com.zhanghe.study.mybatis.mapper.StudentMapper.associaResultMap")
Student getAssociationById(int id);
@Many一对多关系映射

相当于xml配置中的<collection>标签

@Select("select * from classes where id = #{id}")
    @Results({
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(property = "studentList",column = "id",
                    many = @Many(select = "com.zhanghe.study.mybatis.mapper.StudentMapper.getByClassId"))
    })
    Classes getColectionById(int id);

当然这种方式不太方便,可以使用xml方式配置resultMap,以便重复使用

<resultMap id="collectionResultMap" type="com.zhanghe.study.mybatis.model.Classes">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="studentList" column="id" select="com.zhanghe.study.mybatis.mapper.StudentMapper.getByClassId">
        <id column="id" property="id"/>
        <result property="name" column="name"/>
    </collection>
</resultMap>
@Select("select * from classes where id = #{id}")
@ResultMap("com.zhanghe.study.mybatis.mapper.ClassesMapper.collectionResultMap")
Classes getColectionById(int id);
@Select("select * from student where class_id = #{classId}")
@Results(
        {
                @Result(id = true,column = "id",property = "id"),
                @Result(column = "name",property = "name")
        }
)
List<Student> getByClassId(int classId);

动态SQL

对于向xml配置中那样使用动态SQL,可以使用@SelectProvider、@DeleteProvider、@InsertProvider、@UpdateProvider来完成

以@SelectProvider为例来说明一下

@SelectProvider

使用一个简单地示例来说明一下

@SelectProvider(type = StudentProvider.class,method = "findById")
@ResultMap("com.zhanghe.study.mybatis.mapper.StudentMapper.baseResultMap")
Student getByIdUseProvider(int id);

在@SelectProvider注解中的type属性为自己写的一个拼接sql的工具类,method为该类所调用的方法

public class StudentProvider {
		// 该参数为所mapper方法传过来的
  	// 可以无参数
  	// 可以与Mapper方法相同类型的参数
  	// 可以使用map
    public String findById(int id){
        return "select * from student where id = "+id;
    }
}

可以在该方法中根据参数不同来拼接不同的sql语句,也可以在其中使用SQL生成器

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾光师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值