springboot03-一个简单的SSMP框架

springboot03-一个简单的SSMP框架 整合springboot springMVC mybatis-plus步骤一新建一个project并导入相关依赖!-- mybatis-plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version exclusions exclusion groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId /exclusion /exclusions /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version3.0.3/version /dependency !-- lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.30/version /dependency步骤二编写application.yml配置文件一、Lombok提供的注解Data在pojo类上加上Data注解之后自动生成以下内容Getter为所有字段生成 getter 方法Setter为所有字段生成 setter 方法RequiredArgsConstructor为final字段和NonNull字段生成构造函数ToString生成toString()方法EqualsAndHashCode生成equals()和hashCode()方法但是Data注解本身不会生成构造方法如果你需要构造方法可以额外使用NoArgsConstructor生成无参构造函数AllArgsConstructor生成所有字段的构造函数RequiredArgsConstructor只包含NonNull或final字段的构造函数这个其实已经隐含在Data里示例Data NoArgsConstructor AllArgsConstructor public class User { private Long id; private String name; }二、MyBatis-Plus 中实现分页2-1、引入分页插件在 Spring Boot 中配置分页插件分页是通过拦截器实现的所以要创建mybatis plus的拦截器MyBatis-Plus 也内置了分页拦截器只需配置一下Configuration public class MPConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ // 创建mybatis plus的拦截器 MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor(); // 添加分页插件 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; } }DbType.MYSQL根据你用的数据库类型选择如 PostgreSQL 就写DbType.POSTGRE_SQL。如果你使用的是 Spring Boot 3 MyBatis-Plus 3.5.3必须添加这个分页插件否则分页不会生效。MyBatis-Plus 的分页拦截器需要知道数据库方言DbType而框架无法 100% 可靠地自动推断。同时拦截器链是插件化的设计用户可能需要组合多个拦截器所以保留了手动配置的入口。2-2、编写测试方法IPage 对象中封装了分页操作中的所有数据数据当前页码值每页数据总量最大页码值数据总量三、MyBatis-Plus按条件查询核心是通过QueryWrapper或LambdaQueryWrapper实现条件构造。3-1、基本使用QueryWrapperQueryWrapper是一个条件构造器可以链式调用来构建 SQL 查询条件。常见方法方法名说明eq(String column, Object val)等于 ()ne(String column, Object val)不等于 (!)gt(String column, Object val)大于 ()lt(String column, Object val)小于 ()ge(String column, Object val)大于等于 ()le(String column, Object val)小于等于 ()like(String column, Object val)模糊匹配between(String column, Object val1, Object val2)区间in(String column, Collection? values)IN 查询orderByAsc/Desc(String...)排序select(...)指定查询字段【注意】QueryWrapper的缺点属性名是硬编码不安全。推荐使用LambdaQueryWrapper3-2、LambdaQueryWrapper推荐避免硬编码字段名使用lambda 表达式更安全字段名错误类型错误编译期会报错。【问题】MyBatis-Plus 的like()方法不会自动跳过 null 值而是会把它原样拼接进去。执行的sql是这样的 Preparing: SELECT id,car_num,brand,guide_price,produce_time,car_type FROM t_car WHERE (brand LIKE ? AND guide_price ?) Parameters: %null%(String), 20.0(Double) Total: 0解决方式使用带condition参数的方法只有前面的condition true才会拼接LIKE语句。3-3、分页 条件组合四、Mybatis-Plus: Mapper 层开发你只需要创建一个接口并继承BaseMapperTMyBatis-Plus 会自动为你生成常用的 CRUD 方法BaseMapperCar会提供的方法包括selectById(id)insert(entity)deleteById(id)updateById(entity)selectList(queryWrapper)……注意接口上需要加上Mapper注解或使用MapperScan扫描包路径(若是mapper接口在启动类所在包及其子包下面怎不用MapperScan扫描包路径)五、Service 层开发5-1、 接口定义5-2、接口实现类说明ServiceImplM, T是 MyBatis-Plus 提供的实现类帮你实现了IServiceT接口。你无需手写基本 CRUD 方法除非你要做业务封装。层级继承接口/类说明MapperBaseMapperT提供基本 SQL 方法ServiceIServiceT提供业务层接口ImplServiceImplM, T实现类封装业务逻辑使用方式Autowired注入 ServiceController 层调用业务方法六、MyBatis-Plus 中 Service 层与 MapperDAO层返回值设计的区别1、DAOMapper层返回值通常是影响的行数int说明Mapper 是直接与数据库交互的常用于执行 SQL 操作例如insert/update/deleteMyBatis 和 MyBatis-Plus 默认返回的是受影响的行数。int updateById(Car car); // 返回值为 int表示影响的行数 int deleteById(Long id); // 返回值为 int删除的记录数0 或 12、Service 层返回值通常封装为 boolean、实体、列表或分页对象说明Service 层面向业务通常我们不关心“影响几行”而是关心“操作成功还是失败”——因此对 DAO 的返回结果进行包装或处理。比如public boolean updateCar(Car car) { return carMapper.updateById(car) 0; // 封装成 boolean }3、示例对比Mapper层Mapper public interface CarMapper extends BaseMapperCar { // 已经有默认实现updateById, deleteById 等 }Service层public interface CarService { boolean updateCar(Car car); boolean deleteCar(Long id); }ServiceImplService public class CarServiceImpl implements CarService { Autowired private CarMapper carMapper; Override public boolean updateCar(Car car) { return carMapper.updateById(car) 0; } Override public boolean deleteCar(Long id) { return carMapper.deleteById(id) 0; } }七、表现层消息一致性处理【注意】此时存在一个问题若是返回null可能有两种情况1、查询成功但是数据不存在2、查询失败抛出异常设计表现层返回结果的模型类用于后端和前端返回数据格式的统一也称为前后端数据协议【问题】此时当后台代码抛出异常的时候返回结果如下返回数据结构又不统一了【解决】使用springMVC的异常处理器统一返回的数据格式。此时异常的处理返回结果如下统一的消息处理对于页面的提示消息为了统一国际化可以1、统一前端处理2、统一后台处理3、不建议前后端混合处理八、分页查询element ui对应的分页组件分页查询处理【问题】当最后一页只有一条数据并执行删除操作的时候页面刷新但是没有数据这是因为调后台接口的时候当前页传值是3但是删除完pages只有2页了【解决方法】当当前页pages的时候用pages再查询一遍