2.15.1 使用 MyBatis 数据库逆向生成工具
T 代表通用的,针对于任何的实体类都是可以去使用的
打开配置文件,设置相应的配置,注意 targetPackage 所指向的目录必须存在
设置相应的数据库表
找到 GeneratorDisplay 文件,运行,反向生成代码
反向生成代码成功
pojo 类里生成的注解跟实体表字段一一对应
- 如果跟实体表字段完全一样,是没有 @Column 注解的
- 如果数据库字段带“_”,则会改成驼峰命名
在生成好的 xml 文件中提供了一个 resultMap 并做了简单的封装
将反向生成好的代码拷贝到项目中
此时你会发现代码中有错误的部分,需要对现在的项目进行调整
- 在 pom 中引入通用 mapper 工具
pom 文件中添加 mapper-spring-boot-starter
在 yml 中引入通用 mapper 配置
############################################################
#
# mybatis mapper 配置
#
############################################################
# 通用 Mapper 配置
mapper:
mappers: com.imooc.my.mapper.MyMapper
not-empty: false # 在进行数据库操作的时候,判断表达式 username != null,是否追加 username != ''
identity: MYSQL # 数据库方言
引入 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 项目并运行
访问 http://localhost:8088/hello
2.15.2 通用 Mapper 接口所封装的常用方法
- 首先先来看一下 MyMapper 所继承的父类,如:
这里有两个父类,Mapperinterface MyMapper<T> extends Mapper<T>,MySqlMapper<T>
与 MySqlMapper ,我们可以打开 MySqlMapper 看一下:
这里面又继承了了两个 mapper,从类名上可以看得出来,是用于操作数据库的,这两个类里又分别包含了如下方法,简单归类一下:interface MySqlMapper<T> extends InsertListMapper<T>,InsertUseGeneratedKeysMapper<T>{}
方法名 | 操作 | 备注 |
---|---|---|
insertList(list) | 数据批量插入 | 主键须自增 |
insertUseGeneratedKeys(record) | 插入表数据 | 主键须自增 |
很明显,在传统 JavaWeb 开发,这两个方法使用是没有问题的,但是我们的数据库表主键设计肯定是全局唯一的,所以不可能使用自增长 id,所以这两个方法在我们开发过程中是不会使用的,这一点需要注意噢~!
- 随后再来看一下 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
类 | 方法 | 操作 |
---|---|---|
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 代码实现。