资讯动态

mybatis基础二——Maven进阶:scope依赖范围、依赖传递、聚合父子工程

发布时间:2026/8/9 7:45:20 来源:尧图企业网站定制
一、依赖范围scope五大取值pom里dependency内的scope控制jar包在哪套环境生效分编译、测试、打包上线三个阶段不同范围权限不一样。这个表示的是maven的依赖范围就是当前他的这个jar包在什么范围能够有效的使用在什么范围不能用到。test单元测试专用例JUnit只有src/test测试代码能导入main业务代码直接爆红用不了打包上线时不会打进项目。原因单元测试只是开发阶段自测上线成品不需要测试代码。provided服务器自带包例servlet-api编译、测试能用打包部署时不带这个jar场景Tomcat服务器本身自带servlet包项目再打包进去会版本冲突只开发时用就行。compile默认值不写scope就是它编译、测试、打包上线全都生效MySQL驱动、日常工具包基本都是这个范围。runtime运行时才生效例JDBC驱动写代码编译时识别不到只有跑测试、线上运行才加载对应反射Class.forName加载驱动场景。system极少用不推荐不从Maven仓库下载指定电脑本地磁盘jar物理路径失去Maven统一管理优势开发基本不用。搭配这个二、依赖传递A依赖BB的依赖自动传给A打包并放到仓库好处依赖传递providea和test因为打包时不起效所以依赖不了如下是A项目通过jar包依赖到另一个项目传递规则只有scope为compile/runtime的依赖才会向下传递test、provided不会传给依赖方。例子B项目引入servlet-api(provided)A项目依赖BA拿不到servletB引入mysql(compile)A自动拿到mysql。阻断/修改传递依赖的方案在B项目里进行设置它要不要传给A通过改scope作用范围如果B项目无法处理可以在A项目里手动排除某些依赖方案1源头设置optionaltrue在被依赖项目B的依赖上加optionaltrue这个包不会传递给A默认false是允许传递。方案2依赖时exclusions手动排除最常用A依赖B的时候用exclusion标签指定groupartifact直接过滤掉不想要的传递包不用改B的代码。方案3A自己重新引入高/低版本同包A直接单独引入该jarMaven就近优先覆盖传递过来的旧版本。查看依赖链IDEA实操右侧Maven面板→Show Dependency Diagram图形化展示每个jar来自哪个依赖方便排查版本冲突。三、聚合工程Parent聚合项目统一批量管理模块1. 聚合项目作用把多个独立模块前台、后台、公共工具放进一个父外壳工程一键批量clean/compile/package/install不用挨个模块执行命令不用来回切窗口。2. 创建配置步骤新建普通Maven项目当父工程直接删除src文件夹父壳不写业务代码新建模块讲课阶段先不设置parent只做一个纯粹的模块来用先建两个独立模块在parent里设置打包方式packagingpom/packaging设置成pom后表示其不再是一个具体的包而是作为虚拟的项目去管理下面的工程标识这是聚合外壳不打jar/war包新增modules标签把子模块名字全部写进去moduleC/module现在在D里设置D依赖C更新一下maven就能看到已经拿到了对父工程处理所有子模块自动处理。四、父子继承工程parent继承统一版本管理创建父子工程1.这里填上parent2.把普通模块改成父子关系先在父里写进去子工程再在子工程里设置父工程坐标因为继承了父工程自己的组id和版本名不需要写了需要写上自己的模块名字加载不出来就清一下缓存3.子工程完全继承父工程依赖依赖臃肿父工程里创建dependencyManagement不想让子工程继承的依赖放进来如果子工程确实需要用到上面的mysql就直接在子工程里加依赖因为有继承父类里有8.3.0版本所以子工程这里没有提示写版本即可以在父工程里对所有的依赖进行版本管理父子工程一般用父工程管理jar包版本mybatis是一个持久层框架数据持久化第一部分前置基础分层架构 持久化概念1 什么是数据持久化内存断电数据直接消失数据库 / 文件把数据存到硬盘永久保存这个操作就叫持久化。专门做持久化的代码模块叫持久层对应项目 Dao/Mapper 层。2 Java 三层开发分工饭店类比控制层 Controller对接前端接收请求、返回数据前台接待业务层 Service处理业务逻辑后厨炒菜数据层 Dao/Mapper操作数据库MyBatis 就是这一层专用框架3 原生 JDBC 痛点为啥要用 MyBatis原生 JD 一套流程全要手写加载驱动→获取连接→创建执行对象→写 SQL→封装 Result 结果集→关闭资源。一堆重复模板代码还要手动把数据库记录转 Java 对象特别麻烦。MyBatis 底层封装 JD连接、结果自动封装咱们只需要专注写 SQL 就行。补充MyBatis 前身叫 iBatis2010 年后改名。第二部分Maven 项目 MyBatis 依赖配置新建普通 Maven 工程即可pom.xml 必须引入 4 类核心依赖mybatis 核心包提供框架所有功能mysql 驱动包连接 mysql 数据库8.x 版本带 cjjunit 单元测试不用写 main 方法Test 注解直接跑代码log4j 日志包打印 SQL 执行日志方便排错实操坑复制依赖只复制dependency内部内容不要乱改项目自身 groupId/version写完刷新 Maven 自动下载 jar。第三部分项目分层代码搭建规范标准目录这里用的我code2026里的mysql07数据库1 实体类 entity对应数据库表包名com.xxx.entity一张表对应一个实体类Student 表→Student 类一般创建一个标准的javaBean类----所有属性被private修饰通过getset方法进行操作把鼠标光标放到java类的大括号内再按住AltInsert进行操作属性对应表字段优先使用包装类Integer/String因为数据库有空数据以及之后可能用集合集合只支持包装类规范所有属性 private生成 get/set、toString 方法方便打印查看数据。2 Dao/Mapper 接口数据库操作规范实现什么操作在接口里声明后续要把接口里的方法全实现了导入集合时导入这个包名com.xxx.dao作用定义对表的增删改查方法只声明不写实现。示例ListStudent findAll();查询全部学生不用 Java 类写实现改用 XML 映射文件写 SQL改 SQL 不用重新编译 Java 代码更灵活。3 Mapper 映射 XML 文件写 SQL 专用存放位置resources/mapper 文件夹统一管理 SQL 文件IDEA 快捷模板配置File→Settings→Editor→File and Code Templates配置Mapper模板3 文件核心标签说明版本声明和编码引入mybatis的dtd规范所有操作写在mapper这个标签内部namespace名称空间找的是哪个接口下的哪个方法必须对应完整 Dao 接口全类名绑定接口和 SQLselect查询标签id 对应接口方法名resultType 指定这条 select 查询返回结果要封装成什么类型示例查询全部学生select * from student框架自动把多行数据封装成 ListStudentMapper XML文件第四部分MyBatis 全局主配置文件 SqlMapConfig.xml放在 resources 根目录是 MyBatis 总开关所有数据库、映射文件都在这配置。全局配置文件根标签类似html的html标签整个mybatis的配置全在里面1 environments 设置数据库环境可以配置多套数据库environment开发库、测试库、线上库default指定当前启用哪一套environment 内部三块transactionManager事务管理多个操作保证同时完成或失败typeJDBC 原生事务增删改必须手动 commit 提交 rollback 回滚查询不用事务dataSource 数据源 / 连接池大白话不用每次新建销毁数据库连接启动提前创建一批连接放池子随取随还大幅提升性能内部 property 配置驱动driver、url连接哪个数据库连远程则改成远程ip)、数据库账号、密码2 mappers 注册映射文件mapper resourcemapper/StudentDao.xml/告诉 MyBatis 去哪找写 SQL 的 Mapper 文件不配置会找不到 SQL直接报错。第五部分MyBatis 完整执行流程测试类实操1 固定执行步骤测试类 Test用 Resources 工具类读取全局配置文件生成输入流SqlSessionFactoryBuilder 建造者根据流创建SqlSessionFactory会话工厂工厂创建销毁开销极大整个项目只创建一次工厂 openSession () 获取 SqlSession 会话相当于 JDBC 连接两种方式执行 SQL方式 1不推荐session.selectList (命名空间。方法名) 查多条数据session.selectOne()查单条数据方式 2推荐动态代理StudentDao mapper session.getMapper(StudentDao.class);底层 JDK 动态代理生成接口实现类直接调用接口方法编译校验不会写错调用 mapper.findAll () 拿到 List 集合循环打印实体数据关闭会话、释放资源连接放回连接池不是销毁池子2 核心对象通俗类比SqlSessionFactory 奶茶店只建一次SqlSession 店里员工每次操作新建用完放回SqlSessionFactory、SqlSession、Mapper 代理三者关系理解底层封装 JD 的逻辑1. 对象职责SqlSessionFactory工厂全局单例读取SqlMapConfig.xml全局配置、所有 Mapper 映射文件解析配置、加载连接池、封装 JDBC 基础信息作用生产 SqlSession项目只创建一个SqlSessionFactory重量级对象。SqlSession会话一次数据库会话由工厂openSession()创建内部持有数据库连接Connection负责执行 SQL、事务控制提交 / 回滚核心方法getMapper(接口.class)轻量级每次数据库操作新建用完关闭。Mapper代理对象StudentDao mapperStudentDao mapper session.getMapper(StudentDao.class);不是我们自己写的实现类SqlSession 利用动态代理自动生成 Dao 接口的实现类我们调用mapper.findAll()→ 底层交给 SqlSession 执行 SQL作用简化代码不需要手写selectOne/selectList直接调用接口方法。2. 调用顺序执行流程SqlSessionFactory→ 创建 →SqlSession→ 生成 →Mapper代理对象业务代码调用 mapper 方法 → 方法转发给 SqlSession → SqlSession 执行 JDBC 操作二、底层封装 JDBC 逻辑对照你上面的代码原生 JDBC 固定流程加载驱动获取 Connection 连接创建 PreparedStatement执行 SQL封装 ResultSet 结果到实体类关闭连接、释放资源✅MyBatis封装做的事情SqlSessionFactory统一管理数据库连接信息url、账号、驱动替代重复写 JDBC 连接参数SqlSession内部持有 Connection封装 Statement 创建、SQL 执行、结果集解析Mapper 动态代理你调用mapper.findAll()代理拦截这个方法 → 根据接口全限定名 方法名找到 Mapper.xml 内对应的 SQL 语句→ 交给 SqlSession 执行查询 → 自动把 ResultSet 映射成ListStudent三、通俗总结SqlSessionFactory工厂造会话SqlSession只造一次SqlSession数据库会话拿着连接干活能生产 Mapper 代理Mapper 代理给程序员调用的门面底层全部委托 SqlSession 完成 JDBC 操作四、补充关键考点openSession()默认关闭自动提交增删改必须手动session.commit()Mapper 代理只是壳所有数据库操作最终都由 SqlSession 完成原生 JDBC 大量重复模板代码MyBatis 把连接创建、语句封装、结果映射全部封装只需要写 SQL。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价