Mybatis【一対多、多対一、多対多】知識のポイント


Mybatis【複数表接続】
私たちはヒップホップを勉強する時、表が二枚に及ぶと、マッピングファイルに.などのラベルを使ってそのマッピング属性を関連づけたのです。私たちMybatisではどうすればいいですか?
まず、SQL 99の文法を振り返ってみます。

 )   (    ):      ,    ,    
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c inner join orders o
    where c.id = o.customers_id;
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c join orders o
    where c.id = o.customers_id; 
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c,orders o
    where c.id = o.customers_id;
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c join orders o
    on c.id = o.customers_id;
    ---------------------------------------------------
      :   (    )         ,         




 )   :     ,             
    ---------------------------------------------------
        :
    select c.name,count(o.isbn)
    from  customers c left outer join orders o
    on c.id = o.customers_id
    group by c.name; 
    ---------------------------------------------------
        :
    select c.name,count(o.isbn)
    from  orders o right outer join customers c   
    on c.id = o.customers_id
    group by c.name; 
    ---------------------------------------------------
      :            ,         ;      ,                 




 )   :  AA    EE
    ---------------------------------------------------
        :
    select users.ename,boss.ename
    from emps users inner join emps boss 
    on users.mgr = boss.empno;
    ---------------------------------------------------
        :
    select users.ename,boss.ename
    from emps users left outer join emps boss 
    on users.mgr = boss.empno;
    ---------------------------------------------------
      :        ,       ,      ,     。
                   ,        
私達のMybatisにはヒップホップのような全自動化がされていませんので、.などのラベルがありません。私達はやはり手書きのSQL文を使って、私達の関連属性を接続します。
一対一
必要:
  • 学生と身分証
  • 設計表:
    
    
    --mysql
    
    create table cards(
        cid int(5) primary key,
        cnum varchar(10)
    );
    
    create table students(
        sid int(5) primary key,
        sname varchar(10),
        scid int(5),
        constraint scid_fk foreign key(scid) references cards(cid)
    );
    
    insert into cards(cid,cnum) values(1,'111');
    insert into students(sid,sname,scid) values(1,'  ',1);
    
    select * from cards;
    select * from students;
    
    
    エンティティ
    /**
     *    (  )
     * @author AdminTC
     */
    public class Card {
        private Integer id;
        private String num;
        public Card(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getNum() {
            return num;
        }
        public void setNum(String num) {
            this.num = num;
        }
    }
    
    
    /**
     *   (  )
     * @author AdminTC
     */
    public class Student {
        private Integer id;
        private String name;
        private Card card;//    
        public Student(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Card getCard() {
            return card;
        }
        public void setCard(Card card) {
            this.card = card;
        }
    }
    
    マップファイル
    二つのエンティティがありますから、二つのマッピングファイルがあります。
    Studentマッピングファイル
    
    
    
    
    
        
        
            
            
        
    
    
    カードマップファイル
    
    
    
    
    
    
        
        
            
            
            
        
    
    
    DAO層
    今は学生の番号から学生の情報と身分証の情報を調べたいです。
    このクエリは主に学生の情報を調べるため、学生のマッピングファイルにSQL文を書きます。
    必要に応じて、私たちが書いたSQL文はこのようです。
    
    
    select * from zhongfucheng.students s,zhongfucheng.cards c where c.cid = s.scid and sid=1;
    
    検索結果を見てみます。
    私たちのエンティティとマッピングテーブルでは、Studentエンティティは他のフィールドに関連していません。このエンティティの独自の属性だけが書かれています。
    
        
            
            
        
    
    明らかに、私達Studentはカプセル化して帰ることができない結果で、そのため私達は関連している属性を関連付けてくる必要があります!
    
        
            
            
    
            
            
        
    私たちは関連してから、Studentエンティティがカプセル化されて戻ることができます。
    
        
            
            
    
            
            
        
    
        
    照会番号1の学生情報【身分証番号も含む】
    
    
        public Student findById(int id) throws Exception {
            //      
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            try{
    
                return sqlSession.selectOne("studentNamespace.findById", id);
    
              /*  sqlSession.commit();*/
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
    
        public static void main(String[] args) throws Exception {
            StudentDao studentDao = new StudentDao();
            Student student = studentDao.findById(1);
    
            System.out.println(student.getId() + "----" + student.getName() + "----" + student.getCard().getNum());
    
        }
    一対多
    必要:
  • つのクラスに複数の学生がいます。java学科にはどのような学生情報がありますか?
    デザインデータベーステーブル
    
    
    create table grades(
      gid int(5) primary key,
      gname varchar(10)
    );
    
    create table students(
      sid int(5) primary key,
      sname varchar(10),
      sgid int(5),
      constraint sgid_fk foreign key(sgid) references grades(gid)
    );
    
    insert into grades(gid,gname) values(1,'java');
    
    insert into students(sid,sname,sgid) values(1,'  ',1);
    insert into students(sid,sname,sgid) values(2,'  ',1);
    
    
    select * from grades;
    select * from students;
    
    
    エンティティ
    
    package zhongfucheng2;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *   (  )
     * @author AdminTC
     */
    public class Grade {
        private Integer id;
        private String name;
        private List studentList = new ArrayList();//    
        public Grade(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public List getStudentList() {
            return studentList;
        }
        public void setStudentList(List studentList) {
            this.studentList = studentList;
        }
    }
    
    
    
    
    package zhongfucheng2;
    
    /**
     *   (  )
     * @author AdminTC
     */
    public class Student {
        private Integer id;
        private String name;
        private Grade grade;//    
        public Student(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Grade getGrade() {
            return grade;
        }
        public void setGrade(Grade grade) {
            this.grade = grade;
        }
    }
    
    マッピングファイルSQL文
    
    
    
    
        
        
            
            
        
    
    
        
    
        
        
    
    
    
    
    
    
    
    
    
        
        
            
            
        
    
    
    
    DAO
    
    public List findByGrade(String  grade) throws Exception {
            //      
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            try{
    
                return sqlSession.selectList("studentNamespace.findByGrade", grade);
              /*  sqlSession.commit();*/
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
    
        public static void main(String[] args) throws Exception {
            StudentDao studentDao = new StudentDao();
            List student = studentDao.findByGrade("java");
    
            for (Student student1 : student) {
                System.out.println(student1.getName());
            }
        }
    多対多
    必要:
  • 学生と課程
  • データベーステーブル
    
    create table students(
        sid int(5) primary key,
        sname varchar(10)
    );
    
    create table courses(
        cid int(5) primary key,
        cname varchar(10)
    );
    
    create table middles(
        msid int(5),
        mcid int(5),
        primary key(msid,mcid)
    );
    
    insert into students(sid,sname) values(1,'  ');
    insert into students(sid,sname) values(2,'  ');
    
    insert into courses(cid,cname) values(1,'java');
    insert into courses(cid,cname) values(2,'android');
    
    insert into middles(msid,mcid) values(1,1);
    insert into middles(msid,mcid) values(1,2);
    insert into middles(msid,mcid) values(2,1);
    insert into middles(msid,mcid) values(2,2);
    
    select * from students;
    select * from courses;
    select * from middles;
    
    
    エンティティ
    package cn.itcast.javaee.mybatis.many2many;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *   (  )
     * @author AdminTC
     */
    public class Course {
        private Integer id;
        private String name;
        private List studentList = new ArrayList();//    
        public Course(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public List getStudentList() {
            return studentList;
        }
        public void setStudentList(List studentList) {
            this.studentList = studentList;
        }
    }
    
    
    
    
    package cn.itcast.javaee.mybatis.many2many;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *   (  )
     * @author AdminTC
     */
    public class Student {
        private Integer id;
        private String name;
        private List courseList = new ArrayList();//    
        public Student(){}
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public List getCourseList() {
            return courseList;
        }
        public void setCourseList(List courseList) {
            this.courseList = courseList;
        }
    }
    
    マップファイル
    
    
    
    
    
        
        
            
            
            
        
        
        
        
        
        
    
    
    
    
    
    
    
    
    
        
        
            
            
            
    
        
        
        
    
    
    
    
    DAO
    
    
    package cn.itcast.javaee.mybatis.many2many;
    
    import java.util.List;
    import org.apache.ibatis.session.SqlSession;
    import cn.itcast.javaee.mybatis.util.MybatisUtil;
    
    /**
     *    
     * @author AdminTC
     */
    public class StudentCourseDao {
        /**
         *            
         * @param name        
         */
        public List findAllByName(String name) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                return sqlSession.selectList("courseNamespace.findAllByName",name);
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         *   java         
         * @param name        
         */
        public List findAllByCourseName(String name) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                return sqlSession.selectList("studentNamespace.findAllByCourseName",name);
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        
        
        
        
        
        
        public static void main(String[] args) throws Exception{
            StudentCourseDao dao = new StudentCourseDao();
            List courseList = dao.findAllByName("  ");
            System.out.print("     " + courseList.size()+"   ,   :");
            for(Course c : courseList){
                System.out.print(c.getName()+" ");
            }
            System.out.println("
    -----------------------------------------------------"); List studentList = dao.findAllByCourseName("android"); System.out.println(" android "+studentList.size()+" , :"); for(Student s : studentList){ System.out.print(s.getName()+" "); } } }
    締め括りをつける
    Mybatisのマルチテーブル接続は非常に簡単です。SQL文は全部私達が自分で書きます。もし私達が戻ってきたデータのタイプが現在のエンティティでは足りないなら、私達は対応するマッピング属性を再関連すればいいです。
    文章に間違いがあれば指摘を歓迎し、お互いに交流します。
    WeChatで技術記事を読むことに慣れています。より多くのJava資源を得ようとする学生は、WeChat公式アカウントに注目してください。