Mybatis 사용자 정의 SQL 의 관계 맵,페이지,정렬 기능 구현

목적:데이터베이스 시트 와 실체 대상 간 의 서로 다른 맵 관 계 를 기록 하고 my batis 의 사용자 정의 sql 과 결 과 를 집합 으로 되 돌려 처리 합 니 다.
1.세 가지 대상 맵 관계
1.1 일대일
한 사람 은 신분증 에 대응 하고 한 학생 은 한 반 에 대응 하 며 모든 방 은 자신의 방 번호 가 있 습 니 다.한 사물 이 다른 사물 에 대응 하 는 것 이 유일한 것 이 라면 그들의 관 계 는 일대일 입 니 다.
여기 서 내 가 보 여 준 사례 는 한 학생 에 게 선생님 이 있다 는 것 이다.
선생님 기초 정보:
在这里插入图片描述
학생 상세 정보:
在这里插入图片描述
만약 우리 가 두 개의 시 계 를 함께 찾 아야 한다 면 우 리 는 이렇게 할 수 있다.
질문:대상 의 열 이 중복 되면 별명 을 사용 해 야 합 니 다.
1.먼저 실체 구 조 를 정의 한다.즉,우리 가 결 과 를 반환 하 는 실체 류 이다.

public class Student {
 @TableId
 private int id;
 private String name;
 private int tid;
 @TableField(exist = false)
 private Teacher teacher;
}
Teacher:

public class Teacher {
 @TableId
 private int id;
 private String name;
}
2.xml 파일 작성
여기 에는 두 가지 방식 이 있 습 니 다.association 을 사용 할 때 관건 은 my batis 가 관련(association)을 어떻게 불 러 오 는 지 알려 주 는 것 입 니 다.
  • 내장 조회:다른 SQL 맵 문 구 를 실행 하여 예상 한 복잡 한 유형 을 되 돌려 줍 니 다.
  • 내장 결과:중복 되 는 연합 결과 의 부분 집합 을 내장 결과 맵 으로 처리 합 니 다.
  • 첫 번 째:내장 조 회 를 사용 합 니 다.즉,다른 sql 을 사용 합 니 다.
    
    // teacherMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lll.mybatisplusdemo.mapper.TeacherMapper">
     <select id="getTeacher" parameterType="int" resultType="teacher">
     select * from teacher where id = #{id};
     </select>
    </mapper>
    
    // studentMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
     <select id="getStudent2" parameterType="int" resultMap="getStudentMap2">
     select * from student where id =#{id};
     </select>
    
     <resultMap id="getStudentMap2" type="student">
     <id column="id" property="id"></id>
     <result column="name" property="name"></result>
     <result column="tid" property="tid"></result>
     <association property="teacher" javaType="Teacher" column="tid" select="com.lll.mybatisplusdemo.mapper.TeacherMapper.getTeacher">
      <id column="id" property="id"></id>
      <result column="name" property="name"></result>
     </association>
     </resultMap>
    </mapper>
    내장 조회 방식 은 간단 하지만 대형 데이터 집합 과 목록 에 서 는 잘 표현 되 지 않 을 것 이다.문 제 는 우리 가 잘 아 는 것 이다.
    N+1 조회 문제"라 고 적 었 다.요약 하면 N+1 조회 문 제 는 이렇게 발생 할 수 있다.
  • 결과 목록 을 얻 기 위해 별도의 SQL 문 구 를 실 행 했 습 니 다(바로'+1'입 니 다).
  • 쌍 이 되 돌아 오 는 모든 기록 에 대해 검색 어 를 실행 하여 모든 디 테 일 을 불 러 옵 니 다(바로'N'입 니 다).
  • 두 번 째:포 함 된 결 과 를 사용 하여 공동 조회 한 데 이 터 를 매 핑 합 니 다.
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lll.mybatisplusdemo.mapper.StudentMapper">
     <select id="getStudent" parameterType="int" resultMap="getStudentMap">
      SELECT a.*,b.id as cid,b.name as cname FROM `student` as a,teacher as b WHERE a.id =#{id} and a.tid = b.id;
     </select>
     <resultMap id="getStudentMap" type="student">
     <id column="id" property="id"></id>
     <result column="name" property="name"></result>
     <result column="tid" property="tid"></result>
     <association property="teacher" javaType="Teacher">
      <id column="cid" property="id"></id>
      <result column="cname" property="name"></result>
     </association>
     </resultMap>
    </mapper>
    우 리 는 상응하는 mapper 에 방법 인 터 페 이 스 를 추가 하면 사용 할 수 있다.
    1,2.한 쌍 이 많아 요.
    사례:한 선생님 에 학생 이 여러 명 있 습 니 다.
    1.실체 류
    
    public class Teacher {
     @TableId
     private int id;
     private String name;
     @TableField(exist = false)
     private List<Student> students;
    }
    2.xml 작성
    마찬가지 로,우 리 는 먼저 결 과 를 삽입 하여 비 추 었 다.
    끼 워 넣 기 결과:
    
    // teacherMapper.xml
    	<select id="getStudent" parameterType="int" resultMap="getStudentMap">
     SELECT a.*,b.id as cid,b.name as cname,b.tid
     from teacher as a , student as b
     where b.tid = a.id and a.id =#{id};
     </select>
    
     <resultMap id="getStudentMap" type="teacher">
     <id column="id" property="id"></id>
     <result column="name" property="name"></result>
     <collection property="students" ofType="Student">
      <id column="cid" property="id"></id>
      <result column="cname" property="name"></result>
      <result column="tid" property="tid" ></result>
     </collection>
     </resultMap>
    내장 조회:
    
    // teacherMapper.xml
    	<select id="getStudent2" parameterType="int" resultMap="getStudentMap2">
     select * from teacher as a where a.id = #{id}
    
     </select>
     <resultMap id="getStudentMap2" type="teacher">
     <id column="id" property="id"></id>
     <result column="name" property="name"></result>
     <collection property="students" column="id" ofType="Student" select="com.lll.mybatisplusdemo.mapper.StudentMapper.getStudentByTid">
     </collection>
     </resultMap>
    
    	// studentMapper.xml
     <select id="getStudentByTid" parameterType="int" resultType="student">
     select * from student as a where a.tid = #{id}
     </select>
    1,3 대 다
    학생 과 과정 은 다 대 다 의 관계 로 위의 한 쌍 다 의 조작 방식 과 유사 하 다.
    2.사용자 정의 sql 페이지 나 누 기
    mapper 정의 방법,방법 은 page 매개 변 수 를 전달 합 니 다.
    
    public interface UserMapper{
     IPage<User> selectPageVo(Page<User> page);
    }
    userMapper.xml 파일 을 만 드 는 일반적인 결 과 는 list 방법 입 니 다.my batis 는 자동 으로 페이지 를 나 누 어 줍 니 다.
    
    <select id="selectPage" resultType="com.baomidou.cloud.entity.UserVo">
     SELECT * FROM user 
    </select>
    3.sql 정렬 방법 사용자 정의
    결론:orderby 를 사용 하고'$'를 사용 해 야 한 다 는 것 을 기억 하 세 요.'\#'을 사용 할 수 없습니다.
    
    <select id="selectPage" resultType="com.baomidou.cloud.entity.UserVo">
     SELECT * FROM user order by ${sortColumn} ${sortOrder}
    </select>
    4.sql 의\#{}과${}의 차 이 를 사용자 정의 합 니 다.
    1.들 어 오 는 매개 변 수 는 SQL 에서 다 릅 니 다.
    \#들 어 오 는 매개 변 수 는 SQL 에 문자열 로 표 시 됩 니 다.자동 으로 들 어 오 는 데이터 에 작은 따옴표 가 추 가 됩 니 다.
    다음 SQL 사용
    
    select id,name,age from student where id =#{id}
    우리 가 전달 하 는 매개 변수 id 가"1"일 때 상기 sql 의 해석 은:
    
    select id,name,age from student where id ="1"
    $들 어 오 는 매개 변 수 는 Sql 에서 들 어 오 는 값 으로 직접 표 시 됩 니 다.
    다음 SQL 사용
    
    select id,name,age from student where id =${id}
    우리 가 전달 하 는 매개 변수 id 가"1"일 때 상기 sql 의 해석 은:
    
    select id,name,age from student where id =1
    2.\#SQL 이 주입 하 는 위험(문장의 조합)을 방지 할 수 있 습 니 다.단$Sql 주입 을 막 을 수 없습니다.
    3.$방식 은 일반적으로 데이터베이스 대상,예 를 들 어 표 이름 을 입력 하 는 데 사 용 됩 니 다.
    4.대부분 상황 에서 자주 사용 합 니 다.\#보통 사용 할 수 있 는 것 은 $ 을 사용 하지 마 세 요.그러나 어떤 경우 에는 $ 을 사용 해 야 합 니 다.예:MyBatis 정렬 시 order by 동적 인 파 라 메 터 를 사용 할 때\#가 아 닌$를 사용 해 야 합 니 다.
    Mybatis 사용자 정의 SQL 의 관계 맵,페이지,정렬 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Mybatis 사용자 정의 SQL 의 관계 맵 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기