Java学习蹊径:MyBatis(七)使用注解开发

[复制链接]
发表于 2025-12-31 13:32:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
用注解实现增编削查
注解实现自界说映射
注解实现复杂查询
@Many
@One
用注解实现构造方法
注解开启缓存



在前面学习了使用xml映射器实现设置MyBatis,但还是以为有点贫苦
而MyBatis提供了一种更轻便的方法——使用注解举行开发




用注解实现增编削查






当我们使用xml举行映射器编写时,必要先界说映射规则和SQL语句,再将其封装到接口中,通过调用接口实验:

  1. <insert id="insertStudent" parameterType="student" flushCache="false">
  2.         insert into student(number,name,gender) values(#{number},#{name},#{gender});
  3.     </insert>
复制代码
在接口中界说:
  1. int insertStudent(student s);
复制代码

使用注解可以直接实现这个操纵:
  1. @Insert("insert into student(number,name,gender) values(#{number},#{name},#{gender})")
  2.     int insertStudent(student s);
复制代码

想使用注解的话,还必要在MyBatis文件中举行设置的修改

在mybatis-config.xml文件中,原来界说的是
  1. <mappers>
  2.     <mapper resource="com/test/Mapper/TestMapper.xml"/>
  3.     </mappers>
复制代码

然而这里已经不必要xml文件了,因此将其修改为:
  1. <mappers>
  2.     <mapper class="com.test.Mapper.TestMapper"/>
  3.     </mappers>
复制代码

class中填写指定的mapper接口
如果同时有许多mapper,一个一个写很贫苦,也可以直接指定一个package,package下全部的mapper都有效
  1. <mappers>
  2.     <mapper package="com.test.Mapper"/>
  3.     </mappers>
复制代码

通过指定 class/package,让MyBatis知道我们这里有一个通过注解实现的映射器




注解实现自界说映射





使用@Results注解可以实现自界说映射

在.xml文件中,自界说映射是如许的:
  1. <resultMap id="asTeacher" type="teacher">
  2.         <id column="tid" property="tid"/>
  3.         <result column="name" property="name"/>
  4. </resultMap>
  5. <select id="getTeacherById" resultMap="asTeacher">
  6.         select * from teacher
  7. </select>
复制代码

如果使用注解,则变成如许:
  1. @Results({
  2.             @Result(id = true, column = "tid", property = "tid"),
  3.             @Result(column = "name", property = "name")
  4.     })
  5. @Select("select * from teahcer")
  6. List<teacher> getTeacherById();
复制代码

在注解中,Results是一个注解数组,每一个@Result注解都对应一个单独的字段设置
设置id=true表现当前字段是主键



注解实现复杂查询




条件知识:
Java学习蹊径:MyBatis(四)复杂查询-CSDN博客



@Many





还是使用之前在:
Java学习蹊径:MyBatis(四)复杂查询-CSDN博客
中提到的例子,假设一个老师传授多个门生

老师的类为:
  1. public class teacher {
  2.     int tid;
  3.     String name;
  4.     List<student> studentList;
  5. }
复制代码
 
使用注解的方法实现复杂查询的代码如下:

  1. @Results({
  2.         @Result(id = true, column = "tid", property = "tid"),
  3.         @Result(column = "name", property = "name"),
  4.         @Result(column = "tid", property = "studentList",many =
  5.             @Many(select = "getStudentById")
  6.         )
  7. })
  8. @Select("select * from teahcer where tid=#{tid}")
  9. List<teacher> getTeacherById(int tid);
  10. @Select("select * from student inner join teach on student.sid=teach.sid where tid=#{tid}")
  11. student getStudentById(int tid);
复制代码
 
在上述代码中,和寻常查询不一样的是,多出了一行
  1. @Result(column = "tid", property = "studentList",many =
  2.             @Many(select = "getStudentById")
  3.         )
复制代码

在这一行中,column表现传入many的参数(tid),property表现Java中对应的字段

many是Result的一个内置属性,通过@many来选择studentList中存入的内容

在这里存入的内容即getStudentById的返回效果



@One




除了@Many标签,Result中尚有一个标签@One,可以用于实现一对一的关系,相当于xml文件中的association

假设门生类和老师类为:

  1. @Data
  2. @Accessors(chain = true)
  3. public class student {
  4.     int number;
  5.     String name;
  6.     String gender;
  7.     teacher teacher;
  8. }
  9. public class teacher {
  10.     int tid;
  11.     String name;
  12. }
复制代码

每个门生对应一个老师,每个老师传授多个门生,我们想实现查询门生的时间,同时也查询到这个门生对应的老师,用注解实现如下:

  1. @Results({
  2.         @Result( column = "sid", property = "sid"),
  3.         @Result( column = "name", property = "name"),
  4.         @Result( column = "sid", property = "teacher",one =
  5.             @One(select = "getTeacherByStudentId"))
  6. })
  7. @Select("select  * from student where sid=#{sid}")
  8. student getStudentById(int sid);
  9. @Select("select * from teacher inner join teach on teacher.tid=teach.tid where sid={sid}")
  10. teacher getTeacherByStudentId(int sid);
复制代码

在这里,使用@One规定了Student中teacher字段对应的内容




用注解实现构造方法





之前在xml文件中,使用<constructor>标签可以指定构造方法,那么用注解怎样指定构造方法呢?

  1. @ConstructorArgs({
  2.     @Arg(column = "sid", javaType = int.class),
  3.     @Arg(column = "name", javaType = String.class)
  4. })
  5. @Select("select * from student where sid= #{sid}")
  6. student getStudentById(int sid);
复制代码

在上述代码中,使用@ConstructorArgs指定了构造方法,选择了参数为sid和name的构造方法,javaType表现参数在Java中的范例



但是,当我们传入多个参数时,MyBatis会报错,比方:

  1. @Select("select * from student where sid= #{sid} and name = #{name}")
  2. student getStudentById(int sid,String name);
复制代码

对于上述代码,MyBatis会出现如下错误:


那如果想要传多个参数,应该怎样使用呢?

这时,必要在参数前加上@Param注解

  1. @Select("select * from student where sid= #{sid} and name = #{name}")
  2. student getStudentById(@Param("sid") int sid,@Param("name") String name);
复制代码

@Param括号中填的是上面#{xxx}括号中的内容
作用是让MyBatis知道传入的参数是怎样对应的


如果传入的参数有对象范例, 则在SQL语句中访问对象的属性,必要明确参数是哪个对象的属性

  1. @Insert("insert into student(sid,name) values(#{sid},#{student.name})")
  2. student getStudentById(@Param("sid") int sid,@Param("student") student s);
复制代码



注解开启缓存




使用注解设置缓存必要在接口前面添加@CacheNamespace,和xml一样,注解中也存在readWrite、eviation、flushInterval等属性

  1. @CacheNamespace(readWrite = true)
  2. public interface TestMapper {
复制代码

想要对某一个操纵开启缓存,只必要在该方法前添加@Options(useCache=true)

  1. @Options(useCache=true)
  2. student getStudentById(int sid);
复制代码

同理,@Options注解中也有许多参数可以调解,比方flushCache(是否每次查询都清空缓存)等
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表