Mybatis注解查询

Mybatis注解查询
康弟弟单表查询
1、创建实体类
例如:存在一个实体Student
1 | public class Student { |
2、创建持久层
则可以直接创建一个持久层对象(Dao)或者(Mapper),本文全部采用Dao文件
1 | public interface StudentDao { |
3、对配置文件进行扫描配置
注意需要将包扫描路径添加或者使用@Mapper注解(如果是Idea在不取别名的情况下需要写完全包名(com.xxx.xxx))
1 | <mappers> |
4、逻辑测试文件
以上完成所有的逻辑书写,下面创建测试文件
1 | package test; |
5、测试结果
其中测试结果如下:
1 | findStudentAllTest: |
一对一的内连接查询
1、创建实体类
这里使用学生表和学生信息卡两张表作为演示(一个学生只能拥有一张学生卡)
其中需要注意创建一个另一张表的对象idcard用来存放另一张表中的对应关系
学生实体:
1 | public class Student { |
学生信息卡实体:
1 | public class IdCard { |
2、创建持久层
同上可以创建Dao或者Mapper,以下不在赘述。
这里主要采用join on内连接查询
学生信息卡层(IdCardDao):
1 | public interface IdCardDao { |
学生关联查询层(StudentCardDao):
1 | public interface StudentCardDao { |
3、对配置文件进行扫描配置
这里为了简化扫描类的书写,采用包扫描的方式,在mybatis.xml中添加添加以下代码:
1 | <mappers> |
或者使用Mapper创建持久层时:
1 | <mappers> |
4、逻辑测试文件
测试单表查询idcard查询
1 | public class StudentCardTest { |
测试join in内查询(一对一查询)
1 | public class StudentCardTest { |
5、测试结果
1 | DEBUG [main] - ==> Preparing: select * from idcard where id=? |
6、思考:
使用注解式@One进行一对一的查询如何实现。
一对多注解型查询
1、实体类
这里举例查询某一门课程的所有成绩信息
课程实体(Course)
1 | public class Course { |
选课结果表,其中包含成绩字段(Sc)
1 | public class Sc { |
2、持久层
选课表持久层(ScDao):
1 | public interface ScDao { |
通过课程号查询所有选课信息持久层(CourseScDao):
1 | public interface CourseScDao { |
3、配置扫描
参考以上
4、逻辑测试
1 | public class CourseScTest { |
5、测试结果
1 | DEBUG [main] - ==> Preparing: select * from course where cno=?; |
6、总结分析
在测试结果中查询出Sc表的中的sfinal元素无法自动映射到数据库表字段final中,由于final作为关键字无法在实体类时创建,使用@Column(name=”final”)对实体中的sfinal进行手动映射时编译器无法识别,在手动导入org.apache.ibatis.annotations.Column;包后无法解析到包中文件,这里思考通过@Param注解尝试。
多对多注解查询
1、实体类
这里使用某一门课程的所有学生信息,粗看认为这是一对多查询 ,课程表中只包括课程号和课程信息,学生表中只包含学生信息,两张表中存在多个数据,唯一的关联关系位于选课表sc中,其中包含cno和sno两个字段将两张表链接,可以认为是作为多对多查询中需要提供的另一张表。
课程信息实体(Course):
1 | public class Course { |
学生实体类(Student):
1 | public class Student { |
选课信息表(Sc):
1 | public class Sc { |
2、持久层
这里持久层的创建尤其为关键
1 | public interface StudentDao { |
1 | public interface CourseStudentDao { |
先对关联查询进行分析(CourseStudentDao):
需要查询某一门课程的所有学生信息,首先执行select语句,将传入的cno查询到相关的Course信息
1 |
在通过关联查询其中cno传入dao.StudentDao.findStudentByCno,并且将结果封装到stuLis中。
1 |
然后执行dao.StudentDao.findStudentByCno中的方法,其中cno在上述中传递进来,首先执行where语句中的查询,通过查询出的sno作为where条件查询出所有的stu中的信息传回给stuList,而在实体中stuList泛型被定义为了Student类型进行了自动封装。
1 | @Select("select * from stu where sno in (select sno from sc where cno=#{cno});") |
3、配置扫描
同上
4、逻辑测试
1 | public class CourseStudentTest { |
5、测试结果
1 | DEBUG [main] - ==> Preparing: select * from course where cno=?; |
6、总结
多对多查询在类型上也可以看作一对多的查询










