- Mybatis基础(四)
- 标签与动态SQL
- 常用标签
- 动态SQL
- 输入参数为对象的属性
- 输入参数为简单数组
- 输入参数为对象数组
- 输入参数为集合
- SQL片段
- 一对一、一对多的处理(关联查询)
- 延迟加载(懒加载)
- 延迟加载(一对一)
- 延迟加载(一对多)
- 日志
- 概述
- 分类
- 日志级别
- 使用步骤(以 log4j 为例)
-
if 标签
-
where标签
select * from student #{stuNo} -
foreach标签
select * from student #{stuNo}
输入参数为对象的属性
-
Student.java
public class Student { private int stuNo ; //学号 private String stuName ; private int stuAge ; private String graName ; }Grade.java
public class Grade { //学号 private ListstuNos ; //... 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(); ListstuNos = 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
-
小结
1、输入参数为简单数组时,if标签中的test属性为array,如:
2、输入参数为简单数组时,foreach标签中的collection属性值为 array,如: #{stuNo}
-
-
接口方法
List
queryStudentsWithArray(int[] stuNos); -
StudentTest.java
StudentMapper studentMapper = session.getMapper( StudentMapper.class) ; int[] stuNos = {1,2,53}; Liststudents = studentMapper.queryStudentsWithArray(stuNos) ; //接口的方法->SQL System.out.println(students); session.close();
-
Mapper.xml
-
接口方法
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}; Liststudents = studentMapper.queryStudentsWithObjectArray(stus) ; //接口的方法->SQL System.out.println(students); session.close();
-
Mapper.xml
-
接口方法
List
queryStudentsWithList(List stuNos); -
StudentTest.java
StudentMapper studentMapper = session.getMapper( StudentMapper.class) ; //int[] stuNos = {1,2,53}; ListstuNos = new ArrayList<>(); stuNos.add(1) ; stuNos.add(2) ; stuNos.add(53) ; List students = studentMapper.queryStudentsWithList(stuNos) ; //接口的方法->SQL System.out.println(students); session.close();
-
Mapper.xml
-
用法:在
中声明,在需要应用的地方,通过id进行引用。 #{student.stuNo}
-
一对一、一对多的处理(关联查询)
多条件联合查询(关联查询、联合查询),实现方式有两种: 方式一: 业务扩展类 核心:用 resultType 指定类的属性 包含 多表查询的所有字段,用类的继承实现 适合涉及的表(类)较少的场景 方式二(推荐使用): resultMap关系映射 通过 属性成员(成员变量) 将2个类建立起关系 适合复杂的场景,涉及较多的表(类) 备注:表与表之间是通过外键建立起关系的,类和类之间是通过成员属性(成员变量)建立起关系的
-
一对一的处理
-
方式一:业务扩展类
-
studentMapper.xml
-
实体类(业务扩展类)
-
StudentBusiness.java
public class StudentBusiness extends Student{ //学生业务扩展类 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; } @Override public String toString() { return super.toString() + "," + this.cardId + ","+this.cardInfo; } } -
接口方法
//采用业务扩展类实现 StudentBusiness queryStudentByNoWithOO(int stuno);
-
StudentTest
//查询单个学生(采用业务扩展类) public static void queryStudentByNoWithOO() 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); StudentBusiness studentBusiness = studentMapper.queryStudentByNoWithOO(2); //接口中的方法->SQL语句 System.out.println(studentBusiness); session.close(); }
-
-
方式二:resultMap关系映射实现
-
studentMapper.xml
-
实体类
-
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
-
小结
配置成员属性 students,学生和班级是一对多的关系; 如果学生这个属性(成员变量)的类型不是一个集合,即是一个对象类型,则属性类型用:javaType, 如果学生这个属性(成员变量)的类型是一个集合,属性的元素类型:ofType
-
-
实体类
-
StudentClass.java
import java.util.List; public class StudentClass { private int classId; private String className; //增加学生属性 (通过该字段 让Student类和StudentClass类建立起关联) Liststudents; public List getStudents() { return students; } public void setStudents(List students) { this.students = students; } public int getClassId() { return classId; } public void setClassId(int classId) { this.classId = classId; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } } -
接口方法
//根据班级 id 查询 班级信息 和 班级的所有学生信息 StudentClass queryClassAndStudents(int classId);
-
StudentTest
//查询班级 和班级对应的学生,一对多 public static void queryClassAndStudents() 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) ; //班级 StudentClass studentClass = studentMapper.queryClassAndStudents(1) ; System.out.println(studentClass.getClassId() + ","+studentClass.getClassName()); //班级对应的学生 Liststudents = studentClass.getStudents(); for(Student student:students) { System.out.println(student.getStuNo() + ","+student.getStuName() + "," + student.getStuAge()); } session.close(); }
-
-
-
延迟加载(懒加载)
-
定义
所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。 延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
-
作用
延迟加载机制避免了一些无谓的性能开销。
-
studentMapper.xml
-
StudentCardMapper.xml
-
conf.xml
- 注意:新增的Mapper.xml文件要在conf.xml中加载
-
StudentMapper.java
//查询所有学生,延迟加载学生证 List
queryStudentWithOOLazyLoad(); -
StudentTest.java
//查询全部学生,并延迟加载 每个学生对应的学生证 public static void queryStudentWithOOLazyLoad() 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() ; //接口对应的Mapper文件 StudentMapper studentMapper = session.getMapper(StudentMapper.class); //学生 Liststudents = studentMapper.queryStudentWithOOLazyLoad(); //接口中的方法 -> SQL语句 for(Student student:students) { System.out.println(student.getStuNo()+","+student.getStuName()); //获取学生证 StudentCard card = student.getCard() ; System.out.println(card.getCardId()+","+card.getCardInfo()); } session.close(); }
-
studentMapper.xml
-
StudentClassMapper.xml
- 注意:新增的Mapper.xml文件要在conf.xml中加载
-
StudenClasstMapper.java
//操作Mybatis的接口 public interface StudentClassMapper { //查询全部班级的接口方法 ListqueryClassAndStudents(); } -
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



