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

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

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

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

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

新建模块

项目整体结构

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis-09</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><!--logback依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency><!--junit依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>

SqlSessionUtil

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

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!--定义⽇志⽂件的存储地址--><property name="LOG_HOME" value="D:/home"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 按照每天⽣成⽇志⽂件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--⽇志⽂件输出的⽂件名--><FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--⽇志⽂件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--⽇志⽂件最⼤的⼤⼩--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>100MB</MaxFileSize></triggeringPolicy></appender><!--mybatis log configure--><logger name="com.apache.ibatis" level="TRACE"/><logger name="java.sql.Connection" level="DEBUG"/><logger name="java.sql.Statement" level="DEBUG"/><logger name="java.sql.PreparedStatement" level="DEBUG"/><!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR --><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/></root>
</configuration>

核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--转驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--指定实体类包别名--><typeAliases><package name="example.pojo"/><!--这样写指定包,resultType可以类名并且不区分大小写 比如cAr CAR CaR caR-->
<!--        <typeAlias type="pojo.Car" alias="aaa"></typeAlias>-->
<!--        <typeAlias type="pojo.Log" alias="bbb"></typeAlias>--><!--alias别名可以省却,默认大小写类名-->
<!--        <typeAlias type="pojo.Log"></typeAlias>--></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="1"/><property name="username" value="1"/><property name="password" value="1!"/><property name="poolMaximumActiveConnections" value="10"/><!--最大连接数--><property name="poolMaximumIdleConnections" value="5"/><!--最大空闲连接--><property name="poolMaximumCheckoutTime" value="20000"/><!--检出时间毫秒 默认即20秒--></dataSource></environment>
<!--        <environment id="development2">-->
<!--            <transactionManager type="JDBC"/>-->
<!--            <dataSource type="UNPOOLED">-->
<!--                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--                <property name="url" value="jdbc:mysql://localhost:3306/mybatis3"/>-->
<!--                <property name="username" value="root"/>-->
<!--                <property name="password" value="123456"/>-->
<!--            </dataSource>-->
<!--        </environment>--></environments><!--resource属性会自动从类的根路径下开始查找资源.--><!--1.<package name="包名"> 标签用于自动扫描指定包下的映射文件,要求映射文件名和接口名保持一致,并且映射文件(.xml)和接口需要在同一个包中,否则会报错。2.<mapper class=""> 标签的class属性用于注册映射文件,同样要求映射文件名和接口名保持一致,并且映射文件(.xml)和接口需要在同一个包中,否则会报错。3.<mapper resource="org/xx/demo/mapper/xx.xml"/> 标签用于注册映射文件,与上述两种方式不同,这种方式不要求映射文件名和接口名一致。这里是通过命名空间(namespace)和mapper接口对应的,命名空间要与接口的全限定名保持一致。4.<mapper url="file:///d:/StuMapper.xml" />是绝对路径加载映射文件的,而且 .xml 文件的名称并不需要和接口名称相同。通过命名空间指定和接口关系--><!--告诉mybatis去哪里找mapper文件--><mappers><mapper resource="mapper/StuMapper.xml"/><mapper resource="mapper/ClazzMapper.xml"/></mappers>
</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<Student>

1对多

1为主表  即Clazz

在Clazz表中新增字段List<Student> stus;

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

第⼀种⽅式:collection
第⼆种⽅式:分步查询
第⼀种⽅式:collection
第⼆种⽅式:分步查询
首先查班级信息          然后该班级的学生信息    
关于1对1关系
关于多对多.......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter接口测试

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

ElementUI基本介绍及登录注册案例演示

目录 前言 一.简介 二.优缺点 三.Element完成登录注册 1. 环境配置及前端演示 1.1 安装Element-UI模块 1.2 安装axios和qs(发送get请求和post请求) 1.3 导入依赖 2 页面布局 2.1组件与界面 3.方法实现功能数据交互 3.1 通过方法进行页面跳转 3.2 axios发送get请求 …

Spring面试题10:Spring的XMLBeanFactory怎么使用

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring的XMLBeanFactory怎么使用 XmlBeanFactory是Spring框架中的一个实现类,它是BeanFactory接口的一个具体实现。XmlBeanFactory的主要作用是通…

4.2 Serializable Concept(3)

Compile Time Warnings and Errors 一些序列化特性可能与其他特性发生冲突。有时&#xff0c;这些冲突会导致错误的行为&#xff08;例如&#xff0c;创建无法读取的归档&#xff09;&#xff0c;而其他时候它们代表了库用户可能存在的概念错误&#xff0c;可能导致意外行为。…

使用cv2将图片改为素描图

1 使用cv2&#xff0c;将图片改为素描图&#xff0c;效果如图&#xff1a; 2 代码实现&#xff1a; python 3.8 import cv2img cv2.imread("2.jpg") # 灰度 grey cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) invert cv2.bitwise_not(grey) # 高斯滤波 blur_img cv2…

【JAVA】关于抽象类的概念

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 在Java中&#xff0c;抽象类是一种特殊的类&#xff0c;它无法被实例化。它只能被用作其他类的基类&#xff0c;以便子类可以继承它的属性和方法。今天我们就来谈谈JAVA中的抽象类。…

Java Spring Boot: 极简配置与快速开发的利器

引言&#xff1a; Java Spring Boot是一款开源的Java框架&#xff0c;它以极简配置和快速开发为特点&#xff0c;帮助开发者轻松构建基于Spring框架的应用程序。本文将介绍Spring Boot的核心特性&#xff0c;并结合案例和代码&#xff0c;展示其在简化配置、内嵌服务器、自动化…

C++编程法则365天一天一条(14)sizeof运算符使用

文章目录 基本用法失效的多态数组就是数组使用限制作用于空class作用于引用基本用法 sizeof运算符用于查询对象或类型的大小。它在编译时计算,并返回以字节为单位的对象或类型的大小。 在某些情况下,我们需要知道对象的实际大小。例如,当我们分配内存或操作具有特定大小要…

qml 无法修改listview表头控件文本

比如在Listview的表头设置了一个复选框&#xff0c;之后想要在其他控件中动态修改复选框的文本&#xff0c;通过id来修改无效&#xff0c;因为它在表头内&#xff0c;对其他控件来说未定义。可以采用一个外部属性来解决&#xff1a; Window {width: 400height: 400visible: tr…

[2023.09.24]: 今天差点又交白卷

今天周日&#xff0c;搞定了家里装修的一件事情&#xff0c;周末的事特别多&#xff0c;总算在10点的时候&#xff0c;解决了昨天那个输入焦点设置失败的问题。 在探索Rust编写基于web_sys的WebAssembly编辑器&#xff1a;挑战输入光标定位的实践中&#xff0c;我们总结了设置光…

线性代数基础-行列式

一、行列式之前的概念 1.全排列&#xff1a; 把n个不同的元素排成一列&#xff0c;称为n个元素的全排列&#xff0c;简称排列 &#xff08;实际上就是我们所说的排列组合&#xff0c;符号是A&#xff0c;arrange&#xff09; 2.标准序列&#xff1a; 前一项均小于后一项的序列…

[Linux入门]---管理者操作系统

文章目录 1.操作系统概念2.设计操作系统的目的3.操作系统如何进行管理系统调用和库函数概念 1.操作系统概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

滑动窗口-求数组的所有连续子数组【学习算法】

滑动窗口-求数组的所有连续子数组【学习算法】 前言版权推荐滑动窗口-求数组的所有连续子数组代码 最后 前言 2023-9-24 22:46:27 以下内容源自《【学习算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页…

【android】如何设置LD_LIBRARY_PATH?

目录 一 配置方法 1 进入Android shell 2 使用export命令 3 使用echo命令查看变量是否设置成功 二 扩展 1 LD_LIBRARY_PATH设置多个路径 2 push文件 一 配置方法 android中配置LD_LIBRARY_PATH的方法具体为&#xff1a; 1 进入Android shell adb shell 2 使用export…

ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、数据库表方面 在原来sys_notice修改基础上增加一个表叫sys_notice_send 表结构如下&#xff1a; DROP …

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …

GitStats - 统计Git所有提交记录工具

如果你是研发效能组的一员或者在从事 CI/CD 或 DevOps&#xff0c;除了提供基础设施&#xff0c;指标和数据是也是一个很重要的一环&#xff0c;比如需要分析下某个 Git 仓库代码提交情况&#xff1a; 该仓库的代码谁提交的代码最多 该仓库的活跃度是什么样子的 各个时段的提交…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前&#xff0c;请先退出360、电脑管家等安全类软件&#xff0c;这类软件会阻止我们安装的软件进行注册表注册&#xff0c;很可能导致安装失败。确认物理机&#xff08;也就是你自己使用的电脑&#xff09;的防火墙已经关闭。 下载 打开…

python web编程一:token、session、cookie、密码加解密

1 认证 1 传统的session-cookie机制 HTTP协议是无状态协议&#xff0c;为了解决它产生了cookie和session技术。 浏览器发起第一次请求到服务器&#xff0c;服务器发现浏览器没有提供session id&#xff0c;就认为这是第一次请求&#xff0c;会返回一个新的session id给浏览器…