马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
用注解实现增编削查
注解实现自界说映射
注解实现复杂查询
@Many
@One
用注解实现构造方法
注解开启缓存
在前面学习了使用xml映射器实现设置MyBatis,但还是以为有点贫苦
而MyBatis提供了一种更轻便的方法——使用注解举行开发
用注解实现增编削查
当我们使用xml举行映射器编写时,必要先界说映射规则和SQL语句,再将其封装到接口中,通过调用接口实验:
- <insert id="insertStudent" parameterType="student" flushCache="false">
- insert into student(number,name,gender) values(#{number},#{name},#{gender});
- </insert>
复制代码 在接口中界说:
- int insertStudent(student s);
复制代码
使用注解可以直接实现这个操纵:
- @Insert("insert into student(number,name,gender) values(#{number},#{name},#{gender})")
- int insertStudent(student s);
复制代码
想使用注解的话,还必要在MyBatis文件中举行设置的修改
在mybatis-config.xml文件中,原来界说的是
- <mappers>
- <mapper resource="com/test/Mapper/TestMapper.xml"/>
- </mappers>
复制代码
然而这里已经不必要xml文件了,因此将其修改为:
- <mappers>
- <mapper class="com.test.Mapper.TestMapper"/>
- </mappers>
复制代码
class中填写指定的mapper接口
如果同时有许多mapper,一个一个写很贫苦,也可以直接指定一个package,package下全部的mapper都有效
- <mappers>
- <mapper package="com.test.Mapper"/>
- </mappers>
复制代码
通过指定 class/package,让MyBatis知道我们这里有一个通过注解实现的映射器
注解实现自界说映射
使用@Results注解可以实现自界说映射
在.xml文件中,自界说映射是如许的:
- <resultMap id="asTeacher" type="teacher">
- <id column="tid" property="tid"/>
- <result column="name" property="name"/>
- </resultMap>
- <select id="getTeacherById" resultMap="asTeacher">
- select * from teacher
- </select>
复制代码
如果使用注解,则变成如许:
- @Results({
- @Result(id = true, column = "tid", property = "tid"),
- @Result(column = "name", property = "name")
- })
- @Select("select * from teahcer")
- List<teacher> getTeacherById();
复制代码
在注解中,Results是一个注解数组,每一个@Result注解都对应一个单独的字段设置
设置id=true表现当前字段是主键
注解实现复杂查询
条件知识:
Java学习蹊径:MyBatis(四)复杂查询-CSDN博客
@Many
还是使用之前在:
Java学习蹊径:MyBatis(四)复杂查询-CSDN博客
中提到的例子,假设一个老师传授多个门生
老师的类为:
- public class teacher {
- int tid;
- String name;
- List<student> studentList;
- }
复制代码
使用注解的方法实现复杂查询的代码如下:
- @Results({
- @Result(id = true, column = "tid", property = "tid"),
- @Result(column = "name", property = "name"),
- @Result(column = "tid", property = "studentList",many =
- @Many(select = "getStudentById")
- )
- })
- @Select("select * from teahcer where tid=#{tid}")
- List<teacher> getTeacherById(int tid);
- @Select("select * from student inner join teach on student.sid=teach.sid where tid=#{tid}")
- student getStudentById(int tid);
复制代码
在上述代码中,和寻常查询不一样的是,多出了一行
- @Result(column = "tid", property = "studentList",many =
- @Many(select = "getStudentById")
- )
复制代码
在这一行中,column表现传入many的参数(tid),property表现Java中对应的字段
many是Result的一个内置属性,通过@many来选择studentList中存入的内容
在这里存入的内容即getStudentById的返回效果
@One
除了@Many标签,Result中尚有一个标签@One,可以用于实现一对一的关系,相当于xml文件中的association
假设门生类和老师类为:
- @Data
- @Accessors(chain = true)
- public class student {
- int number;
- String name;
- String gender;
- teacher teacher;
-
- }
-
- public class teacher {
- int tid;
- String name;
-
- }
复制代码
每个门生对应一个老师,每个老师传授多个门生,我们想实现查询门生的时间,同时也查询到这个门生对应的老师,用注解实现如下:
- @Results({
- @Result( column = "sid", property = "sid"),
- @Result( column = "name", property = "name"),
- @Result( column = "sid", property = "teacher",one =
- @One(select = "getTeacherByStudentId"))
- })
- @Select("select * from student where sid=#{sid}")
- student getStudentById(int sid);
- @Select("select * from teacher inner join teach on teacher.tid=teach.tid where sid={sid}")
- teacher getTeacherByStudentId(int sid);
复制代码
在这里,使用@One规定了Student中teacher字段对应的内容
用注解实现构造方法
之前在xml文件中,使用<constructor>标签可以指定构造方法,那么用注解怎样指定构造方法呢?
- @ConstructorArgs({
- @Arg(column = "sid", javaType = int.class),
- @Arg(column = "name", javaType = String.class)
- })
- @Select("select * from student where sid= #{sid}")
- student getStudentById(int sid);
复制代码
在上述代码中,使用@ConstructorArgs指定了构造方法,选择了参数为sid和name的构造方法,javaType表现参数在Java中的范例
但是,当我们传入多个参数时,MyBatis会报错,比方:
- @Select("select * from student where sid= #{sid} and name = #{name}")
- student getStudentById(int sid,String name);
复制代码
对于上述代码,MyBatis会出现如下错误:
那如果想要传多个参数,应该怎样使用呢?
这时,必要在参数前加上@Param注解
- @Select("select * from student where sid= #{sid} and name = #{name}")
- student getStudentById(@Param("sid") int sid,@Param("name") String name);
复制代码
@Param括号中填的是上面#{xxx}括号中的内容
作用是让MyBatis知道传入的参数是怎样对应的
如果传入的参数有对象范例, 则在SQL语句中访问对象的属性,必要明确参数是哪个对象的属性
- @Insert("insert into student(sid,name) values(#{sid},#{student.name})")
- student getStudentById(@Param("sid") int sid,@Param("student") student s);
复制代码
注解开启缓存
使用注解设置缓存必要在接口前面添加@CacheNamespace,和xml一样,注解中也存在readWrite、eviation、flushInterval等属性
- @CacheNamespace(readWrite = true)
- public interface TestMapper {
复制代码
想要对某一个操纵开启缓存,只必要在该方法前添加@Options(useCache=true)
- @Options(useCache=true)
- student getStudentById(int sid);
复制代码
同理,@Options注解中也有许多参数可以调解,比方flushCache(是否每次查询都清空缓存)等
|