旅游网站模板凡客网站登陆

张小明 2026/1/2 11:56:46
旅游网站模板,凡客网站登陆,wordpress lms,网站定制方案目录 一、MyBatis 核心原理 1. 核心架构 2. 核心特性 二、Spring Boot 集成 MyBatis 实战 1. 环境准备 #xff08;1#xff09;依赖引入#xff08;Maven#xff09; #xff08;2#xff09;核心配置#xff08;application.yml#xff09; 2. 代码实现 1依赖引入Maven2核心配置application.yml2. 代码实现1数据库表设计2实体类3Mapper 接口4Mapper XML 文件resources/mapper/UserMapper.xml5Service 层业务逻辑6启动类3. 测试验证三、MyBatis 高级用法1. 分页插件PageHelper1引入依赖2配置application.yml3使用示例2. 二级缓存1开启全局缓存application.yml2在 Mapper XML 中配置缓存3. 自定义类型处理器1自定义类型处理器2配置类型处理器3使用示例XML四、常见问题与最佳实践1. 常见问题2. 最佳实践五、总结MyBatis 是一款轻量级、高性能的持久层框架核心优势是灵活控制 SQL简化 JDBC 操作既保留了手写 SQL 的灵活性又解决了传统 JDBC 繁琐的资源管理、参数设置和结果映射问题。本文将从核心原理、核心特性、Spring Boot 集成实战、高级用法四个维度全面解析 MyBatis。一、MyBatis 核心原理1. 核心架构MyBatis 的核心执行流程可概括为plaintext配置加载 → SqlSessionFactory 创建 → SqlSession 获取 → Mapper 代理生成 → SQL 执行 → 结果映射关键组件说明组件作用SqlSessionFactory会话工厂单例负责创建 SqlSession通过 SqlSessionFactoryBuilder 构建SqlSession数据库会话非线程安全封装增删改查 API每次请求 / 事务独立创建Mapper 接口数据操作接口MyBatis 通过动态代理生成实现类接口方法与 SQL 绑定Mapper XML / 注解存储 SQL 语句、参数映射、结果映射规则Configuration核心配置类存储全局配置数据源、事务、别名、映射器等Executor执行器负责 SQL 执行SimpleExecutor/BatchExecutor/ReuseExecutorStatementHandler处理 StatementPreparedStatement/Statement设置参数、执行 SQLResultSetHandler将 ResultSet 映射为 Java 对象结果映射核心2. 核心特性动态 SQL通过if/where/foreach等标签动态拼接 SQL适配复杂条件结果映射支持一对一、一对多、多对多关联映射解决字段名与属性名不一致问题参数解析支持多种参数类型基本类型、实体、Map、注解参数防止 SQL 注入缓存机制一级缓存SqlSession 级别 二级缓存Mapper 级别提升查询性能插件扩展支持自定义插件如分页、拦截 SQL扩展执行流程二、Spring Boot 集成 MyBatis 实战1. 环境准备1依赖引入Mavenxml!-- Spring Boot 父工程 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent dependencies !-- MyBatis Spring Boot 整合启动器 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version3.0.3/version /dependency !-- MySQL 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- Spring Boot 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !-- Lombok简化实体类 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies2核心配置application.ymlyaml# 数据源配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis_demo?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 123456 # 连接池配置默认 HikariCP hikari: maximum-pool-size: 10 # 最大连接数 minimum-idle: 5 # 最小空闲连接 idle-timeout: 300000 # 空闲连接超时时间 # MyBatis 配置 mybatis: # Mapper XML 文件位置 mapper-locations: classpath:mapper/**/*.xml # 实体类别名包简化 XML 中 type 配置 type-aliases-package: com.example.mybatis.entity # 全局配置 configuration: map-underscore-to-camel-case: true # 自动下划线转驼峰如 user_name → userName cache-enabled: false # 关闭二级缓存默认开启按需开启 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志 default-statement-timeout: 30 # SQL 执行超时时间2. 代码实现1数据库表设计sqlCREATE DATABASE IF NOT EXISTS mybatis_demo; USE mybatis_demo; -- 用户表 CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(50) NOT NULL COMMENT 用户名, age INT COMMENT 年龄, email VARCHAR(100) COMMENT 邮箱, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) COMMENT 用户表; -- 订单表一对多关联一个用户多个订单 CREATE TABLE order ( id BIGINT AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(32) NOT NULL COMMENT 订单号, user_id BIGINT NOT NULL COMMENT 用户ID, amount DECIMAL(10,2) NOT NULL COMMENT 订单金额, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, FOREIGN KEY (user_id) REFERENCES user(id) ) COMMENT 订单表;2实体类java运行// User.java package com.example.mybatis.entity; import lombok.Data; import java.time.LocalDateTime; import java.util.List; Data public class User { private Long id; private String userName; // 对应数据库 user_name下划线转驼峰 private Integer age; private String email; private LocalDateTime createTime; // 一对多关联用户的订单列表 private ListOrder orderList; } // Order.java package com.example.mybatis.entity; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; Data public class Order { private Long id; private String orderNo; private Long userId; private BigDecimal amount; private LocalDateTime createTime; }3Mapper 接口java运行// UserMapper.java package com.example.mybatis.mapper; import com.example.mybatis.entity.User; import org.apache.ibatis.annotations.*; import java.util.List; // 方式1注解扫描推荐也可在启动类加 MapperScan(com.example.mybatis.mapper) Mapper public interface UserMapper { /** * 根据ID查询用户含订单列表 */ User selectById(Long id); /** * 条件查询用户动态SQL */ ListUser selectByCondition(Param(userName) String userName, Param(age) Integer age); /** * 新增用户主键回填 */ int insert(User user); /** * 更新用户动态更新 */ int update(User user); /** * 删除用户 */ int delete(Long id); }4Mapper XML 文件resources/mapper/UserMapper.xmlxml?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.mybatis.mapper.UserMapper !-- 基础结果映射解决字段名与属性名映射 -- resultMap idBaseResultMap typeUser id columnid propertyid/ !-- 主键映射 -- result columnuser_name propertyuserName/ result columnage propertyage/ result columnemail propertyemail/ result columncreate_time propertycreateTime/ /resultMap !-- 关联结果映射用户 订单列表一对多 -- resultMap idUserWithOrderResultMap typeUser extendsBaseResultMap !-- collection 映射一对多关系 -- collection propertyorderList ofTypeOrder columnid selectcom.example.mybatis.mapper.OrderMapper.selectByUserId/ /resultMap !-- 根据ID查询用户关联订单 -- select idselectById resultMapUserWithOrderResultMap SELECT id, user_name, age, email, create_time FROM user WHERE id #{id} /select !-- 条件查询动态SQL -- select idselectByCondition resultMapBaseResultMap SELECT id, user_name, age, email, create_time FROM user where if testuserName ! null and userName ! AND user_name LIKE CONCAT(%, #{userName}, %) /if if testage ! null AND age #{age} /if /where /select !-- 新增用户useGeneratedKeys 开启主键回填keyProperty 绑定实体主键 -- insert idinsert useGeneratedKeystrue keyPropertyid INSERT INTO user (user_name, age, email) VALUES (#{userName}, #{age}, #{email}) /insert !-- 动态更新set 标签自动处理逗号 -- update idupdate UPDATE user set if testuserName ! null and userName ! user_name #{userName}, /if if testage ! null age #{age}, /if if testemail ! null and email ! email #{email} /if /set WHERE id #{id} /update !-- 删除用户 -- delete iddelete DELETE FROM user WHERE id #{id} /delete /mapperxml!-- OrderMapper.xmlresources/mapper/OrderMapper.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.example.mybatis.mapper.OrderMapper resultMap idBaseResultMap typeOrder id columnid propertyid/ result columnorder_no propertyorderNo/ result columnuser_id propertyuserId/ result columnamount propertyamount/ result columncreate_time propertycreateTime/ /resultMap select idselectByUserId resultMapBaseResultMap SELECT id, order_no, user_id, amount, create_time FROM order WHERE user_id #{userId} /select /mapper5Service 层业务逻辑java运行// UserService.java package com.example.mybatis.service; import com.example.mybatis.entity.User; import com.example.mybatis.mapper.UserMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; Service public class UserService { Resource private UserMapper userMapper; /** * 根据ID查询用户 */ public User selectById(Long id) { return userMapper.selectById(id); } /** * 条件查询 */ public ListUser selectByCondition(String userName, Integer age) { return userMapper.selectByCondition(userName, age); } /** * 新增用户事务控制 */ Transactional(rollbackFor Exception.class) public int insert(User user) { return userMapper.insert(user); } /** * 更新用户 */ Transactional(rollbackFor Exception.class) public int update(User user) { return userMapper.update(user); } /** * 删除用户 */ Transactional(rollbackFor Exception.class) public int delete(Long id) { return userMapper.delete(id); } }6启动类java运行package com.example.mybatis; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 方式2批量扫描 Mapper 接口替代每个接口加 Mapper // MapperScan(com.example.mybatis.mapper) SpringBootApplication public class MybatisDemoApplication { public static void main(String[] args) { SpringApplication.run(MybatisDemoApplication.class, args); } }3. 测试验证java运行package com.example.mybatis; import com.example.mybatis.entity.User; import com.example.mybatis.service.UserService; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; SpringBootTest public class UserServiceTest { Resource private UserService userService; Test public void testInsert() { User user new User(); user.setUserName(张三); user.setAge(25); user.setEmail(zhangsanexample.com); int rows userService.insert(user); System.out.println(新增行数 rows 用户ID user.getId()); } Test public void testSelectById() { User user userService.selectById(1L); System.out.println(用户信息 user); System.out.println(用户订单 user.getOrderList()); } Test public void testSelectByCondition() { ListUser userList userService.selectByCondition(张, 25); System.out.println(条件查询结果 userList); } Test public void testUpdate() { User user new User(); user.setId(1L); user.setAge(26); int rows userService.update(user); System.out.println(更新行数 rows); } Test public void testDelete() { int rows userService.delete(1L); System.out.println(删除行数 rows); } }三、MyBatis 高级用法1. 分页插件PageHelper1引入依赖xmldependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version1.4.7/version /dependency2配置application.ymlyamlpagehelper: helper-dialect: mysql # 数据库方言 reasonable: true # 页码合理化页码0 查第1页页码总页数查最后一页 support-methods-arguments: true # 支持通过参数传递分页参数3使用示例java运行Test public void testPage() { // 第1页每页10条 PageHelper.startPage(1, 10); ListUser userList userService.selectByCondition(null, null); // 分页结果封装 PageInfoUser pageInfo new PageInfo(userList); System.out.println(总条数 pageInfo.getTotal()); System.out.println(总页数 pageInfo.getPages()); System.out.println(当前页数据 pageInfo.getList()); }2. 二级缓存1开启全局缓存application.ymlyamlmybatis: configuration: cache-enabled: true # 开启二级缓存默认 true2在 Mapper XML 中配置缓存xml!-- UserMapper.xml 中添加 -- cache evictionLRU # 缓存淘汰策略LRU/FIFO/SOFT/WEAK flushInterval60000 # 自动刷新时间毫秒 size1024 # 缓存最大条目数 readOnlytrue/ # 只读缓存性能更高注意二级缓存基于 Mapper 级别仅适用于查询频繁、修改较少的场景实体类需实现Serializable接口。3. 自定义类型处理器解决特殊类型映射如 JSON 字段、枚举示例将ListString映射为数据库 JSON 字段。1自定义类型处理器java运行package com.example.mybatis.typehandler; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.alibaba.fastjson2.JSON; import java.sql.*; import java.util.List; public class ListTypeHandler extends BaseTypeHandlerListString { Override public void setNonNullParameter(PreparedStatement ps, int i, ListString parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } Override public ListString getNullableResult(ResultSet rs, String columnName) throws SQLException { return JSON.parseArray(rs.getString(columnName), String.class); } Override public ListString getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return JSON.parseArray(rs.getString(columnIndex), String.class); } Override public ListString getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return JSON.parseArray(cs.getString(columnIndex), String.class); } }2配置类型处理器yamlmybatis: type-handlers-package: com.example.mybatis.typehandler # 扫描自定义类型处理器3使用示例XMLxmlresultMap idBaseResultMap typeUser result columntags propertytags typeHandlercom.example.mybatis.typehandler.ListTypeHandler/ /resultMap四、常见问题与最佳实践1. 常见问题问题场景解决方案字段名与属性名不一致开启map-underscore-to-camel-case或自定义resultMapSQL 注入风险使用#{}预编译避免${}直接拼接参数校验关联查询性能差按需使用association/collection避免 N1 查询可通过fetchTypelazy懒加载分页查询繁琐集成 PageHelper 插件主键回填失败确保useGeneratedKeystruekeyProperty绑定正确数据库主键自增2. 最佳实践SQL 管理复杂 SQL 写 XML简单 SQL 用注解如Select参数传递多参数使用Param注解避免 Map 传递可读性差结果映射统一使用resultMap避免重复配置事务控制在 Service 层加Transactional指定rollbackFor Exception.class日志调试开启 MyBatis SQL 日志便于定位问题性能优化避免全表扫描给查询字段加索引合理使用缓存一级缓存默认开启二级缓存按需开启批量操作使用foreachBatchExecutor五、总结MyBatis 与 Spring Boot 的整合核心是自动配置简化开发Spring Boot 自动创建SqlSessionFactory、SqlSession无需手动管理通过Mapper或MapperScan扫描 Mapper 接口动态代理生成实现类结合 XML / 注解灵活编写 SQL适配各类业务场景掌握 MyBatis 的核心是理解映射规则和动态 SQL而 Spring Boot 集成则重点关注配置简化、插件扩展和事务管理。在实际开发中需结合业务场景选择合适的用法XML / 注解、缓存策略、分页方式兼顾灵活性和性能。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

零售户订烟电商网站手机版万能视频提取器

Excalidraw能否取代PPT?某些场景下真的可以 在一场远程架构评审会上,团队成员围坐在视频会议的另一端。主讲人打开PPT,一页页翻动早已做好的幻灯片——线条规整、配色统一,但当有人提出“能不能把服务调用链路再展开看看&#xff…

张小明 2026/1/2 11:56:46 网站建设

网站开发需要学数学吗建设储蓄卡网站

深夜的研究室里,博士生李岩沮丧地推开键盘,屏幕上是他模仿《自然》期刊范文写的论文初稿。他抄了“形”——同样的八段结构、同样的数据呈现顺序,但导师的批注一针见血:“逻辑散乱,未得精髓。” 许多研究者都曾陷入“静…

张小明 2026/1/2 11:52:42 网站建设

网页制作的网站做seo的公司

C類型系統進化:從C98到C23的效能與安全性革命類型系統是C的核心,其進化直接影響程式碼的效能、安全性和表達力。讓我們看看從C98到C23的類型系統如何實現你提到的驚人提升。C98/03:基礎但有限制的類型系統在C98中,類型系統相對簡單…

张小明 2026/1/2 11:50:38 网站建设

《21天网站建设实录wordpress用户邮件营销插件

Langchain-Chatchat 支持哪些文件格式?一文讲清输入源配置 在企业知识管理日益复杂的今天,如何让堆积如山的PDF、Word文档和内部手册“开口说话”,成了智能化落地的关键一步。很多团队尝试引入大模型来构建智能问答系统,却发现通用…

张小明 2026/1/2 11:48:35 网站建设

ae做模板下载网站wordpress修改插件路径

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

张小明 2026/1/2 11:46:23 网站建设

类qq留言网站建设wordpress好

“具身智能”(Embodied Intelligence 或 Embodied Artificial Intelligence,简称 EAI)是人工智能与机器人学交叉融合的前沿领域,其核心理念在于:智能并非仅存在于抽象的算法或数据处理中,而是必须通过一个具…

张小明 2026/1/2 11:44:13 网站建设