系列文章目录
MyBatis01:创建、运行、测试一个mybatis项目
MyBatis02:使用MyBatis查询数据
MyBatis03:嵌套查询、嵌套结果、延迟加载
MyBatis04:动态SQL
MyBatis05:类型转换器
MyBatis06:分页插件、MyBatis配置文件中的标签
MyBatis07:MyBatis注解
文章目录
前言
MyBatis接口绑定有两种实现方式,一种是之前学习的使用xml文件绑定;第二种就是今天我们要讲解的使用注解来绑定。
一、注解绑定
根据注解名确定要执行的功能,注解里面写需要执行的SQL语句
1. 注解和xml文件的适用情况
当SQL语句比较简单时,使用注解绑定比较方便一点。当SQL语句比较复杂时,用xml文件绑定比较方便一点。一般来说,使用xml文件绑定的比较多。注解里写SQL语句,使用注解后就不需要使用映射文件了,注解和配置文件不能共用
。
二、使用步骤
1. 配置数据访问层的包
采用注解绑定接口时,需要在Mappers里使用package标签配置数据访问层的包。
<mappers>
<!-- <mapper resource="com/mapping/StudentMapper.xml"></mapper>
<mapper resource="com/mapping/ClazzMapper.xml"></mapper>
<mapper resource="com/mapping/ScoresMapper.xml"></mapper>-->
<package name="com.dao"/>
</mappers>
2. 添加、修改、删除
2.1 StudentMapper
注解 | 功能 |
---|---|
@Insert | 增加功能 |
@Update | 修改功能 |
@Delete | 删除功能 |
@Insert("insert into student(name, age, sex, classid) values(#{name}, #{age}, #{sex}, #{classid})")
int insert(Student student);
@Update("update student set name=#{name}, age=#{age}, sex=#{sex}, classid=#{classid} where id=#{id}")
int update(Student student);
@Delete("delete from student where id=#{id}")
int delete(int id);
2.2 StudentTest
这里给出可以参考的测试用例:
@Test
public void insert() {
Student student = new Student();
student.setId(10);
student.setName("Tom");
student.setSex("man");
student.setClassid(2);
System.out.println(this.studentService.insert(student));
}
@Test
public void update() {
Student student = new Student();
student.setId(19);
student.setName("Tom2");
student.setSex("man");
student.setClassid(1);
System.out.println(this.studentService.update(student));
}
@Test
public void delete() {
System.out.println(this.studentService.delete(19));
}
3. 查询对象属性、查询集合属性
注解 | 功能 |
---|---|
@Select | 查询功能 |
@Results | 设置结果集 |
@Result | 设置属性和字段的对应关系 |
@ResultMap | 通过value="id"来设置结果集 |
@One | 嵌套查询对象 |
@Many | 嵌套查询集合 |
3.1 StudentMapper
// 通过主键查询学生
@Select("select * from student where id = #{id,jdbcType=INTEGER}")
// id用来标识这个结果集,value用来添加映射关系
@Results(id = "baseMap", value = {
// id用来标识主键列,column指定数据库字段,property用来指定Java属性
@Result(id = true, column = "id", property = "id"),
// jdbcType是数据库的数据类型,可以不写
@Result(column = "name", property = "name", jdbcType = JdbcType.VARCHAR),
@Result(column = "sex", property = "sex"),
@Result(column = "birthday", property = "birthday"),
// fetchType是获取类型,可以用来添加懒加载
@Result(property = "clazz", column = "classid", one = @One(select = "com.dao.ClazzMapper.selectByPrimaryKey",fetchType = FetchType.LAZY)),
@Result(property = "scores", column = "id", many = @Many(select = "com.dao.ScoresMapper.selectByStuid",fetchType = FetchType.LAZY))
})
Student selectByPrimaryKey(Integer id);
// 查询全部学生
@Select("select * from student")
@ResultMap(value = "baseMap")
List<Student> selectAll();
3.2 ClazzMapper
// 通过主键查询班级
@Select("select * from clazz where id = #{classid}")
Clazz selectByPrimaryKey(Integer id);
3.3 ScoresMapper
// 通过学生编号查询结果集
@Select("select * from scores where stuid = #{id}")
List<Scores> selectByStuid(Integer id);
3.4 StudentTest
@Test
public void selectByPrimaryKey() {
Student student = this.studentService.selectByPrimaryKey(1);
System.out.println(student.getId() + "\t" + student.getName());
if (student.getClazz() != null) {
System.out.println("所在班级名称" + student.getClazz().getClassname());
}
if (student.getScores() != null) {
List<Scores> scores = student.getScores();
for (Scores score : scores) {
System.out.println(score.getCourse() + "\t" + score.getScore());
}
}
}
@Test
public void selectAll() {
List<Student> students = this.studentService.selectAll();
for (int i=0; i<students.size(); i++) {
Student student = students.get(i);
System.out.println(student.getId() + "\t" + student.getName());
if (student.getClazz() != null) {
System.out.println(student.getClazz().getClassname());
}
if (student.getScores() != null) {
List<Scores> scores = student.getScores();
for (Scores score : scores) {
System.out.println(score.getCourse() + "\t" +score.getScore() + "\t" + score.getExamdate());
}
}
}
}
4. 动态SQL
动态SQL最好还是使用xml文件,使用注解写,没有错误提醒,代码容易写错。
4.1 StudentMapper
//如果SQL语句需要使用动态SQL元素标签,需要将整个SQL语句括在script元素内
@Select("<script>select * from student <where>" +
"<if test='id != null and id > 0'> id = #{id} </if>" +
"<if test='name != null'> name like concat('%',#{name},'%') </if> " +
"</where> </script>")
@ResultMap(value = "baseMap")
List<Student> select(Student student);
4.2 StudentTest
@Test
public void select() {
Student student = new Student();
//student.setName("t");
student.setId(5);
List<Student> students = this.studentService.select(student);
for (int i=0; i<students.size(); i++) {
Student student1 = students.get(i);
System.out.println(student1.getId() + "\t" + student1.getName());
}
}
总结
以上就是使用注解实现MyBatis接口绑定的全部介绍。重点讲了增删改如何使用主键实现,查询对象属性和查询集合属性如何使用注解实现。以及动态SQL如何使用注解实现。最后说明,注解主要适用于SQL语句比较简单的情况下使用。