栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis基础(四)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis基础(四)

文章目录
  • Mybatis基础(四)
    • 标签与动态SQL
      • 常用标签
      • 动态SQL
        • 输入参数为对象的属性
        • 输入参数为简单数组
        • 输入参数为对象数组
        • 输入参数为集合
        • SQL片段
      • 一对一、一对多的处理(关联查询)
      • 延迟加载(懒加载)
        • 延迟加载(一对一)
        • 延迟加载(一对多)
      • 日志
        • 概述
        • 分类
        • 日志级别
        • 使用步骤(以 log4j 为例)

Mybatis基础(四) 标签与动态SQL 常用标签
  • if 标签

    
    
    
  • where标签

    
        select * from student 
        
            
                   
                    #{stuNo}
                
            
        
    
    
    
  • foreach标签

    
        select * from student 
        
            
                
                    #{stuNo}
                
            
        
    
    
    
动态SQL
输入参数为对象的属性
  • Student.java

    public class Student {
        private int stuNo ; //学号
        private String stuName ;
        private int stuAge ;
        private String graName ;
    }
    

    Grade.java

    public class Grade {
        //学号
        private List stuNos ;
        //...
    
        public List getStuNos() {
            return stuNos;
        }
    
        public void setStuNos(List stuNos) {
            this.stuNos = stuNos;
        }
    }
    

    Mapper.xml

    
    
        select * from student
        
            
                   
                    #{stuNo}
                
            
        
    
    

    接口方法

    List queryStudentsWithNosInGrade(Grade grade);
    

    StudentTest.java

    //查询全部学生
    public static void queryStudentsWithNosInGrade() throws IOException {
        //Connection -  SqlSession操作MyBatis
        //conf.xml - > reader
        Reader reader = Resources.getResourceAsReader("conf.xml") ;
        //reader  ->SqlSession
        //可以通过build的第二参数 指定数据库环境
        SqlSessionFactory sessionFacotry = new SqlSessionFactoryBuilder().build(reader,"development") ;
        SqlSession session = sessionFacotry.openSession() ;
    
        StudentMapper studentMapper = session.getMapper( StudentMapper.class) ;
        Grade grade = new Grade();
        List stuNos = new ArrayList<>();
        stuNos.add(1) ;
        stuNos.add(2) ;
        stuNos.add(53) ;
    
        grade.setStuNos(stuNos);
        List students = studentMapper.queryStudentsWithNosInGrade(grade) ;	
    
        System.out.println(students);
        session.close();
    }
    
输入参数为简单数组
  • Mapper.xml

    
    
        select * from student
        
        
        
    
    
  • 接口方法

    List queryStudentsWithObjectArray(Student[] students);
    
  • StudentTest.java

    StudentMapper studentMapper = session.getMapper( StudentMapper.class) ;
    Student stu1 = new Student();
    stu1.setStuNo(1); 
    Student stu2 = new Student();
    stu2.setStuNo(2); 
    Student stu53 = new Student();
    stu53.setStuNo(53); 
    Student[] stus = new Student[] {stu1,stu2,stu53};
    List students = studentMapper.queryStudentsWithObjectArray(stus) ;
    //接口的方法->SQL
    
    System.out.println(students);
    session.close();
    
输入参数为集合
  • Mapper.xml

    
    
            select * from student 
            
            
        
    
    
    

一对一、一对多的处理(关联查询)
多条件联合查询(关联查询、联合查询),实现方式有两种:
	方式一:
		业务扩展类
		核心:用 resultType 指定类的属性 包含 多表查询的所有字段,用类的继承实现
		适合涉及的表(类)较少的场景
	方式二(推荐使用):
		resultMap关系映射
		通过 属性成员(成员变量) 将2个类建立起关系
		适合复杂的场景,涉及较多的表(类)

备注:表与表之间是通过外键建立起关系的,类和类之间是通过成员属性(成员变量)建立起关系的
  • 一对一的处理

    • 方式一:业务扩展类

      • studentMapper.xml

        
        
            select s.*,c.* from student s  inner join studentcard c
            on s.cardid=c.cardid
            where s.stuno = #{stuNo}
        
        
        
            
            
            
            
            
            
                
                
            
        
        
      • 实体类

        • StudentCard.java

          //学生证
          public class StudentCard {
              private int cardId;
              private String cardInfo ;
          
              public int getCardId() {
                  return cardId;
              }
              public void setCardId(int cardId) {
                  this.cardId = cardId;
              }
              public String getCardInfo() {
                  return cardInfo;
              }
              public void setCardInfo(String cardInfo) {
                  this.cardInfo = cardInfo;
              }
          }
          
        • Student.java

          //学生类 包含:1 学生信息    2 学生证信息
          public class Student {
              // 1 学生信息
              private int stuNo ;
              private String stuName ;
              private int stuAge ;
          
              // 2 学生证信息
              private StudentCard card ;
          
              public StudentCard getCard() {
                  return card;
              }
          
              public void setCard(StudentCard card) {
                  this.card = card;
              }
          
              public int getStuNo() {
                  return stuNo;
              }
          
              public void setStuNo(int stuNo) {
                  this.stuNo = stuNo;
              }
          
              public String getStuName() {
                  return stuName;
              }
          
              public void setStuName(String stuName) {
                  this.stuName = stuName;
              }
          
              public int getStuAge() {
                  return stuAge;
              }
              public void setStuAge(int stuAge) {
                  this.stuAge = stuAge;
              }
          
              @Override
              public String toString() {
                  return stuNo + "-" + this.stuName+"-" + this.stuAge+"-" + this.card.getCardId() + "-"+this.card.getCardInfo();
              }
          }
          
      • 接口方法

        //resultMap关系映射
        Student queryStudentByNoWithOO2(int stuNo);
        
      • StudentTest

        //一对一关联查询,resultMap
        public static void queryStudentByNoWithOO2() throws IOException {
            //Connection -  SqlSession操作MyBatis
            //conf.xml - > reader
            Reader reader = Resources.getResourceAsReader("conf.xml");
            //reader  ->SqlSession
        
            //可以通过build的第二参数 指定数据库环境
            SqlSessionFactory sessionFacotry = new SqlSessionFactoryBuilder().build(reader,"development");
            SqlSession session = sessionFacotry.openSession();
        
            StudentMapper studentMapper = session.getMapper(StudentMapper.class);
            Student student = studentMapper.queryStudentByNoWithOO2(2);
            //接口中的方法->SQL语句
        
            System.out.println(student);
            session.close();
        }
        
  • 一对多的处理

    • 实现方式:resultMap关系映射

      • studentMapper.xml

        
        
            
            select * from student
        
        
        
            
            
            
            
            
            
            
            
        
        
      • StudentCardMapper.xml

        
        
            	
            
            select * from student where classId = #{classId}
        
        
      • StudentClassMapper.xml

        
        
        
            
            
        
            
            
                
                
                
                
                
                
                
            
        
        
        • 注意:新增的Mapper.xml文件要在conf.xml中加载
      • StudenClasstMapper.java

        //操作Mybatis的接口
        public interface StudentClassMapper {
            //查询全部班级的接口方法
            List queryClassAndStudents();
        }
        
      • StudentTest.java

        //一对多,延迟加载
        //接口对应的Mapper文件
        StudentClassMapper studentClassMapper = session.getMapper(StudentClassMapper.class);
        //班级
        List studentClasses  = studentClassMapper.queryClassAndStudents();
        
        //班级信息
        for(StudentClass stuClass :studentClasses) {
            System.out.println(stuClass.getClassId()+","+stuClass.getClassName());
        
            System.out.println("-----------");
            for(Student student:  stuClass.getStudents()) {
                System.out.println(student.getStuNo()+","+student.getStuName());
            }	
        
      日志 概述
      网络设备、系统及服务程序等,在运作时都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关操作的描述。
      
      分类
      应用程序日志,安全日志、系统日志、Scheduler服务日志、DNS服务器日志等。
      
      日志级别
      级别从低到高为:
      DEBUG(调试信息)< INFO(提示信息)< WARN(警告信息)< ERROR(错误信息)
      
      如果设置为info,则只显示 info及以上级别的信息,即:WARN、ERROR;
      建议:在开发时设置debug,在运行时设置为info或以上。
      
      使用步骤(以 log4j 为例)
      • 导入log4j.jar ( mybatis.zip 中 lib 中包含此j ar )

      • 在conf.xml中指定和开启日志

        
            
                
                
            
        
        
        • 注意:如果不指定日志,MyBatis 则按以下顺序查找日志

          SLF4J → Apache Commons Logging → Log4j 2 → Log4j → JDK logging
          
      • 编写配置日志输出文件log4j.properties

        # 日志级别为 debug,在控制台输出日志信息(一般只配置这个)
        log4j.rootLogger=DEBUG, stdout
        log4j.appender.stdout=org.apache.log4j.ConsoleAppender
        log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
        log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
        
  • 转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/886002.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号