• Mybatis学习笔记10 高级映射及延迟加载


    Mybatis学习笔记9 动态SQL_biubiubiu0706的博客-CSDN博客

    无论简单映射(前面所学的单表和对象之间的映射关系)还是高级映射

    说到底都是java对象和数据库表记录之间的映射关系

    准备数据库表:一个班级对应多个学生.班级表:t_class   学生表:s_stu(自增) 

    新建模块

    项目整体结构

    pom.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0</modelVersion>
    6. <groupId>org.example</groupId>
    7. <artifactId>mybatis-09</artifactId>
    8. <version>1.0-SNAPSHOT</version>
    9. <properties>
    10. <maven.compiler.source>8</maven.compiler.source>
    11. <maven.compiler.target>8</maven.compiler.target>
    12. </properties>
    13. <dependencies>
    14. <!--mybatis依赖-->
    15. <dependency>
    16. <groupId>org.mybatis</groupId>
    17. <artifactId>mybatis</artifactId>
    18. <version>3.5.10</version>
    19. </dependency>
    20. <!--mysql依赖-->
    21. <dependency>
    22. <groupId>mysql</groupId>
    23. <artifactId>mysql-connector-java</artifactId>
    24. <version>8.0.30</version>
    25. </dependency>
    26. <!--logback依赖-->
    27. <dependency>
    28. <groupId>ch.qos.logback</groupId>
    29. <artifactId>logback-classic</artifactId>
    30. <version>1.2.11</version>
    31. </dependency>
    32. <!--junit依赖-->
    33. <dependency>
    34. <groupId>junit</groupId>
    35. <artifactId>junit</artifactId>
    36. <version>4.13.2</version>
    37. <scope>test</scope>
    38. </dependency>
    39. </dependencies>
    40. </project>

    SqlSessionUtil

    1. package example.utils;
    2. import org.apache.ibatis.io.Resources;
    3. import org.apache.ibatis.session.SqlSession;
    4. import org.apache.ibatis.session.SqlSessionFactory;
    5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    6. import java.io.IOException;
    7. /**
    8. * @author hrui
    9. * @date 2023/9/8 14:55
    10. */
    11. public class SqlSessionUtil {
    12. //工具类的构造方法一般都是私有化
    13. //方法都是静态的
    14. //为了防止new对象,构造方法私有化
    15. private SqlSessionUtil(){
    16. }
    17. private static SqlSessionFactory sqlSessionFactory;
    18. //类加载时候执行
    19. //SqlSessionUtil工具类在被加载的时候,解析mybatis-config1.xml.创建sqlSessionFactory对象
    20. static{
    21. try {
    22. //SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
    23. //下面这么写的原因是SqlSessionFactoryBuilder就是为了创建sqlSessionFactory而来的,使用完后,就不需要,都不需要创建个局部变量
    24. //一个sqlSessionFactory对应一个数据库
    25. sqlSessionFactory= new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config1.xml"));
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. //全局的 服务器级别的,一个服务器当中定义一个即可
    31. private static ThreadLocal<SqlSession> local=new ThreadLocal<>();
    32. //获取会话对象 返回会话对象
    33. public static SqlSession openSession(){
    34. SqlSession sqlSession=local.get();
    35. if(sqlSession==null){
    36. sqlSession = sqlSessionFactory.openSession();
    37. local.set(sqlSession);
    38. }
    39. return sqlSession;
    40. }
    41. //提供一个关闭的方法
    42. public static void close(SqlSession sqlSession){
    43. if(sqlSession!=null){
    44. //因为核心配置文件中配置POOLED 这里关闭是交还给连接池
    45. sqlSession.close();
    46. //注意移除SqlSession对象和当前线程的绑定关系
    47. //因为Tomcat服务器支持线程池 比如说t1线程用完了,close交还给连接池了,这个sqlSession属于不可用的状态,你没有remove出去 如果t2线程拿到了,那么这个sqlSession不可用
    48. local.remove();
    49. }
    50. }
    51. }

    logback.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration debug="false">
    3. <!--定义⽇志⽂件的存储地址-->
    4. <property name="LOG_HOME" value="D:/home"/>
    5. <!-- 控制台输出 -->
    6. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    7. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    8. <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
    9. 个字符宽度%msg:⽇志消息,%n是换⾏符-->
    10. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    11. </encoder>
    12. </appender>
    13. <!-- 按照每天⽣成⽇志⽂件 -->
    14. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    16. <!--⽇志⽂件输出的⽂件名-->
    17. <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
    18. <!--⽇志⽂件保留天数-->
    19. <MaxHistory>30</MaxHistory>
    20. </rollingPolicy>
    21. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    22. <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
    23. 个字符宽度%msg:⽇志消息,%n是换⾏符-->
    24. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logge
    25. r{50} - %msg%n</pattern>
    26. </encoder>
    27. <!--⽇志⽂件最⼤的⼤⼩-->
    28. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    29. <MaxFileSize>100MB</MaxFileSize>
    30. </triggeringPolicy>
    31. </appender>
    32. <!--mybatis log configure-->
    33. <logger name="com.apache.ibatis" level="TRACE"/>
    34. <logger name="java.sql.Connection" level="DEBUG"/>
    35. <logger name="java.sql.Statement" level="DEBUG"/>
    36. <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    37. <!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
    38. <root level="DEBUG">
    39. <appender-ref ref="STDOUT"/>
    40. <appender-ref ref="FILE"/>
    41. </root>
    42. </configuration>

    核心配置文件

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <setting name="mapUnderscoreToCamelCase" value="true"/>
    8. settings>
    9. <typeAliases>
    10. <package name="example.pojo"/>
    11. typeAliases>
    12. <environments default="development">
    13. <environment id="development">
    14. <transactionManager type="JDBC"/>
    15. <dataSource type="POOLED">
    16. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    17. <property name="url" value="1"/>
    18. <property name="username" value="1"/>
    19. <property name="password" value="1!"/>
    20. <property name="poolMaximumActiveConnections" value="10"/>
    21. <property name="poolMaximumIdleConnections" value="5"/>
    22. <property name="poolMaximumCheckoutTime" value="20000"/>
    23. dataSource>
    24. environment>
    25. environments>
    26. <mappers>
    27. <mapper resource="mapper/StuMapper.xml"/>
    28. <mapper resource="mapper/ClazzMapper.xml"/>
    29. mappers>
    30. configuration>

    在Student暂时没有把cid作为属性,一会用特殊处理方式  不需要将cid这个关系字段放进去

     

    Clazz

    两个接口对应两个映射.xml

    多对一映射实体    多个学生对应一个班级  反过来就是一个班级对应多个学生

    所谓ORM    O(JVM里的对象内存)     R(数据库表记录)     M(Mapping映射关系)

    创建多对一实体类   Student修改以下  把Clazz放进去

    把两张表的数据映射为对象

    多对一  

    3种方式

    第⼀种⽅式:⼀条SQL语句,级联属性映射。
    第⼆种⽅式:⼀条SQL语句,用association标签。
    第三种⽅式:两条SQL语句,分步查询。(这种⽅式常⽤:优点⼀是可复⽤。优点⼆是⽀持懒加
    载。)
    第⼀种⽅式:⼀条SQL语句,级联属性映射。
    第⼆种⽅式:⼀条SQL语句,用association标签。
    第三种⽅式:两条SQL语句,分步查询。(这种⽅式常⽤:优点⼀是可复⽤。优点⼆是⽀持懒加
    载。)
    这种方式   第一:就是用学生id查出学生信息  第二:用学生关联的班级id去查班级信息
    上面这种方式有利于复用.都是独立的一个功能,其他地方也可以用

    关于延迟加载(默认不开启,只针对当前SQL语句)

    也就是说,第二步的SQL需不需要执行,看你用不用(如何理解看下面)

    可以通过配置mybatis核心配置文件来控制是否开启全局懒加载,如果配置了全局懒加载  那么这里的可以去掉不写

    如果配置了  那么  

    fetchType="lazy"可以不写

    实际开发中,此种情况都应该开启全局懒加载(局延迟加载)--->针对此种写法的sql

    如果说,开启了全局延迟加载,但是我的这两句SQL不想用延迟加载,那么添加

    fetchType="eager"

    实际开发一般配全局延迟加载   如果你的分步SQL有特殊需要  可以fetchType="eager"

    输出student的话,就是说已经用了

    下面演示   

    一对多关系

    一个班级有多个学生     班级为主表    把学生放到班级类中    多个学生对象List

    1对多

    1为主表  即Clazz

    在Clazz表中新增字段List stus;

    1对多的映射实现通常两种方式:

    第⼀种⽅式:collection
    第⼆种⽅式:分步查询
    第⼀种⽅式:collection
    第⼆种⽅式:分步查询
    首先查班级信息          然后该班级的学生信息    
    关于1对1关系
    关于多对多.......
       
  • 相关阅读:
    VSCode使用教程
    【EdgeX(15)】 :在EdgeX环境下配置eKuiper规则引擎服务,配置规则处理device-virtual发送的数据,并转发给HTTP服务
    redis群集
    【Linux网络编程】高级I/O
    SQL基础语句入门
    目标检测 YOLOv5 - 模型推理预处理 letterbox
    最长不下降子序列(接上一篇)
    推荐一个很好的vuepress doc模板
    C语言之位域(位段)入门详解
    WPS与Office的恩怨情仇,这6个电脑冷知识,你知道几个?
  • 原文地址:https://blog.csdn.net/tiantiantbtb/article/details/133050106