mybatisプレミアム_注記開発_マルチテーブルアクション


mybatisプレミアム
MyBatis注記開発
一般的な注記の説明
@Select(“    SQL   ”)@Insert(“    SQL   ”)@Update(“    SQL   ”)@Delete(“    SQL   ”)

プロファイルのマッピングの弊害
1.       
2.                 
    

コード実装
1.環境準備
//    student    /bean 
public class Student {
    private Integer id;
    private String name;
    private Integer age;
   ...    ..set get  

2.mapperファイルパッケージの下にStudentMapperインタフェースを作成する
    //                     
    @Select("SELECT * FROM student")
    public abstract  List<Student> selectAll();
    //    
    @Insert("INSERT INTO student VALUES (#{id},#{name},#{age})")
    public abstract Integer insert(Student stu);

    //    
    @Update("UPDATE student SET name=#{name},age=#{age} WHERE id=#{id}")
    public abstract Integer update(Student stu);
...
    

3.テスト
public void selectAll() throws Exception{
        //1.        
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //2.  SqlSession    

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3.        SqlSession  
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //4.  StudentMapper        

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //5.           ,    
        List<Student> list = mapper.selectAll();

        //6.    
        for (Student student : list) {
            System.out.println(student);
        }

        //7.    
        sqlSession.close();
        is.close();
    }
        ...

注記開発の概要
          ,           。
           
    <mappers>
        <package name="     "/>
	</mappers>

比較プロファイルが異なる
  • sql文の位置が異なる
  • コアプロファイルのロード方法
  •   MApper         
    
       <mappers>
            <mapper resource="com/itheima/one_to_one/OneToOneMapper.xml"/>
            <mapper resource="com/itheima/one_to_many/OneToManyMapper.xml"/>
            <mapper resource="com/itheima/many_to_many/ManyToManyMapper.xml"/>
        </mappers>
    
           
         <mappers>
            <package name="com.itheima.mapper"/>
        </mappers>
    

    MyBatis注記によるマルチテーブル操作
    一対一
     API  
     @Results:          。
    Result[] value():    Result   
     @Result:          。
    column   :          
    property   :          
    javaType   :          
    one   :         
     @One:        。
    select   :            
    

    a.環境準備
    1.         jar 
       ..  
        
    2.           
          1
        CREATE TABLE person(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(20),
    	age INT
    );
    ...    
      2
        CREATE TABLE card(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	number VARCHAR(30),
    	pid INT,
    	CONSTRAINT cp_fk FOREIGN KEY (pid) REFERENCES person(id)
    );
       ...    
               Card  Person 
       public class Card {
        private Integer id;     //  id
        private String number;  //    
    
        private Person p;       //      
           ...}
     public class Person {
        private Integer id;     //  id
        private String name;    //    
        private Integer age;    //      
         ...}
            CardMapper PersonMapper
         public interface PersonMapper {
        //  id  
         @Select("select * from person where id = #{id}")
        public abstract  Person selectById(Integer id);
    }
         CardMapper
          public interface CardMapper {
        //    
        @Select("SELECT * FROM card")
        @Results({
                @Result(column = "id",property = "id"),
                @Result(column = "number",property = "number"),
                @Result(
                        property = "p",             //          
                        javaType = Person.class,    //             
                        column = "pid",             //       card   pid     person 
                        /*
                            one、@One        
                            select  :              
                         */
                        one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")//  PersonMapper     
                )
        })
        public abstract List<Card> selectAll();     
    

    b.テスト
     public void selectAll() throws Exception{
            //1.        
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    
            //2.  SqlSession    
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            //3.        SqlSession  
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
    
            //4.  CardMapper        
            CardMapper mapper = sqlSession.getMapper(CardMapper.class);
    
            //5.           ,    
            List<Card> list = mapper.selectAll();
    
            //6.    
            for (Card card : list) {
                System.out.println(card);
            }
    
            //7.    
            sqlSession.close();
            is.close();
        }
    //    
    
    Card{id=1, number='12345', p=Person{id=1, name='  ', age=23}}
    Card{id=2, number='23456', p=Person{id=2, name='  ', age=24}}
    Card{id=3, number='34567', p=Person{id=3, name='  ', age=25}}
    

    一対多
      API
     @Results:          。
    Result[] value():    Result   
     @Result:          。
    column   :          
    property   :          
    javaType   :          
    many   :         
     @Many:        。
    select   :            
    

    a.環境準備
       
            
        CREATE TABLE classes(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(20)
    );
    INSERT INTO classes VALUES (NULL,'  ');
    INSERT INTO classes VALUES (NULL,'  ');
    
    
    CREATE TABLE student(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(30),
    	age INT,
    	cid INT,
    	CONSTRAINT cs_fk FOREIGN KEY (cid) REFERENCES classes(id)
    );
    INSERT INTO student VALUES (NULL,'  ',23,1);
    INSERT INTO student VALUES (NULL,'  ',24,1);
    INSERT INTO student VALUES (NULL,'  ',25,2);
    INSERT INTO student VALUES (NULL,'  ',26,2);
    

    b.インタフェースとエンティティークラスの準備
          
           
        public class Classes {
        private Integer id;     //  id
        private String name;    //    
    
        private List<Student> students; //         
            ...}
    
        public class Student {
        private Integer id;     //  id
        private String name;    //    
        private Integer age;    //    
        ...}
        private List<Course> courses;   //                  
       
        
       public interface StudentMapper {
    //    //  cid  student 
           @Select("SELECT * FROM student WHERE cid=#{cid}")
        public abstract List<Student> selectByCid(Integer cid);
    }
    
    public interface ClassesMapper {
        //    
      @Select("select * from classes")
      @Results({// @Results:          
              @Result(column = "id",property = "id"), //@Result:          
              @Result(column = "name",property = "name"),
          //column   :          
          //property   :          
              @Result(property = "students",
              javaType = List.class,
                      //javaType   :          
              column = "id",
              many = @Many(select"com.itheima.one_to_many.StudentMapper.selectByCid")
                )//many   :         
        })       //select   :            
        public abstract  List<Classes> selectAll();
    }
    

    c.テスト
    public void selectAll() throws Exception{
            //1.        
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //2.  SqlSession    
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            //3.        SqlSession  
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
    
            //4.  ClassesMapper        
            ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);
            //5.           ,    
            List<Classes> list = mapper.selectAll();
            //6.    
            for (Classes classes : list) {
                System.out.println(classes.getId()+","+classes.getName());
                List<Student> students = classes.getStudents();
    
                for (Student student : students) {
                    System.out.println("\t"+student);
                }
            }
        //7.    
        ...}
    

    多対多
     @Results:          。
         Result[] value():    Result   
     @Result:          。
        column   :          
        property   :          
        javaType   :          
        one   :         
        many   :         
        @One:        。
        select   :            
     		@Many:        。
    	select   :            
         //                        Result
    

    前の表を借りて、2つの表学科と中間表を準備します.
    CREATE TABLE course(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(20)
    );
    INSERT INTO course VALUES (NULL,'  ');
    INSERT INTO course VALUES (NULL,'  ');
    
    
    CREATE TABLE stu_cr(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	sid INT,
    	cid INT,
    	CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id),
    	CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)
    );
    INSERT INTO stu_cr VALUES (NULL,1,1);
    INSERT INTO stu_cr VALUES (NULL,1,2);
    INSERT INTO stu_cr VALUES (NULL,2,1);
    INSERT INTO stu_cr VALUES (NULL,2,2);
    

    コースのエンティティークラスが必要です.中間テーブルではエンティティークラスを構成する必要はありません.
    public class Course {
        private Integer id;     //  id
        private String name;    //    
        ...}
    

    インタフェースの書き換えが必要
    //     
    public interface CourseMapper {
        //    id      
        @Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
        public abstract List<Course> selectBySid(Integer id);
    }
    
    //     
    public interface StudentMapper {
        //    
        @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
        @Results({
                @Result(column = "id",property = "id"),
                @Result(column = "name",property = "name"),
                @Result(column = "age",property = "age"),
                @Result(
                        property = "courses",   //          
                        javaType = List.class,  //             
                        column = "id",          //      student  id       ,          
                        /*
                            many、@Many           
                            select  :                
                         */
                        many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
                )
        })
        public abstract List<Student> selectAll();}
    

    テスト
     public void selectAll() throws Exception{
            //1.        
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    
            //2.  SqlSession    
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            //3.        SqlSession  
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
    
            //4.  StudentMapper        
            StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    
            //5.           ,    
            List<Student> list = mapper.selectAll();
    
            //6.    
            for (Student student : list) {
                System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
                List<Course> courses = student.getCourses();
                for (Course cours : courses) {
                    System.out.println("\t" + cours);
                }
            }
    
            //7.    
            sqlSession.close();
            is.close();
        }
    

    注記マルチテーブル操作のまとめ
     @Results:          。
    Result[] value():    Result   
     @Result:          。
    column   :          
    property   :          
    javaType   :          
    one   :         
    many   :         
     @One:        。
    select   :            
     @Many:        。
    select   :            
    

    注記開発の注意事項
    1.@Result             
    2.@One  select                               
    3.Result       column                
    

    MyBatis SQL文の構築
    SQL構築オブジェクトの説明
               ,   SQL            。            、      
    

    MyBatisは私たちにorgを提供してくれた.apache.ibatis.jdbc.SQL文の構築に特化したSQL機能クラス.
    メソッド名
    説明
    SELECT(String…column)
    フィールドに基づいてクエリー文をつづる
    FROM(String…table)
    テーブル名に基づいて文をつづる
    WHERE(String…condition)
    条件に従って文をつづる
    INSERT_INTO(String table)
    テーブル名に基づいて新しい文をつづる
    VALUES(String column,String values)
    フィールドと値の結合に基づいてデータ文を挿入
    UPDATE(String table)
    テーブル名に基づいて文をつづる
    DELETE_FROM(String table)
    テーブル名に基づいて文を結合削除
    MyBatis SQL文のまとめの構築
    @SelectProvider:       SQL     。
    @InsertProvider:       SQL     。
    @UpdateProvider:       SQL     。
    @DeleteProvider:       SQL     。
        type   :   SQL        
        method   :