SpringBoot+Mybatis使用Mapper接口注册的几种方式
目录
- I. 环境准备
- 1. 数据库准备
- 2. 项目环境
- II. 实例演示
- 1. 实体类,Mapper类
- 2. 注册方式
- 2.1 @MapperScan注册方式
- 2.2 @Mapper 注册方式
- 2.3 MapperScannerConfigurer注册方式
- 3. 小结
- III. 不能错过的源码和相关知识点
- Entity: 数据库实体类
- Mapper: db操作接口
- Service: 服务类
- xml文件:写sql的地方
I. 环境准备
1. 数据库准备
使用mysql作为本文的实例数据库,新增一张表
CREATE TABLE `money` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',`money` int(26) NOT NULL DEFAULT '0' COMMENT '钱',`is_deleted` tinyint(1) NOT NULL DEFAULT '0',`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `name` (`name`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
2. 项目环境
本文借助 SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发
pom依赖如下
org.mybatis.spring.boot mybatis-spring-boot-starter2.2.0 mysql mysql-connector-java
db配置信息 application.yml
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword:
II. 实例演示
前面基础环境搭建完成,接下来准备下Mybatis的Entity,Mapper等基础类
1. 实体类,Mapper类
数据库实体类MoneyPo
@Datapublic class MoneyPo {private Integer id; private String name; private Long money; private Integer isDeleted; private Timestamp createAt; private Timestamp updateAt; }
对应的Mapper接口(这里直接使用注解的方式来实现CURD)
public interface MoneyMapper {/*** 保存数据,并保存主键id** @param po* @return int*/@Options(useGeneratedKeys = true, keyProperty = "po.id", keyColumn = "id")@Insert("insert into money (name, money, is_deleted) values (#{po.name}, #{po.money}, #{po.isDeleted})")int save(@Param("po") MoneyPo po); /*** 更新** @param idid* @param money 钱* @return int*/@Update("update money set `money`=#{money} where id = #{id}")int update(@Param("id") int id, @Param("money") long money); /*** 删除数据** @param id id* @return int*/@Delete("delete from money where id = #{id}")int delete(@Param("id") int id); /*** 主键查询** @param id id* @return {@link MoneyPo}*/@Select("select * from money where id = #{id}")@Results(id = "moneyResultMap", value = https://www.it610.com/article/{@Result(property ="id", column = "id", id = true, jdbcType = JdbcType.INTEGER),@Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR),@Result(property = "money", column = "money", jdbcType = JdbcType.INTEGER),@Result(property = "isDeleted", column = "is_deleted", jdbcType = JdbcType.TINYINT),@Result(property = "createAt", column = "create_at", jdbcType = JdbcType.TIMESTAMP),@Result(property = "updateAt", column = "update_at", jdbcType = JdbcType.TIMESTAMP)})MoneyPo getById(@Param("id") int id); }
对应的Service类
@Slf4j@Servicepublic class MoneyService {@Autowiredprivate MoneyMapper moneyMapper; public void basicTest() {int id = save(); log.info("save {}", getById(id)); boolean update = update(id, 202L); log.info("update {}, {}", update, getById(id)); boolean delete = delete(id); log.info("delete {}, {}", delete, getById(id)); }private int save() {MoneyPo po = new MoneyPo(); po.setName("一灰灰blog"); po.setMoney(101L); po.setIsDeleted(0); moneyMapper.save(po); return po.getId(); }private boolean update(int id, long newMoney) {int ans = moneyMapper.update(id, newMoney); return ans > 0; }private boolean delete(int id) {return moneyMapper.delete(id) > 0; }private MoneyPo getById(int id) {return moneyMapper.getById(id); }}
2. 注册方式
注意,上面写完之后,若不通过下面的几种方式注册Mapper接口,项目启动会失败,提示找不到MoneyMapper对应的bean
Field moneyMapper in com.git.hui.boot.mybatis.service.MoneyService required a bean of type 'com.git.hui.boot.mybatis.mapper.MoneyMapper' that could not be found.
2.1 @MapperScan注册方式
在配置类or启动类上,添加@MapperScan注解来指定Mapper接口的包路径,从而实现Mapper接口的注册
@MapperScan(basePackages = "com.git.hui.boot.mybatis.mapper")@SpringBootApplicationpublic class Application {public Application(MoneyService moneyService) {moneyService.basicTest(); }public static void main(String[] args) {SpringApplication.run(Application.class); }}
执行之后输出结果如下
2021-07-06 19:12:57.984INFO 1876 --- [main] c.g.h.boot.mybatis.service.MoneyService: save MoneyPo(id=557, name=一灰灰blog, money=101, isDeleted=0, createAt=2021-07-06 19:12:57.0, updateAt=2021-07-06 19:12:57.0)注意:
2021-07-06 19:12:58.011INFO 1876 --- [main] c.g.h.boot.mybatis.service.MoneyService: update true, MoneyPo(id=557, name=一灰灰blog, money=202, isDeleted=0, createAt=2021-07-06 19:12:57.0, updateAt=2021-07-06 19:12:57.0)
2021-07-06 19:12:58.039INFO 1876 --- [main] c.g.h.boot.mybatis.service.MoneyService: delete true, null
- basePackages: 传入Mapper的包路径,数组,可以传入多个
- 包路径支持正则,如com.git.hui.boot.*.mapper
- 上面这种方式,可以避免让我们所有的mapper都放在一个包路径下,从而导致阅读不友好
- 上面这种方式,可以避免让我们所有的mapper都放在一个包路径下,从而导致阅读不友好
2.2 @Mapper 注册方式
前面的@MapperScan指定mapper的包路径,这个注解则直接放在Mapper接口上
@Mapperpublic interface MoneyMapper {...}
测试输出省略...
2.3 MapperScannerConfigurer注册方式
使用MapperScannerConfigurer来实现mapper接口注册,在很久以前,还是使用Spring的xml进行bean的声明的时候,mybatis的mapper就是这么玩的
对应的java代码如下:
@Configurationpublic class AutoConfig {@Bean(name = "sqlSessionFactory")public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(// 设置mybatis的xml所在位置,这里使用mybatis注解方式,没有配置xml文件new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/*.xml")); return bean.getObject(); }@Bean("sqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory storySqlSessionFactory) {return new SqlSessionTemplate(storySqlSessionFactory); }@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("com.git.hui.boot.mybatis.mapper"); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setSqlSessionTemplateBeanName("sqlSessionTemplate"); return mapperScannerConfigurer; }}
测试输出省略
3. 小结
本文主要介绍Mybatis中Mapper接口的三种注册方式,其中常见的两种注解方式
- @MapperScan: 指定Mapper接口的包路径
- @Mapper: 放在mapper接口上
- MapperScannerConfigurer: 编程方式注册
如写通用的Mapper(类似Mybatis-Plus中的BaseMapper)
如一个Mapper,多数据源的场景(如主从库,冷热库,db的操作mapper一致,但是底层的数据源不同)
III. 不能错过的源码和相关知识点
工程:https://github.com/liuyueyi/spring-boot-demo
源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/104-mybatis-ano
【SpringBoot+Mybatis使用Mapper接口注册的几种方式】到此这篇关于SpringBoot+Mybatis使用Mapper接口注册的几种方式的文章就介绍到这了,更多相关SpringBoot Mapper接口注册内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小