MyBatis学习6


  

13 MyBatis注解式开发

  mybatis的注解,主要是用于替换映射文件。而映射文件中无非存放着增、删、改、查的SQL映射标签。所以,mybatis注解,就是要替换映射文件中的SQL标签。mybatis官方文档中指出,若要真正想发挥mybatis功能,还是要用映射文件。即mybatis官方并不建议通过注解方式来使用mybatis。

13.1 注解的基础知识

  以@Overide、@Deprecated(过时)、@SuppressWarnings为例。

13.1.1 注解的基础语法

  A、注解后是没有分号的。
  B、注解首字母是大写的,因为注解与类、接口是同一级别的。一个注解,后台对应着一个@interface类。
  C、在同一语法单元上,同一注解只能使用一次。
  D、在注解与语法单元之间可以隔若干空行、注释等非代码内容。

13.1.2 注解的注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

  打开@Deprecated源码,看到其定义上还有三个注解:@Documented、@Retention、@Target。这三个注解的意义是:
  @Target:用于指定该注解可以标注的语法类型。CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、METHOD(方法)、FIELD(属性)、PACKAGE(包)、PARAMETER(参数)、TYPE(类型)。注意,对于TYPE常量,其意义有两个:一是指该注解可以用在类、接口、枚举等类上二是指该注解可以作为其它注解的属性值。例如,@Result、@InterceptorRef就属性第二个意思
  @Documented:用于指定该注解定义时的注释信息能否显示在javaAPI说明文档上。没有添加的话,使用javadoc生成API文档时就不会该注解的信息添加到文档。
  @RetentionPolicy:这是一个enum类型,共有三个值:SOURCE,CLASS 和RUNTIME。

1、SOURCE:代表这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件中。
2、ClASS:代表这个Annotation类型的信息除了保留在程序源码里外,同时也会保留在编译好的.class文件里。但在执行时,并不会把这一些信息加载到虚拟机(JVM)中去。这是Retention的默认值。
3、RUNTIME:表示在源码、编译好的.class文件中保留信息,同时在执行时还会把这些信息加载到JVM中。
  举例:@Override中的Retention值为SOURCE,编译成功了就不要这一些检查的信息。相反@Deprecated中Retention的值为RUNTIME,表示除了在编译时会警告使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被Deprecated。

13.1.3 注解的属性

  当某变量被声明了,但却未被使用;或某集合在声明或定义时未加泛型说明等情况发生时,会在代码下给出警告黄线。这时,可在代码上添加一个注解@SuppressWarnings()。并且发现,不同的情况,其参数是不同的。打开其源码,看到其定义与@Deprecated是不同的,其接口体中声明了一个方法String[] value()。那么该注解在使用时必须包含一个属性value,类型为String[]。且该参数没有默认值,即必须给出value的值。

对于注解的属性,需要注意以下几点:
  (1)数组问题
  该属性在源码定义时被声明为数组,但在具体使用时却只要赋予一个值,此时无需将该值再定义为一个数组后赋给该属性。直接将该值赋给该属性即可。例如,对于声明为字符串数组String[]的value属性,可以将字符串String直接赋给该value。
  2)默认值问题
  若某属性在注解定义时声明了其默认值,则在注解使用时,可以不为其指定属性值。注解会自动使用其默认值。
  (3)value属性问题
  若注解在使用时只需使用其value属性,其它属性要么有默认值,要么该注解只声明了一个value属性,此时,在注解使用时value属性名称可省略,而直接在注解的括号中写出该value属性的值。
  (4)无属性问题
  有些注解在定义时,是没有属性的,如@Deprecated、@Overide都是没有属性声明的,那么在使用时只需给出注解名称即可。

13.2 Mybatis注解

1、@Insert
  其value属性用于指定要执行的insert语句。
2、@SelectKey
  用于替换XML中的标签,用于返回新插入数据的id值。
  statement:获取新插入记录主键值的SQL语句keyProperty:获取的该主键值返回后初始化对象的哪个属性
  resultType:返回值类型
  before:指定主键的生成相对于insert语句的执行先后顺序,该属性不能省略
3、@Delete
  其value属性用于指定要执行的delete语句。
4、@Update
  其value属性用于指定要执行的update语句。
5、@Selec
  t其value属性用于指定要执行的select语句。

public interface IStudentDao {

    //插入
    @Insert("insert into student(name,age,score) values (#{name},#{age},#{score})")
    void insertStudent(Student studnet);

    @Insert("insert into student(name,age,score) values (#{name},#{age},#{score})")
    @SelectKey(statement = "SELECT LAST_INSERT_ID()",keyProperty = "id",resultType = int.class,before = false)
    void insertStudentCachId(Student student);

    //删除
    @Delete("delete from student where id = #{id}")
    void deleteStudentById(int id);

    //改
    @Update("update student set name = #{name},age=#{age},score=#{score} where id = #{id}")
    void updateStudent(Student student);

    //查询所有
    @Select("select * from student")
    List<Student> selectAllStudents();

    @Select("select * from student")
    List<Map<String, Object>> selectStudentMap();

    //查询指定学生
    @Select("select * from student where id = #{**}")
    Student selectStudentById(int id);

    @Select("select * from student where id between #{studentId} and #{stu.id}")
    List<Student> selectStudentByMap(Map<String,Object> map);

    //根据姓名查询
    @Select("select * from student where name like '%'#{ooo}'%'")
    List<Student> selectStudentByName(String name);

    @Select("select\n" +
            "            t_id,t_name,t_age,score\n" +
            "        from student where t_id = #{**}")
    Student selectStudentById2(int id); //报错,因为别名没有resultMap映射

    @Select("select * from student where name like '%' #{0} '%'\n" +
            "                                    and age &gt; #{1}")
    List<Student> selectStudentsByConditions(String n, int i);

}

2、删除映射文件
由于MyBatis注解替换的是映射文件,所以这里就不需要映射文件了,将其直接删除。
3、修改主配置文件
由于没有了映射文件,所以主配置文件中不能使用< mapper/>注册mapper的位置了。需要使用< package/>标签。

<mappers>
        <!--<mapper resource="com/chengzi/dao/mapper.xml"/>-->
        <!--<mapper resource="com/chengzi/dao/mapper2.xml"/>-->
        <!--<mapper resource="com/chengzi/dao/mapper3.xml"/>-->
        <!--<mapper resource="com/chengzi/dao/mapper4.xml"/>-->
        <package name="com.chengzi.dao"></package>
</mappers>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值