2.15.1 使用 MyBatis 数据库逆向生成工具

image.png
image.png
T 代表通用的,针对于任何的实体类都是可以去使用的
打开配置文件,设置相应的配置,注意 targetPackage 所指向的目录必须存在
image.png
image.png
image.png
设置相应的数据库表
image.png
找到 GeneratorDisplay 文件,运行,反向生成代码
image.png
反向生成代码成功
image.png
pojo 类里生成的注解跟实体表字段一一对应
image.png

  • 如果跟实体表字段完全一样,是没有 @Column 注解的
  • 如果数据库字段带“_”,则会改成驼峰命名

在生成好的 xml 文件中提供了一个 resultMap 并做了简单的封装
image.png
将反向生成好的代码拷贝到项目中
image.png
此时你会发现代码中有错误的部分,需要对现在的项目进行调整

  1. 在 pom 中引入通用 mapper 工具

image.png
pom 文件中添加 mapper-spring-boot-starter

  1. 在 yml 中引入通用 mapper 配置

    1. ############################################################
    2. #
    3. # mybatis mapper 配置
    4. #
    5. ############################################################
    6. # 通用 Mapper 配置
    7. mapper:
    8. mappers: com.imooc.my.mapper.MyMapper
    9. not-empty: false # 在进行数据库操作的时候,判断表达式 username != null,是否追加 username != ''
    10. identity: MYSQL # 数据库方言
  2. 引入 MyMapper 接口类

在 foodie -dev-mapper 模块下创建 com.imooc.my.mapper 这个包并添加 MyMapper 文件,跟 xml 中路径保持一致

package com.imooc.my.mapper;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 继承自己的MyMapper
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

install 项目并运行
image.png
访问 http://localhost:8088/hello
image.png

2.15.2 通用 Mapper 接口所封装的常用方法

  1. 首先先来看一下 MyMapper 所继承的父类,如:
    interface MyMapper<T> extends Mapper<T>,MySqlMapper<T>
    
    这里有两个父类,Mapper 与 MySqlMapper,我们可以打开 MySqlMapper 看一下:
    interface MySqlMapper<T> extends InsertListMapper<T>,InsertUseGeneratedKeysMapper<T>{}
    
    这里面又继承了了两个 mapper,从类名上可以看得出来,是用于操作数据库的,这两个类里又分别包含了如下方法,简单归类一下:
方法名 操作 备注
insertList(list) 数据批量插入 主键须自增
insertUseGeneratedKeys(record) 插入表数据 主键须自增

很明显,在传统 JavaWeb 开发,这两个方法使用是没有问题的,但是我们的数据库表主键设计肯定是全局唯一的,所以不可能使用自增长 id,所以这两个方法在我们开发过程中是不会使用的,这一点需要注意噢~!

  1. 随后再来看一下 Mapper 中所继承的父类,如下:
    interface Mapper<T> extends BaseMapper<T>,ExampleMapper<T>,RowBoundsMapper<T>
    
    分别来看一下各个父类中的方法有些啥?
  • BaseMapper | | 方法 | 操作 | | —- | —- | —- | | BaseSelectMapper | T selectOne(T record) | 根据实体类中的属性查询表数据,返回单个实体 | | | List select(T record) | 根据实体类中的属性查询表数据,返回符合条件的 list | | | List selectAll() | 返回该表所有记录 | | | int selectCount(T record) | 根据条件查询记录数 | | | T selectByPrimaryKey(Object key) | 根据主键查询单挑记录 | | | boolean existsWithPrimaryKey(Object key) | 查询主键是否存在,返回 true 或 false | | BaseInsertMapper | int insert(T record) | 插入一条记录,属性为空也会保存 | | | int insertSelective(T record) | 插入一条记录,属性为空不保存,会使用默认值 | | BaseUpdateMapper | int updateByPrimaryKey(T record) | 根据实体类更新数据库,属性有 null 会覆盖原记录 | | | int updateByPrimaryKeySelective(T record) | 根据实体类更新数据库,属性有 null 改属性会忽略 | | BaseDeleteMapper | int delete(T record) | 根据实体类中属性多条件删除记录 | | | int deleteByPrimaryKey(Object key) | 根据主键删除记录 |

ExampleMapper,Example类是用于提供给用户实现自定义条件的,也就是 where 条件,主要方法见如下表格:

方法 操作
SelectByExampleMapper List selectByExample(Object example) 根据条件查询记录list
SelectOneByExampleMapper T selectOneByExample(Object example) 根据条件查询单条记录
SelectCountByExampleMapper int selectCountByExample(Object example) 根据条件查询记录数
DeleteByExampleMapper int deleteByExample(Object example) 根据条件删除记录
UpdateByExampleMapper int updateByExample(T record, @Param(“example”) Object example); 根据条件更新数据,null会覆盖
UpdateByExampleSelectiveMapper int updateByExampleSelective(T record, Object example); 根据条件更新数据,null会忽略
  • RowBoundsMapper ,这个是用于做分页的,我们在后续阶段中会使用 page-helper 这个组件来替代这个分页实现。

总结
通用 mapper 所提供的 CRUD 方法对单表操作,大大提高开发效率,当然复杂的多表操作还是需要在 mapper.xml 中自己去编写 sql 代码实现。