多仔 - SSM 企业轻量级开发框架
type: channel
link: https://www.duox.dev/tag/SSM-%E4%BC%81%E4%B8%9A%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6/
items: SSM 企业轻量级开发框架之 08-SSM 框架整合
items: SSM 企业轻量级开发框架之 07-初识 Spring MVC
items: SSM 企业轻量级开发框架之 06-Spring 整合 MyBatis
items: SSM 企业轻量级开发框架之 05-IoC 和 AOP 扩展
items: SSM 企业轻量级开发框架之 04-初识 Spring
items: SSM 企业轻量级开发框架之 03-动态 SQL
items: SSM 企业轻量级开发框架之 02-SQL 映射文件
items: SSM 企业轻量级开发框架之 01-初识 MyBatis

SSM 企业轻量级开发框架之 08-SSM 框架整合
type: item
date: 2023-02-28T09:38:00+08:00
description: AI 摘要 文章系统梳理单例模式原理、实现与线程安全方案，对比懒汉、饿汉及静态内部类写法，并指出 Spring MVC Controller 默认单例需关注并发安全。随后完整演示 SSM 整合流程：导入依赖、配置 MyBatis、Spring、Spring MVC、web.xml，搭建 DAO、Service、Controller 三层，实现查询用户表并渲染 JSP，验证框架贯通。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结单例模式单例模式概述单例（Singleton）模式的关键是在系统运行期间，某个类有且只有一个实例，单例模式可以对资源进行重复利用，节约重复创建和销毁的成本，从而降低服务器压力，提高程序效率。单例模式在应用程序的日志服务、配置文件读取、数据库连接池设计、网站计数器等应用程序中广泛使用。静态代码块静态代码块本身不是单例模式的一种实现方式，但它可以在单例模式的实现过程中发挥作用，辅助完成单例模式的相关功能。静态代码块是用 static 关键字修饰的一段代码块，它在类加载时执行且仅执行一次，常用于初始化类的静态成员变量，或执行一些在类初始化阶段就需要完成的一次性操作，如加载配置文件、建立数据库连接等。示例：静态代码块BaseDao 类（cn.duozai.BaseDao）：public class BaseDao { private static final Logger logger = Logger.getLogger(BaseDao.class); /** * 在静态代码块中读取数据库的配置文件 * 类加载的时候只会执行一次 */ static { logger.debug("BaseDao => 读取数据库配置文件"); } /** * 模拟数据库查询 * * @return void */ public void executeQuery() { logger.debug("BaseDao => 查询数据"); } }测试类（test.StaticTest）：public class StaticTest { /** * BaseDao测试 * * @return void */ @Test public void test() { // 第一次调用BaseDao查询数据 BaseDao baseDao1 = new BaseDao(); baseDao1.executeQuery(); // 第二次调用BaseDao查询数据 BaseDao baseDao2 = new BaseDao(); baseDao2.executeQuery(); } }示例效果：单例模式实现单例模式的核心目标是确保一个类在整个应用程序中只有一个实例存在，并提供一个全局访问点来获取这个唯一的实例。实现单例模式，需要满足：一个类只有一个实例：不允许外界随意实例化该类，即需要将构造函数私有化。自行创建实例对象：外界不能随意实例化该类，即需要在该类内部实例化一个实例，且实例化的实例是静态的、私有的。对外提供实例对象：对外提供实例对象的方法应该是公有的、静态的方法，该方法创建或获取本类中的静态私有对象并返回。示例：实现单例模式Singleton 类（cn.duozai.singleton）：/** * 确保该类在整个应用程序中只有一个实例存在 * 并提供一个全局访问点来获取这个唯一的实例 */ public class Singleton { /** * 自行创建实例对象 * 外界不能随意实例化该类，需要在该类内部实例化一个实例 * 实例化的实例是静态的、私有的 */ private static Singleton singleton; /** * 一个类只有一个实例 * 不允许外界随意实例化该类，将构造函数私有化 * * @return null */ private Singleton() { } /** * 对外提供实例对象 * 对外提供实例对象的方法应该是公有的、静态的方法 * 该方法创建或获取本类中的静态私有对象并返回 * * @return Singleton实例 */ public static Singleton getInstance() { if (singleton == null) { // 创建Singleton实例 singleton = new Singleton(); } // 返回Singleton实例 return singleton; } }测试类（test.SingletonTest）：public class SingletonTest { /** * 单例模式测试 * * @return void */ @Test public void test() { Singleton …

SSM 企业轻量级开发框架之 07-初识 Spring MVC
type: item
date: 2023-02-25T16:28:00+08:00
description: AI 摘要 文章系统梳理 Spring MVC 入门要点：回顾 MVC 与 JSP Model 2 思想；示范 XML 与注解两种配置方式搭建 Hello 工程；详解 DispatcherServlet 请求流转机制；演示 @RequestMapping、@RequestParam、Model/ModelAndView/Map 出参及中文乱码处理；配置 InternalResourceViewResolver 简化视图路径，为后续 SSM 整合奠定扎实基础。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结MVC 模式MVC 概述MVC 模式即 Model-View-Controller（模型-视图-控制器）模式，是开发 Web 应用程序时常用的一种代码分层方式。MVC 模式的三层：模型（Model）：负责处理业务逻辑和数据，对应 Java Bean，即 POJO 实体、DAO 层、Service 层。视图（View）：负责处理数据并将数据呈现给用户，对应 JSP、HTML。控制器（Controller）：负责接收并转发请求，对应 Servlet。JSP Model 2JSP + Servlet + Java Bean 的模式是典型的 JSP Model 2 模式。JSP Model 1早期的 JSP Model 1 模式中，缺少 Servlet，只由 JSP + Java Bean 组成，JSP 代替 Servlet 接受请求并处理数据，再将处理结果返回给前端。在 JSP Model 1 模式中，JSP 身兼多职，既要负责视图层的数据展示，又要负责业务流程控制，结构混乱，因此更推荐 JSP Model 2 模式。MVC 总结MVC 模式的处理过程：视图层提供交互页面，并发送用户输入的请求给控制器层。控制器层接收用户的请求，并决定该调用的模型，调用对应的 Service 层、DAO 层操作数据。模型层根据用户请求进行相应的业务逻辑处理，并返回处理结果。控制器层根据返回的处理结果，通过视图层展示结果给用户。MVC 模式的优点：MVC 三个模块相互独立，松耦合架构。多视图共享一个模型，大大提高代码的可重用性。控制器提高了应用程序的灵活性和可配置性。有利于软件工程化管理。MVC 模式的缺点：增加了系统结构和实现的复杂性，不适合小型规模的项目。视图层与模型之间需要控制器做中间的连接控制，所以效率较低。常见的 MVC 框架：Struts 1.0、Struts 2.0、Spring MVC 等。搭建 Spring MVC 环境Spring MVC 概述Spring MVC 是 Spring 提供的一个基于 MVC 模式设计的 Web 层框架。Spring MVC 是基于 Servlet 实现的，使用了 Controller 代替掉 JSP Model 2 模型中的 Servlet，实现了更优雅、更高效的 JSP Model 2 的模型。Spring MVC 的优点：角色划分清晰：Model、View、Controller 各司其职，各负其责。配置功能灵活：基于 Spring，可以使用 XML 或注解的方式开发 Spring MVC，使用 Spring IoC/AOP 特性解决问题。功能丰富：提供了 Web 应用开发的一整套流程，包含功能各异的技术工具，可以方便地配合使用。可灵活选择视图：可以根据项目实际需求选择 JSP、HTML、Velocity 等视图技术。支持国际化：提供国际化支持，可以轻松地实现不同语言之间的切换。第一个 Spring MVC 程序搭建 Spring MVC 开发环境的步骤：新建项目，并添加 Web 框架支持。导入 JAR 依赖包：Spring、Spring MVC、JSP。编写 Spring MVC 核心配置文件 springmvc-servlet.xml。编写 Web 应用配置文件 web.xml。编写 Spring MVC Controller 类。编写 JSP 视图页面。使用 Tomcat 运行 Spring MVC 程序。示例：第一个 Spring MVC 程序添加 Web 框架支持、导入相关依赖 JAR 文件，并添加为库。示例效果：Log4J 配置文件（classpath:log4j.properties）：log4j.rootLogger=debug,CONSOLE ################## # Console Appender ################## log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=debug log4j.appender.CONSOLE.T…

SSM 企业轻量级开发框架之 06-Spring 整合 MyBatis
type: item
date: 2023-02-19T18:03:00+08:00
description: AI 摘要 文章系统讲解 Spring 与 MyBatis 的轻量级整合方案：先以 IoC 接管 MyBatis 生命周期，通过 SqlSessionFactoryBean、SqlSessionTemplate 实现 DAO；再用 MapperScannerConfigurer 自动扫描接口生成实现，简化编码。随后引入声明式事务，对比编程式痛点，给出 XML 及 @Transactional 注解两种配置，演示传播行为、隔离级别、回滚规则等核心属性，并附完整用户表增删改查示例与测试，帮助读者快速构建低耦合、高可维护的 SSM 企业应用。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结基本整合方式整合思路梳理Spring 整合其他框架的本质其实就是把其他框架交给 Spring 管理，Spring 通过 IoC、AOP 等机制实现与其他框架的连接，最终建立一个低耦合的应用架构。MyBatis 三大核心接口和类的关系：使用 Spring 整合 MyBatis 时，以上流程可以全部移交给 Spring 来处理，即读取配置文件、组件的创建、组件之间的依赖关系以及整个框架的生命周期都由 Spring 容器统一管理。初步整合方式Spring 和 MyBatis 的整合步骤：导入 JAR 依赖包：Spring IoC/AOP 依赖、事务依赖、dbcp 数据源依赖、MyBatis 依赖、Spring 与 MyBatis 整合依赖。编写配置文件：MyBatis 核心配置文件、Spring 核心配置文件。通过 Spring 配置文件配置数据源，创建数据源对象。通过 Spring 配置文件配置 SqlSessionFactory，创建 SqlSessionFactory 对象。通过 Spring 配置文件配置 SqlSession，创建 SqlSession 对象。通过 SqlSession 操作数据库。示例：Spring 与 MyBatis 初步整合SQL 脚本：SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_address -- ---------------------------- DROP TABLE IF EXISTS `t_address`; CREATE TABLE `t_address` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id', `contact` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人姓名', `addressDesc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收货地址明细', `postCode` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮编', `tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人电话', `userId` bigint DEFAULT NULL COMMENT '用户id', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='地址表'; -- ---------------------------- -- Records of t_address -- ---------------------------- BEGIN; INSERT INTO `t_address` (`id`, `contact`, `addressDesc`, `postCode`, `tel`, `userId`) VALUES (1, '张三', '福建省泉州市安溪县宝龙城市广场', '362400', '13275000001', 1); INSERT INTO `t_address` (`id`, `contact`, `addressDesc`, `postCode`, `tel`, `userId`) VALUES…

SSM 企业轻量级开发框架之 05-IoC 和 AOP 扩展
type: item
date: 2023-02-16T17:47:00+08:00
description: AI 摘要 文章系统梳理 SSM 框架中 IoC 与 AOP 的扩展用法：先以 XML 方式演示异常抛出、最终、环绕等五种增强，并对比前置、后置场景；随后展开构造注入、p 命名空间、集合等依赖注入技巧，比较 setter 与构造优劣；继而用 @Component、@Service、@Autowired、@Resource 等注解简化 IoC，结合 @Aspect、@Around 等注解实现零配置 AOP，给出完整示例与最佳实践，帮助开发者在企业轻量级项目中灵活选用配置方式。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结增强类型扩展异常抛出增强异常抛出增强是指当目标方法抛出异常时进行织入操作的一种增强方式，常用于为项目提供统一的异常处理功能，具有可灵活插拔的特点。示例：异常抛出增强用户模块业务逻辑接口实现类（cn.duozai.dao.UserServiceImpl）：public class UserServiceImpl implements UserService { // ... /** * 保存用户信息 * * @return 保存结果 */ @Override public boolean save() { // 调用userDao的方法保存用户信息 int result = userDao.save(); // 模拟产生异常 System.out.println(1/0); return result > 0; } }日志增强处理类（cn.duozai.aop.UserServiceLogger）：public class UserServiceLogger { // ... /** * 异常抛出增强：方法抛出异常时做增强 * * @param jp 连接点对象 * @param ex 具体异常对象 * @return void */ public void afterThrowing(JoinPoint jp, Exception ex) { logger.debug(jp.getSignature().getName() + "方法抛出异常: " + ex.getMessage()); } }Spring 核心配置文件（classpath:applicationContext.xml）：<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:aspect ref="userServiceLogger"> <!-- <aop:after-throwing>标签：定义异常抛出增强，在方法抛出异常时做额外操作 throwing属性：指定为获取异常对象并传递给增强方法中的ex参数 --> <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="ex"/> </aop:aspect> </aop:config> </beans>示例效果：最终增强最终增强是指无论目标对象的方法正常运行还是抛出异常，该增强处理都会被执行的一种增强方式，与 Java 中的 finally 代码块的作用相似，常用于释放资源等功能，具有可灵活插拔的特点。示例：最终增强日志增强处理类（cn.duozai.aop.UserServiceLogger）：public class UserServiceLogger { // ... /** * 最终增强：方法执行完毕，无论是否抛出异常，都会执行增强操作 * * @param jp 连接点对象 * @return void */ public void after(JoinPoint jp) { logger.debug(jp.getSignature().getName…

SSM 企业轻量级开发框架之 04-初识 Spring
type: item
date: 2023-02-12T15:10:00+08:00
description: AI 摘要 文章系统梳理 Spring 轻量级企业框架的诞生背景、模块体系与两大核心技术：IoC 通过依赖注入与工厂解耦，实现 Bean 生命周期托管；AOP 借切面、切入点、通知等概念，把日志、事务等横切逻辑动态织入业务对象，全程以 XML 配置示例演示从 HelloWorld 到打印机装配再到日志增强的完整流程，为后续深入 SSM 开发奠定理论与实战基础。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结Spring 概述Spring 历史由来Spring 是一个轻量级的企业级应用框架，兴起于 2003 年，当时流行的传统 JavaEE 框架均为过于臃肿的重量级架构体系，其开发效率、开发难度和实际性能都不能满足人们的需求。Spring 中文含义为“春天”，其诞生给人一种格外清新的感觉，蕴含着勃勃生机。Spring 最初由 Rod Johnson 在《Expert One-on-One Java EE 设计与开发》一书中的部分理念衍生而来的，在书中，他对 Java EE 技术的日益臃肿和低效提出了质疑，并提出了 Interface 21，即 Spring 的雏形。2003 年 2 月，Spring 正式成为一个开源项目，并发布于 SourceForge 中。Spring 文档：https://www.spring.io/Spring 是企业应用开发的一站式选择，贯穿于表现层、业务层、持久层。Spring 的优点：低侵入式设计：Spring 通过依赖注入、面向接口编程等方式管理对象关系，业务代码无需大量耦合特定 Spring 框架代码，改动实现细节时对依赖它的其他组件影响小。独立于各种应用服务器：Spring 基于自身的轻量级容器和组件化架构，能在多种应用服务器（如 Tomcat、Jetty 等）上运行，无需依赖特定应用服务器的独有特性来实现核心功能。依赖注入特性将组件关系透明化，降低耦合度。面向切面编程特性允许将通用任务进行集中式处理。与第三方框架的良好整合：Spring 像是一个超级黏合平台，能方便且灵活地与各类如 MyBatis、Hibernate 等第三方框架协同工作，实现功能互补、优势叠加。Spring 体系结构Spring 由大约 20 个功能模块组成。Spring 核心容器 Core Container：Beans 模块：负责创建和管理对象（即 Java Bean）。Core 模块：Spring 的核心基础，提供了一些最基本的功能和工具，如对资源的访问、读取配置文件、处理一些基础的类型转换、事件传播等功能。Context 模块：Spring 的大管家，提供提供应用上下文环境、负责管理 Bean 的生命周期等。SpEL 模块（Spring Expression Language）：专门用来在 Spring 里写表达式的语言。数据访问与集成 Data Access and Integration：JDBC 模块：简化了使用 JDBC 进行数据库访问的操作，让开发人员能更便捷地执行 SQL 语句、处理结果集以及管理数据库连接等相关事宜。ORM 模块：用于无缝衔接 Spring 框架与各类 ORM 工具（如 MyBatis 等），使在 Spring 应用中利用 ORM 技术进行对象关系映射及数据操作更加方便、高效。OXM 模块：用于在 Spring 框架中方便地实现对象与 XML 数据之间的相互转换以及对 XML 相关处理进行简化和规范化操作。JMS 模块：便于在 Spring 应用中实现与消息队列系统进行高效的消息发送、接收以及对 JMS（Java Message System）相关操作的管理和集成。Transactions：用于在 Spring 应用中方便地管理和控制数据库事务，提供了声明式和编程式两种方式来确保数据操作的一致性、隔离性等事务特性。Spring Web：Web 模块：为 Spring 应用提供了处理 Web 请求与响应、实现 Web 应用相关功能（如路由、视图处理等）的能力，以便构建功能完备的 Web 应用程序。Servlet 模块：用于让 Spring 应用更好地与 Servlet 容器（如 Tomcat 等）协同工作，方便在基于 Servlet 技术的 Web 应用中实现请求处理、资源调度等功能。WebSocket 模块：让 Spring 应用便捷地实现与浏览器等客户端间实时、双向的 WebSocket 通信功能，用于高效的数据交互与实时信息传递。Portlet 模块：助力在 Spring 应用中方便地开发、部署和管理基于 Portlet 规范的 Web 组件，以实现可嵌入到门户页面（Portal）中的特定功能。Spring 其他：AOP：用于在不修改原始代码的基础上，通过定义切面实现对业务…

SSM 企业轻量级开发框架之 03-动态 SQL
type: item
date: 2023-02-09T13:22:00+08:00
description: AI 摘要 文章系统讲解 MyBatis 动态 SQL 核心标签：if、where、choose-when-otherwise、foreach、set、trim 及分页实现。通过多条件查询、集合参数、部分字段更新等场景，演示如何借助标签智能拼接 SQL，避免空值导致语法错误，提升代码健壮性与可维护性。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结动态 SQL 处理简单的多参数查询if 标签通常情况下在实现多条件查询时，需要实现动态 SQL 的构建，如果没有实现动态 SQL 的构建，可能会出现 SQL 语句错误的问题。示例：多条件查询可能存在的问题用户表数据访问接口（cn.duozai.dao.SysUserMapper）：public interface SysUserMapper { // ... /** * 根据条件（Params）查询用户列表 * * @param realName 真实姓名 * @param roleId 用户角色id * @return 用户列表 */ List<SysUser> getUserListByParams(@Param("realName") String realName, @Param("rId") Integer roleId); // ... }用户表数据访问接口 SQL 映射文件（cn/duozai/dao/SysUserMapper.xml）：<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="cn.duozai.dao.SysUserMapper"> SELECT * FROM t_sys_user WHERE realName LIKE CONCAT('%', #{realName}, '%') AND roleId = #{rId} </mapper>测试类（test.SysUserMapperTest）：public class SysUserMapperTest { // ... /** * 根据条件（Params）查询用户列表 * * @return void */ @Test public void getUserListByParams() { SqlSession sqlSession = MyBatisUtil.createSqlSession(); // 只查询真实姓名包含“刘”的用户，不根据用户角色id查询 List<SysUser> sysUserList = sqlSession.getMapper(SysUserMapper.class) .getUserListByParams("刘", null); for (SysUser sysUser : sysUserList) { logger.debug("SysUser => " + sysUser.getRealName()); } MyBatisUtil.closeSqlSession(sqlSession); } // ... }示例效果：查询条件不符合要求的，不应该拼接到 SQL 语句中。在 MyBatis 中，if 标签用于实现 SQL 语句的动态拼接功能，使用 if 标签可以有效地避免多条件查询拼接 SQL 语句时存在的隐患，保证了业务的正确性。示例：if 标签用户表数据访问接口 SQL 映射文件（cn/duozai/dao/SysUserMapper.xml）：<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="cn.duozai.dao.SysUserMapper"> SELECT * FROM t_sys_user WHERE <if test="realName != null"> realName LIKE CONCAT('%', #{realName}, '%') </if> <if test="rId != null"> AND roleId = #{rId} </if> </mapper>示例效果：where 标签MyBatis 提供了 where 标签，用于对 SQL 语句中的 where 关键字进行简化处理，直接替换 SQL 语句中的 where 关键字，可以智能地处理其内部多余的 and、or 等关键字，避免多余字符带来的语法错误。示例：if + where 标签测试类（test.SysUserMapperTest）：public class SysUserMapperTest { // ... /** * 根据条件（Params）查询用户列表 * * @return void */ @Test public void get…

SSM 企业轻量级开发框架之 02-SQL 映射文件
type: item
date: 2023-02-04T13:52:00+08:00
description: AI 摘要 文章系统梳理 MyBatis SQL 映射文件结构与最佳实践，围绕条件查询、结果映射、增删改操作及缓存机制展开。详述单参数、实体、Map、多参数四种入参方式，对比 resultType 自动映射与 resultMap 手动映射，演示 association、collection 嵌套处理一对一、一对多关系，给出驼峰转换与自动映射级别配置，总结 insert、update、delete 写法及事务控制要点，并说明一级、二级缓存原理与局限性，为 SSM 项目提供完整持久层参考。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结MyBatis 映射基础SQL 映射文件概述MyBatis 真正的特色在于 SQL 映射，功能强大，使用简单。SQL 映射文件中的顶级元素：名称描述mapperSQL 映射文件的根元素cache配置给定命名空间的缓存cache-ref从其他命名空间引用缓存配置resultMap用来描述数据库结果集和对象的对应关系sql可以重用的 SQL 块，也可以被其他语句引用insert映射插入语句update映射更新语句delete映射删除语句select映射查询语句编写 SQL 映射文件的注意事项：SQL 映射文件与该 Mapper 接口同名（实体类名 + Mapper），并放置在同一包路径下。以映射的 Mapper 接口的完全限定类名（包路径 + 接口名）作为 SQL 映射文件 mapper 元素的 namespace 属性。接口中的方法名与 SQL 映射文件中映射 SQL 语句的元素的 id 属性一一对应。MyBatis 条件查询实现单一条件查询在 MyBatis 中实现条件查询，如果仅传入一个基本数据类型或其包装类型或一个 String 类型的参数，MyBatis 框架的处理方式非常简单。select 元素实现单一条件查询的基本用法：// Mapper接口定义方法 ... 方法名(参数类型 参数名); ... WHERE xx = #{参数名} 使用 select 元素实现单一条件查询的注意事项：parameterType 属性表示 SQL 语句传入的参数类型，可以使用全限定名或别名。parameterType 属性指定参数类型为 string，是 java.lang.String 的别名，是 MyBatis 内建的类型别名。使用 #{...} 获取参数值时，MyBatis 会将其转换成 PreparedStatement 参数，并为其赋值。示例：单一条件查询用户表数据访问接口（cn.duozai.dao.SysUserMapper）：public interface SysUserMapper { // ... /** * 根据真实姓名模糊查询用户列表 * * @param realName 真实姓名 * @return 用户列表 */ List<SysUser> getUserListByRealName(String realName); }用户表数据访问接口 SQL 映射文件（cn/duozai/dao/SysUserMapper.xml）：<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="cn.duozai.dao.SysUserMapper"> SELECT * FROM t_sys_user WHERE realName LIKE CONCAT('%', #{realName}, '%') </mapper>测试类（test.SysUserMapperTest）：public class SysUserMapperTest { // ... /** * 根据真实姓名模糊查询用户列表 * @return void */ @Test public void getUserListByRealName() { SqlSession sqlSession = MyBatisUtil.createSqlSession(); List<SysUser> sysUserList = sqlSession.getMapper(SysUserMapper.class) .getUserListByRealName("张"); for (SysUser sysUser : sysUserList) { logger.debug("SysUser => " + sysUser.getRealName()); } MyBatisUtil.closeSqlSession(sqlSession); } }示例效果：使用 Java 对象入参实现多条件查询在 MyBatis 中实现多条件查询，可以将查询参数保存在实体类中，传入方法实现多条件查询。s…

SSM 企业轻量级开发框架之 01-初识 MyBatis
type: item
date: 2023-02-01T11:37:00+08:00
description: AI 摘要 文章系统梳理 MyBatis 入门要点：先阐释框架与 ORM 概念，对比主流持久层方案；继而以 step-by-step 方式演示环境搭建、配置、实体与 Mapper 编写、SqlSession 使用及工具类封装；最后解析核心配置文件各元素作用与最佳实践，并总结 MyBatis 优缺点及适用场景，为后续 SSM 整合奠定扎实基础。 此摘要根据文章内容自动生成，仅用于文章内容的解释与总结框架技术概述框架概念框架（Framework）是一种经过检验的、按一定规则组织的一组组件、提供可重用的公共结构、具有特定功能的半成品。框架针对特定的功能或架构需要，对基础代码进行了封装并提供相应的 API，不同的框架能够提供不同的功能，开发者需要在框架的基础上，加入具体的业务逻辑，开发出一套自己的应用。使用框架技术的优势：不用再考虑公共问题，这些问题框架已经做好了实现。专心在业务逻辑的实现上，提升开发效率。项目结构统一，易于学习、维护。新手也可写出好程序。主流框架技术简介MyBatis：基于 ORM 的优秀的 DAO 层持久化框架，支持动态 SQL 等特性，小巧易学。Spring：开源、轻量级的企业级应用框架，覆盖了 Java EE 技术的方方面面，可以很方便的与其他框架集成使用，使得开发过程更加快捷高效。Spring MVC：基于 Servlet API 构建的 Web 框架，是目前最主要的 MVC 框架，具有高度可配置性，使用灵活。Hibernate：优秀的 DAO 层持久化框架，使用面向对象的方式操作数据库，而不需要直接编写 SQL 查询语句Struts2：基于 Web 的 MVC 框架，支持拦截器、OGNL 表达式等特性。数据持久化及 ORM持久化持久化是程序数据在瞬时状态和持久状态间转换的过程。ORMORM（Object/Relational Mapping，对象/关系映射）是一种在关系型数据库和面向对象编程语言之间进行数据转换的编程技术。ORM 的作用：编写程序的时候，以面向对象的方式处理数据。保存数据的时候，却以关系型数据库的方式存储。ORM 的解决方案：在持久化对象上执行基本的增、删、改、查操作。对持久化对象提供一种查询语言或者 API。对象关系映射工具。提供与事务对象交互、执行检查、延迟加载以及其他优化功能。使用 MyBatis 实现数据库操作MyBatis 概述MyBatis 的前身叫做 iBatis，是 Apache 的一个开源的项目。MyBatis 文档：https://mybatis.net.cn/MyBatis 简介：MyBatis 是一款优秀的持久层框架，它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。通过 XML 或注解可以将特定的 SQL 语句与 Java 实体类关联起来，借助 MyBatis 提供的 API 执行 SQL 语句并完成数据在两种模型之间的转换。是一种半自动化的 ORM 实现。MyBatis 初体验搭建 MyBatis 开发环境的步骤：导入 JAR 依赖包：MySQL 驱动、MyBatis、Log4J。编写 MyBatis 核心配置文件 mybatis-config.xml。编写数据库表所对应的实体类。编写数据访问层 Mapper 接口。编写 SQL 映射文件。编写测试类、测试方法。示例：搭建 MyBatis 开发环境SQL 脚本：SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_address -- ---------------------------- DROP TABLE IF EXISTS `t_address`; CREATE TABLE `t_address` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id', `contact` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人姓名', `addressDesc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收货地址明细', `postCode` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL CO…