新闻详情

新闻详情

首页 / 资讯中心 / 详情

MyBatis入门:从Maven多模块到持久层框架实战

发布时间:2026/9/27 9:26:42来源:尧图网络
MyBatis入门:从Maven多模块到持久层框架实战
第一部分Maven多模块与聚合工程1.1 项目依赖关系⭐老师强调A项目依赖B项目B是被依赖方A是依赖方。引入B项目就能把其依赖全部带过来可通过optional或scope控制不传递某些依赖。传递依赖的局限B项目做的任何更新A项目无法及时拿到必须手动对B项目重新打包、提交A项目才能生效⭐老师强调继承式依赖传递虽方便但缺乏实时性一方改动后另一方得重新构建才能同步。1.2 聚合工程⭐老师强调聚合工程是把一个项目拆成多个工程用一个总工程汇聚起来。比如功能多的项目分前台、后台、公共模块各由不同组开发。创建聚合工程步骤步骤操作1删掉src目录聚合工程是容器不写具体代码2改pom.xml里packaging为pom默认是jar3右键选Module添加子模块4在总工程中用modules配置管理子模块!-- 总工程 pom.xml -- packagingpom/packaging modules modulea/module moduleb/module /modules⭐老师强调聚合项目≠父子工程——聚合偏一键构建多模块父子项目偏配置与依赖继承。1.3 父子工程⭐老师强调父子工程中子模块通过parent指定父工程坐标自己只需配模块名groupId、version可从父继承。!-- 子模块 pom.xml -- parent groupIdcom.qcby/groupId artifactIddemo/artifactId version1.0-SNAPSHOT/version /parent artifactIdc/artifactId依赖管理方式对比方式说明问题直接放父工程父声明的依赖强制传递给所有子模块炸包泛滥a模块不需要mysql也被迫引入dependencyManagement父只管版本与声明子按需引入子工程必须显式引才生效!-- 父工程dependencyManagement只管版本不直接引入 -- dependencyManagement dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /dependencyManagement !-- 子模块a只引坐标不写版本版本自动取自父 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency⭐老师强调Spring Boot项目本质就是官方父工程的子工程配置parent后加依赖只需写groupId和artifactId版本由父统一管理。第二部分分层开发架构2.1 从Servlet到分层⭐老师强调传统Servlet项目一个类包揽所有事——接收请求、业务逻辑、操作数据库、构造返回数据。现在框架分层处理原来像小作坊啥都干现在像流水线各层只做一类事。三层架构层职责对应框架控制层Controller接收请求、返回数据Spring MVC业务层Service处理业务逻辑Spring粘合剂持久层Dao/Mapper数据持久化到数据库MyBatis⭐老师强调持久层的本质是解决内存易失性问题——内存断电就消失持久层让数据长久保存到磁盘。2.2 SSM框架组合字母框架作用SSpring MVCWeb层接收请求SSpring粘合剂承上启下整合其他框架MMyBatis持久层数据访问⭐老师强调Spring不是业务层框架而是粘合剂——上接Spring MVC下连MyBatis像大管家。业务逻辑本身没有固定框架选课系统、美团外卖业务各不相同。第三部分MyBatis概述3.1 JDBC的痛点⭐老师强调MyBatis是为解决原生JDBC的繁琐而生的。JDBC的三大问题问题说明步骤冗余加载驱动→创建Connection→创建Statement→处理ResultSet→关资源SQL硬编码SQL写在Java程序里改SQL要重新编译整个文件硬解析查询结果需手动逐行取数据并拼接麻烦且易错⭐老师强调JDBC防SQL注入无法自动化——靠占位符逐个匹配得人为挨个复制参数。哪怕用现成封装包底层还是字符串拼接换格式仍要改。3.2 MyBatis的解决方案⭐老师强调MyBatis本质是对JDBC的封装底层用了反射机制。按MyBatis规范写好配置和映射它会自动完成数据查询与结果封装。对比JDBCMyBatisSQL位置Java代码里XML配置文件结果封装手动硬解析自动映射到实体类参数处理手动逐个设置自动映射传参方式字符串实体类任意类型第四部分MyBatis环境搭建4.1 引入依赖dependencies !-- MyBatis -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.19/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.29/version /dependency !-- JUnit测试 -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency !-- 日志 -- dependency groupIdlog4j/groupId artifactIdlog4j/artifactId version1.2.17/version /dependency /dependencies⭐老师强调用MyBatis必须引MyBatis依赖和MySQL驱动包缺驱动就无法连库操作。很多人以为只引MyBatis就够了其实MyBatis只是封装层底层还得靠驱动连库。4.2 创建实体类package com.qcby.entity; public class Student { private Integer id; // 用包装类可能为null private String name; private Integer age; // 用Integerint不能赋null private String sex; // getter/setter public Integer getId() { return id; } public void setId(Integer id) { this.id id; } // ...其他getter/setter // toString不加打印对象只出内存地址 Override public String toString() { return Student{ id id , name name \ , age age , sex sex \ }; } }⭐老师强调实体类字段与数据库字段匹配。数字字段用包装类如Integer而非基本类型int因为数据库查出的字段可能为null。不加toString打印对象只会出内存地址。4.3 主配置文件SqlMapConfig.xml?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration environments defaultmysql environment idmysql !-- 事务类型本地事务策略 -- transactionManager typeJDBC/ !-- 数据源POOLED使用连接池 -- dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/qcby07/ property nameusername valueroot/ property namepassword value2020/ /dataSource /environment /environments mappers mapper resourcemapper/StudentDao.xml/ /mappers /configuration配置详解标签作用environments可配多套环境本地开发、远程部署等default指定当前生效transactionManager事务类型JDBC本地事务策略dataSource数据源POOLED使用连接池mappers注册映射文件不注册就找不到⭐老师强调environments可定义多个数据库环境上线改库只需改此配置。连接池提前建好一批连接放在池里要用时取出执行完归还避免反复创建销毁的开销。⭐老师强调mapper路径设置很关键只有注册后系统才能根据namespace找到接口。不注册就等于没存分机号绝对呼不通。4.4 映射文件StudentDao.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.qcby.dao.StudentDao !-- id对应接口方法名resultType是返回的实体类全名 -- select idfindAll resultTypecom.qcby.entity.Student select * from student /select /mapper⭐老师强调namespace是命名空间用来区分不同mapper也是接口的全路径id是接口方法名不是数据库列名resultType是Java类型写全路径名可能同时存在别的实体类查出多行数据框架自动把每行塞进Student对象再组装成集合4.5 接口StudentDao.javapackage com.qcby.dao; import com.qcby.entity.Student; import java.util.List; public interface StudentDao { // 查找全部学生信息 ListStudent findAll(); }⭐老师强调接口定义规范实现类未必限于Java代码——XML文件也可以作为实现类。接口只定规范实现形式可多样。第五部分MyBatis核心API5.1 三层核心对象⭐老师强调三者是层层依赖的上下游关系。SqlSessionFactoryBuilder → 构建 → SqlSessionFactory → 生产 → SqlSession 建造者 工厂 会话对象作用SqlSessionFactoryBuilder构建工厂SqlSessionFactory会话工厂用来生产SqlSessionSqlSession数据库会话真正干活的对象5.2 完整测试代码package com.qcby; import com.qcby.dao.StudentDao; import com.qcby.entity.Student; 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 org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class StudentTest { private InputStream inputStream null; private SqlSession session null; private StudentDao mapper null; Before // 前置通知每个test执行前自动跑 public void init() throws IOException { // 1. 加载主配置文件 inputStream Resources.getResourceAsStream(SqlMapConfig.xml); // 2. 创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream); // 3. 创建SqlSession对象 session sqlSessionFactory.openSession(); // 4. 通过sqlsession创建接口的代理对象 mapper session.getMapper(StudentDao.class); } After // 后置通知每个test执行后自动跑 public void destroy() throws IOException { session.close(); inputStream.close(); } Test public void run() throws IOException { // 直接用代理对象调方法 ListStudent students mapper.findAll(); for (Student student : students) { System.out.println(student); } } }⭐老师强调配置文件名称可随意只要代码里读取名和实际文件名配对。resource目录下即根目录直接读若埋得深就加文件夹名。5.3 SqlSession常用方法方法作用selectList查多条底层封装为ArrayListselectOne查单条insert插入update修改delete删除commit事务提交rollback事务回滚getMapper获取映射代理对象⭐老师强调做增删改查须手动提交事务commit想撤销要手动rollback。查询不需事务处理。5.4 JDK动态代理⭐老师强调session.getMapper(StudentDao.class)底层用JDK动态代理在内存中直接生成接口实现类。动态代理 vs 字符串定位方式代码说明字符串定位session.selectList(com.qcby.dao.StudentDao.findAll)硬编码易错且难维护动态代理mapper.findAll()运行时按接口生成实现更灵活⭐老师强调JDK动态代理必须基于接口。拿到代理对象后直接点方法即可代理会自动调用目标对象里的对应方法。好比拨分机号总机代理自动转给实际同事目标对象。附录一MyBatis执行流程图1. 加载主配置文件SqlMapConfig.xml │ ▼ 2. SqlSessionFactoryBuilder().build(inputStream) │ ▼ 3. 创建 SqlSessionFactory │ ▼ 4. sqlSessionFactory.openSession() 创建 SqlSession │ ▼ 5. session.getMapper(StudentDao.class) 获取代理对象 │ ▼ 6. mapper.findAll() 执行查询 │ ▼ 7. 处理结果集自动映射到实体类 │ ▼ 8. 关闭资源session.close() / inputStream.close()启动流程先读主配置得知连哪个库→ 再读映射文件完成对应映射。像先翻通讯录确认识人范围再查分机号找具体人。文件路径如下
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3个实战案例搞定wordpress粘贴媒体库,告别建站拖一周 2026/9/27 11:36:14

3个实战案例搞定wordpress粘贴媒体库,告别建站拖一周

3个实战案例搞定wordpress粘贴媒体库,告别建站拖一周 改个需求建站公司拖一周,这种憋屈事你遇到过吗?我干这行十年,见过太多老板因为一个小小的图片粘贴问题,被外包团队以“技术难点”为由拖延工期,最后多花几万块加急费。其实,wordpr…

阅读更多 →
【西里网】- OPENCLAW_GATEWAY_TOKEN 配置避坑:Docker Compose 下 env_file 与 gateway.auth.mode 实战 2026/9/27 11:36:14

【西里网】- OPENCLAW_GATEWAY_TOKEN 配置避坑:Docker Compose 下 env_file 与 gateway.auth.mode 实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
数字物业安全监测全链路:从传感器接入到云平台告警闭环 2026/9/27 11:35:46

数字物业安全监测全链路:从传感器接入到云平台告警闭环

半夜两点,物业值班室的电话响起来。水泵房漏水报警,值班员赶过去一看,地面已经积了一层水。其实系统早就报了警,短信发了、平台亮了红点,但告警推送链路没有落到个人,晚上没人盯,等早上发现时水…

阅读更多 →
御三家-Claude、ChatGPT、Gemini最新横评:用TaoToken统一Key跑通三模型对比 2026/9/27 11:35:46

御三家-Claude、ChatGPT、Gemini最新横评:用TaoToken统一Key跑通三模型对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
避坑指南:厦门网站设计公司推荐哪家好,3步验真防高价 2026/9/27 11:35:39

避坑指南:厦门网站设计公司推荐哪家好,3步验真防高价

避坑指南:厦门网站设计公司推荐哪家好,3步验真防高价 在厦门找建站公司,最怕的就是报价低、签约后加价,或者做完网站打开速度像蜗牛。很多老板在问“厦门网站设计公司推荐哪家好”时,心里其实没底,因为行业水太深,模板站和定制站的价格能差十倍。别急…

阅读更多 →
数据结构与算法——并查集 2026/9/27 11:35:39

数据结构与算法——并查集

文章目录一、并查集概述二、并查集算法实现一、并查集概述并查集(Union-Find),又称不相交集合(Disjoint Set Union, DSU),是一种用于处理不相交集合的合并与查询问题的数据结构。它支持两种主要操作&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉