尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Maven与MyBatis整合实战:从零搭建Java数据查询项目

Maven与MyBatis整合实战:从零搭建Java数据查询项目 1. 从零开始为什么选择MavenMyBatis作为数据查询的起点如果你刚开始接触Java后端开发想找一个既能快速上手、又能理解企业级项目骨架的技术组合来练手那么“Maven MyBatis”查询数据这个入门程序绝对是一个黄金起点。这听起来可能像是一个老生常谈的“Hello World”但它的价值远不止于此。我见过太多新手一上来就扎进Spring Boot的自动配置里虽然项目跑起来了但对底层的数据交互、依赖管理却一知半解出了问题根本无从下手。Maven和MyBatis一个是项目构建和依赖管理的“大管家”另一个是数据库操作的“翻译官”。把它们俩放在一起你搭建的不仅仅是一个能跑通的查询Demo而是一个标准、可扩展的Java项目雏形。通过这个组合你能亲手摸到从项目创建、依赖引入、配置编写、到最终执行SQL并拿到结果的全链路。这个过程会让你对“一个Java Web应用是如何组织起来的”有最直观的感受。很多面试里问的“Maven的生命周期”、“MyBatis的一二级缓存”、“#{}和${}的区别”其理解根基都来自于这次亲手搭建。所以别把它看成一次简单的查询。我们这次的目标是用最“原始”的方式搭建一个结构清晰、配置明确、可调试的Maven项目并集成MyBatis完成一次对数据库的查询。过程中我会带你避开那些教程里常提但容易一带而过的坑比如Maven仓库配置慢、MyBatis配置文件路径问题、以及如何真正看到MyBatis执行的SQL。这些经验是你后续学习Spring Boot整合MyBatis时能快速定位问题的底气。2. 环境奠基Maven的安装与“镜像”仓库配置实战在写任何代码之前一个稳定、高效的开发环境是前提。这里的环境主要指Maven。很多教程会直接让你去官网下载、解压、配环境变量然后一句“配置完成”就带过了。但根据我的经验90%的新手卡壳都卡在后续的“依赖下载”环节其根源就在于仓库配置。2.1 Maven安装不仅仅是解压首先去Maven官网下载最新稳定版比如3.8.8。解压到一个没有中文和空格的路径例如D:\DevTools\apache-maven-3.8.8。接着配置系统环境变量新建MAVEN_HOME值为你的Maven安装路径。在Path变量中添加%MAVEN_HOME%\bin。打开命令行输入mvn -v看到版本信息即表示安装成功。这一步很简单但我想强调的是请使用命令行操作。在整个学习过程中尽量习惯使用mvn clean compile,mvn clean package等命令而不是完全依赖IDE的图形化按钮。这能帮你真正理解Maven在背后做了什么。2.2 核心实战配置阿里云镜像仓库安装成功只是第一步真正的实战从配置settings.xml开始。Maven默认从中央仓库在国外下载依赖速度慢且不稳定。我们必须将其替换为国内镜像。找到你的Maven安装目录下的conf/settings.xml文件用文本编辑器打开。找到mirrors标签在里面添加阿里云的镜像配置mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror关键点解析mirrorOf*/mirrorOf这里的*表示匹配所有仓库即所有依赖下载请求都会被重定向到阿里云仓库。这是最常用也是最省心的配置。为什么不推荐用多个镜像或central有些教程会写mirrorOfcentral/mirrorOf这仅对中央仓库生效。但实际项目中我们可能会配置其他仓库如Spring的仓库。如果只镜像了central其他仓库的依赖还是会走默认的慢速国外路径。用*可以一劳永逸但需确保你信任这个镜像源阿里云是公认可靠的。配置完成后建议将这份修改好的settings.xml复制到你的用户目录下的.m2文件夹中例如C:\Users\你的用户名\.m2\。这样无论你在哪个IDEIDEA或Eclipse中使用Maven都会优先使用这份用户级别的配置与IDE自带的Maven解耦管理起来更清晰。2.3 本地仓库路径与IDEA集成在settings.xml中你还可以找到localRepository标签它定义了Maven下载的依赖jar包存放在本地的位置。默认是在用户目录的.m2/repository下。你可以修改它到一个空间更大的磁盘路径比如localRepositoryD:\MavenRepository/localRepository。接下来是IDE集成。以IntelliJ IDEA为例打开File - Settings - Build, Execution, Deployment - Build Tools - Maven。在Maven home path处选择你安装的Maven路径不要用IDEA内置的Bundled Maven。在User settings file处指向你刚才修改好的那个settings.xml文件。Local repository会自动更新为你配置的路径。完成这些你的Maven环境才算真正就绪。可以尝试在命令行或IDEA的Maven工具窗口里执行mvn help:system如果能成功运行且下载依赖速度很快说明镜像配置生效了。3. 项目骨架搭建创建标准Maven项目与引入关键依赖环境准备好后我们开始创建项目。我强烈建议不要使用Spring Initializr等快速生成工具来做这个入门练习。它们隐藏了太多细节。我们就用最纯粹的Maven命令或IDE的Maven原型来创建亲眼看看一个标准项目的骨架长什么样。3.1 使用命令行创建项目打开终端进入你的工作目录执行以下命令mvn archetype:generate -DgroupIdcom.example -DartifactIdmybatis-demo -DarchetypeArtifactIdmaven-archetype-quickstart -DinteractiveModefalse这条命令的意思是使用Maven的quickstart原型创建一个groupId为com.exampleartifactId为mybatis-demo的项目。创建完成后你会得到一个标准的Maven项目结构mybatis-demo ├── pom.xml ├── src │ ├── main │ │ └── java │ │ └── com │ │ └── example │ │ └── App.java │ └── test │ └── java │ └── com │ └── example │ └── AppTest.java └── target这个结构就是Java项目的“约定优于配置”。src/main/java放主代码src/test/java放测试代码pom.xml是项目的核心配置文件。3.2 剖析与改造pom.xml打开pom.xml初始内容很简单。我们需要对其进行改造引入MyBatis、MySQL驱动以及日志依赖。?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdmybatis-demo/artifactId version1.0-SNAPSHOT/version properties maven.compiler.source8/maven.compiler.source maven.compiler.target8/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding !-- 统一管理依赖版本 -- mybatis.version3.5.13/mybatis.version mysql.version8.0.33/mysql.version logback.version1.4.11/logback.version /properties dependencies !-- MyBatis核心 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version${mybatis.version}/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version${mysql.version}/version scoperuntime/scope /dependency !-- 日志框架使用SLF4J门面 Logback实现 -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-api/artifactId version2.0.9/version /dependency dependency groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactId version${logback.version}/version /dependency !-- 单元测试 -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency /dependencies /project依赖选型与配置详解MyBatis版本我选择了3.5.13这是一个长期维护且稳定的版本。不建议初学者直接上最新的3.5.16或更高避免遇到一些尚未被广泛文档化的变动。MySQL驱动与scope注意MySQL驱动的scope是runtime。这意味着它在编译和测试时不需要只在运行时需要。这符合“仅依赖接口不依赖具体实现”的原则。如果你的代码中直接使用了com.mysql.cj.jdbc.Driver类则需要改为compile默认但通常我们通过配置字符串来指定驱动类所以runtime是更优选择。日志框架这是很多入门教程会忽略但实际开发必不可少的一环。MyBatis本身不提供日志实现它使用SLF4J作为日志门面。我们引入logback-classic它就自带了SLF4J的实现。只有这样后续配置MyBatis打印SQL时才会生效。没有正确的日志依赖你的控制台将一片寂静无法调试。版本管理使用properties统一管理版本号是个好习惯方便后续升级。在IDEA中保存pom.xml后IDE通常会自动开始下载依赖。你也可以在右侧Maven工具窗口点击刷新按钮。观察控制台输出如果是从aliyunmaven仓库下载说明之前的镜像配置成功。4. 核心配置编写MyBatis的“大脑”与数据库对话依赖就绪现在进入MyBatis的核心配置环节。我们需要准备三样东西数据库、MyBatis全局配置文件、以及SQL映射文件。很多人在这里会搞混路径我们一步步来。4.1 准备数据库与数据假设我们有一个简单的用户表userCREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL, age int(11) DEFAULT NULL, email varchar(100) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO user (name, age, email) VALUES (张三, 25, zhangsanexample.com), (李四, 30, lisiexample.com);请确保你的MySQL服务已启动并创建好对应的数据库例如mybatis_demo。4.2 编写MyBatis核心配置文件在src/main/resources目录下如果没有就创建新建一个名为mybatis-config.xml的文件。这个文件是MyBatis的“大脑”它告诉MyBatis如何连接数据库以及去哪里找SQL映射文件。?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- 配置日志实现为SLF4J -- settings setting namelogImpl valueSLF4J/ /settings !-- 配置环境可以配置多个default指定默认使用哪个 -- environments defaultdevelopment environment iddevelopment !-- 事务管理器类型JDBC -- transactionManager typeJDBC/ !-- 数据源类型POOLED连接池 -- dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/mybatis_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai/ property nameusername value你的用户名/ property namepassword value你的密码/ /dataSource /environment /environments !-- 告诉MyBatis SQL映射文件在哪里 -- mappers mapper resourcecom/example/mapper/UserMapper.xml/ /mappers /configuration关键配置点解析settings日志配置这是能否在控制台看到SQL的关键。我们将其设置为SLF4J这样MyBatis就会通过我们引入的SLF4JLogback来输出日志。没有这个配置SQL执行过程对你是不可见的。数据源typePOOLEDMyBatis内置了三种数据源UNPOOLED无连接池、POOLED有连接池、JNDI。对于独立应用POOLED是必须的它能有效管理数据库连接避免频繁创建和销毁连接带来的性能开销。这是入门时容易忽略但非常重要的一个生产级配置。JDBC URL参数useUnicodetruecharacterEncodingutf8确保正确处理中文。useSSLfalse本地开发环境通常不启用SSL避免连接错误。serverTimezoneAsia/ShanghaiMySQL 8.0驱动必须指定时区否则会报错。mappers映射器注册这里的resource路径是基于类路径classpath的。我们将SQL映射文件UserMapper.xml放在com/example/mapper/目录下这个路径必须与后续Java接口的包名有一定对应关系这是一种约定并非强制但强烈建议遵循这能极大减少配置错误。4.3 创建实体类与Mapper接口在src/main/java/com/example下创建entity包和mapper包。首先创建实体类User.javapackage com.example.entity; public class User { private Integer id; private String name; private Integer age; private String email; // 省略getter、setter、toString方法。实际开发中请使用Lombok或自行生成。 public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public String getEmail() { return email; } public void setEmail(String email) { this.email email; } Override public String toString() { return User{ id id , name name \ , age age , email email \ }; } }接着创建Mapper接口UserMapper.java。这个接口定义了我们要执行的数据操作。package com.example.mapper; import com.example.entity.User; import java.util.List; public interface UserMapper { /** * 查询所有用户 * return 用户列表 */ ListUser selectAllUsers(); }注意这个接口目前只有一个方法声明没有任何实现。它的实现将由MyBatis动态生成。4.4 编写SQL映射文件在src/main/resources下创建目录com/example/mapper注意这里必须是目录结构不能是一个带点的包名。然后在该目录下创建UserMapper.xml。?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd !-- namespace必须对应Mapper接口的全限定名 -- mapper namespacecom.example.mapper.UserMapper !-- id必须对应Mapper接口中的方法名 -- !-- resultType返回结果的类型这里是我们实体类的全限定名 -- select idselectAllUsers resultTypecom.example.entity.User SELECT id, name, age, email FROM user /select /mapper这是整个MyBatis的“魔法”发生的地方有几个必须100%匹配的要点namespace必须一字不差地等于Mapper接口的全限定名com.example.mapper.UserMapper。这是MyBatis将XML文件与Java接口绑定的唯一依据。select id...标签的id属性必须一字不差地等于Mapper接口中对应的方法名selectAllUsers。resultType指定查询结果映射到的Java类型。这里我们直接使用实体类的全限定名。当数据库列名id,name,age,email与实体类属性名一致时MyBatis会自动完成映射。如果不一致可以使用resultMap进行详细配置这是后话。一个极易出错的坑确保UserMapper.xml文件在编译后能被放入target/classes对应的目录下。由于我们把它放在了src/main/resources/com/example/mapper下Maven的标准资源处理流程会原样将其复制到target/classes/com/example/mapper。如果你错误地放在了src/main/java目录下除非在pom.xml中特别配置否则它不会被复制运行时MyBatis会报错找不到映射文件。始终将XML映射文件放在resources下对应的包路径中是最稳妥的做法。5. 代码串联从获取SqlSession到执行查询所有零件都准备好了现在需要写一段代码把它们组装起来并运行。我们修改最初的App.java作为程序入口。5.1 编写测试代码package com.example; import com.example.entity.User; import com.example.mapper.UserMapper; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.util.List; public class App { // 初始化日志记录器 private static final Logger logger LoggerFactory.getLogger(App.class); public static void main(String[] args) { // 1. 定义MyBatis配置文件的路径相对于类路径 String resource mybatis-config.xml; InputStream inputStream null; SqlSession sqlSession null; try { // 2. 通过Resources工具类加载配置文件得到一个输入流 inputStream Resources.getResourceAsStream(resource); // 3. 使用SqlSessionFactoryBuilder构建SqlSessionFactory // SqlSessionFactory是重量级对象一个数据库对应一个应用生命周期内最好只创建一次。 SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream); // 4. 从SqlSessionFactory中获取一个SqlSession // SqlSession代表一次数据库会话它包含了执行SQL的所有方法。用完必须关闭 sqlSession sqlSessionFactory.openSession(); // 5. 获取Mapper接口的代理对象 // MyBatis会为这个接口动态生成一个实现类 UserMapper userMapper sqlSession.getMapper(UserMapper.class); // 6. 调用接口方法执行SQL logger.info(开始查询所有用户...); ListUser userList userMapper.selectAllUsers(); // 7. 处理结果 if (userList ! null !userList.isEmpty()) { for (User user : userList) { // 使用logger输出而非System.out.println logger.info(查询到用户{}, user); } logger.info(共查询到 {} 条用户记录。, userList.size()); } else { logger.warn(未查询到任何用户记录。); } } catch (IOException e) { // 记录错误日志 logger.error(加载MyBatis配置文件失败, e); } finally { // 8. 非常重要关闭SqlSession释放数据库连接资源。 if (sqlSession ! null) { sqlSession.close(); logger.info(SqlSession已关闭。); } } } }5.2 关键步骤与资源管理剖析这段代码是MyBatis使用的标准流程每一步都有其深意加载配置Resources.getResourceAsStream(mybatis-config.xml)是从类路径classpath的根目录加载文件。这就是为什么我们把配置文件放在resources根目录下。构建SqlSessionFactorySqlSessionFactoryBuilder().build(inputStream)。SqlSessionFactory是一个工厂负责创建SqlSession。它的创建成本很高因为它需要解析XML配置、初始化数据源等。最佳实践是在应用启动时创建一次然后在整个应用生命周期内复用。我们这里因为是简单Demo所以在main方法里创建。获取SqlSessionsqlSessionFactory.openSession()。SqlSession提供了执行SQL命令、获取Mapper、管理事务的方法。它不是线程安全的因此每次需要与数据库交互时都应该获取一个新的SqlSession并在使用完毕后立即关闭。通常我们会在一个请求或一个业务方法中打开和关闭一个SqlSession。获取Mapper代理sqlSession.getMapper(UserMapper.class)。这是MyBatis的核心特性之一——接口绑定。你不需要写这个接口的实现类MyBatis会在运行时根据UserMapper.xml中的SQL语句动态生成一个实现类。你调用userMapper.selectAllUsers()实际上就是执行了XML中对应的select语句。资源关闭在finally块中关闭SqlSession是必须的否则数据库连接不会释放最终导致连接池耗尽。这是新手常犯的错误之一。5.3 配置日志输出让SQL“现身”代码写好了但运行后你可能只看到自己的日志看不到MyBatis执行的SQL。这是因为我们还没配置Logback的日志级别。在src/main/resources下创建logback.xml文件?xml version1.0 encodingUTF-8? configuration !-- 控制台输出 -- appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender !-- 设置MyBatis相关日志级别 -- !-- 将我们Mapper接口所在包的日志级别设为DEBUG这样就能看到SQL语句、参数和结果 -- logger namecom.example.mapper levelDEBUG/ !-- 根日志级别 -- root levelINFO appender-ref refCONSOLE/ /root /configuration关键配置logger namecom.example.mapper levelDEBUG/。这里将我们Mapper接口所在包的日志级别设置为DEBUG。MyBatis在执行SQL时会通过这个命名空间下的日志记录器输出详细信息。INFO级别通常只输出一些初始化信息看不到具体的SQL。6. 运行、调试与第一个“坑”的排查一切就绪右键运行App.main()方法。理想情况下你会在控制台看到类似这样的输出2024-05-20 10:30:15 [main] INFO com.example.App - 开始查询所有用户... 2024-05-20 10:30:15 [main] DEBUG com.example.mapper.UserMapper.selectAllUsers - Preparing: SELECT id, name, age, email FROM user 2024-05-20 10:30:15 [main] DEBUG com.example.mapper.UserMapper.selectAllUsers - Parameters: 2024-05-20 10:30:15 [main] DEBUG com.example.mapper.UserMapper.selectAllUsers - Total: 2 2024-05-20 10:30:15 [main] INFO com.example.App - 查询到用户User{id1, name张三, age25, emailzhangsanexample.com} 2024-05-20 10:30:15 [main] INFO com.example.App - 查询到用户User{id2, name李四, age30, emaillisiexample.com} 2024-05-20 10:30:15 [main] INFO com.example.App - 共查询到 2 条用户记录。 2024-05-20 10:30:15 [main] INFO com.example.App - SqlSession已关闭。看到Preparing:和Parameters:那几行DEBUG日志了吗这就是MyBatis打印的SQL执行详情。恭喜你成功了但是事情往往不会一帆风顺。下面是我总结的几个新手高频踩坑点及排查思路坑点一Invalid bound statement (not found)这是最常见的错误意思是MyBatis找不到对应的SQL映射。排查步骤1检查mybatis-config.xml中mapper resource...的路径。确保路径正确且开头没有/。它是相对于类路径的。排查步骤2检查UserMapper.xml文件是否被正确复制到了target/classes/com/example/mapper/目录下。可以去这个目录下看一眼如果不存在说明Maven没有处理这个文件。确保文件在src/main/resources下而不是src/main/java下。排查步骤3检查UserMapper.xml中的namespace和select的id是否与UserMapper.java接口的全限定名和方法名完全一致包括大小写。坑点二Could not find resource mybatis-config.xml排查步骤确认mybatis-config.xml文件在src/main/resources目录的根目录下。Resources.getResourceAsStream(mybatis-config.xml)是从类路径根目录开始查找的。坑点三数据库连接失败排查步骤1检查mybatis-config.xml中的数据库URL、用户名、密码。排查步骤2检查MySQL服务是否启动。排查步骤3对于MySQL 8.0确认JDBC URL中包含了serverTimezone参数且驱动版本是8.x兼容的。坑点四没有SQL日志输出排查步骤1确认mybatis-config.xml中配置了setting namelogImpl valueSLF4J/。排查步骤2确认pom.xml中正确引入了logback-classic依赖。排查步骤3确认logback.xml中将你的Mapper接口包com.example.mapper的日志级别设置为DEBUG。按照这个流程走下来你不仅能成功运行程序更能理解每一个环节为什么这么做以及出了问题该如何排查。这才是“入门”的真正含义——建立正确的认知和调试能力而不是仅仅复制粘贴代码。7. 举一反三从查询所有到条件查询与结果映射成功实现“查询所有”后我们可以轻松地扩展这个框架实现更复杂的操作。这里以“根据ID查询用户”和“结果映射”为例展示MyBatis的灵活性。7.1 增加条件查询方法在UserMapper.java接口中增加方法User selectUserById(Integer id); ListUser selectUsersByName(String name);在UserMapper.xml中增加对应的SQL映射!-- 根据ID查询单个用户 -- select idselectUserById parameterTypejava.lang.Integer resultTypecom.example.entity.User SELECT id, name, age, email FROM user WHERE id #{id} /select !-- 根据姓名模糊查询用户 -- select idselectUsersByName parameterTypejava.lang.String resultTypecom.example.entity.User SELECT id, name, age, email FROM user WHERE name LIKE CONCAT(%, #{name}, %) /select关键点解析parameterType可以指定传入参数的类型如java.lang.Integer,java.lang.String。这个属性在某些简单场景下可以省略MyBatis可以自动推断。但显式写明是个好习惯。#{id}这是MyBatis的参数占位符。它会被预处理PreparedStatement替换为?能有效防止SQL注入。与之相对的是${}它是字符串替换有SQL注入风险除非你非常清楚自己在做什么否则在动态SQL之外永远使用#{}。LIKE查询注意这里使用了CONCAT(%, #{name}, %)来构造模糊查询条件。你也可以在Java代码中拼接好%再传入如%name%。修改App.java中的测试代码调用新方法// 测试根据ID查询 User user userMapper.selectUserById(1); if (user ! null) { logger.info(根据ID查询到用户{}, user); } // 测试根据姓名模糊查询 ListUser usersByName userMapper.selectUsersByName(三); logger.info(根据姓名三模糊查询到 {} 条记录{}, usersByName.size(), usersByName);7.2 处理数据库列名与实体类属性名不一致的情况假设我们的数据库表列名是user_name而实体类属性名是name。这时直接查询user_name的值无法自动映射到name属性上结果为null。有两种解决方案方案一在SQL查询中使用别名select idselectAllUsers resultTypecom.example.entity.User SELECT id, user_name as name, age, email FROM user /select将查询结果的列名user_name通过as别名成name与实体类属性匹配。方案二使用resultMap进行显式映射更强大、更推荐在UserMapper.xml中定义结果映射!-- 定义结果映射 -- resultMap idUserResultMap typecom.example.entity.User id propertyid columnid/ result propertyname columnuser_name/ result propertyage columnage/ result propertyemail columnemail/ /resultMap !-- 在查询语句中引用这个resultMap而不是resultType -- select idselectAllUsers resultMapUserResultMap SELECT id, user_name, age, email FROM user /selectresultMap提供了最灵活的映射方式。id用于指定主键列有助于提高性能result用于指定普通列。property对应实体类属性名column对应数据库列名。通过这两个扩展练习你应该能感受到MyBatis的核心工作模式就是定义接口方法 - 在XML中编写对应的SQL - MyBatis动态绑定。所有的复杂性都封装在了XML配置和动态SQL中而Java代码保持了接口的简洁性。走到这里你已经完成了一个完整的、可工作的MyBatis入门项目。你不仅学会了如何查询数据更重要的是你搭建了一个标准的、可调试的Maven项目结构理解了从配置、映射到执行的完整链条并掌握了基本的排错方法。这个项目骨架就是你未来学习更高级特性如动态SQL、缓存、插件以及集成Spring、Spring Boot的坚实基础。下次当你看到Spring Boot中一个注解就搞定MyBatis配置时你会清楚地知道这一切魔法背后正是你今天亲手搭建的这些基石在起作用。
返回列表