范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringBoot(十二)MyBatisPlus的多数据源和分页

  为什么需要多数据源
  同一个项目有时会涉及到多个数据库,这时我们就要配置多个数据源。配置多数据源的常见情况有以下两种:
  1)同一个项目中涉及两个或多个业务数据库,它们之间相互独立,这种情况也可以作为两个或多个项目来开发
  2)两个或多个数据库之间是主从关系,主库负责写,从库负责读 多数据源的配置
  1、pom.xml配置
  在pom.xml中增加MyBatis-Plus多数据源依赖:       com.baomidou     dynamic-datasource-spring-boot-starter     3.2.1 
  2、配置文件配置
  在配置文件application.yml中配置我们需要连接的数据库:blog和user,默认为blog spring:   datasource:     dynamic:       # 设置默认数据源       primary: blog       # 设置严格模式,false为不启动,启动后在未匹配到指定数据源时会抛出异常,不启动则使用默认数据源       strict: false       datasource:         blog:           url: jdbc:mysql://localhost:3306/blog           username: root           password: 123456           type: com.alibaba.druid.pool.DruidDataSource           druid:             initialSize: 5             minIdle: 5             maxActive: 20             maxWait: 2000             validationQuery: select "x"             testOnBorrow: false             testOnReturn: false             testWhileIdle: true         user:           url: jdbc:mysql://localhost:3306/user           username: root           password: 123456           type: com.alibaba.druid.pool.DruidDataSource           druid:             initialSize: 5             minIdle: 5             maxActive: 20             maxWait: 2000             validationQuery: select "x"             testOnBorrow: false             testOnReturn: false             testWhileIdle: true mybatis-plus:   configuration:     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  3、启动类配置
  在@SpringBootApplication注解上增加exclude = DruidDataSourceAutoConfigure.class配置: @SpringBootApplication(scanBasePackages = "com.tn222.springboot.article12.**",          exclude = DruidDataSourceAutoConfigure.class)  @MapperScan(basePackages = "com.tn222.springboot.article12.dao")  public class Article12Application {       public static void main(String[] args) {          SpringApplication.run(Article12Application.class, args);      }   }
  这个配置的作用是去掉对DruidDataSourceAutoConfigure的自动配置,否则程序会报错: Failed to configure a DataSource: "url" attribute is not specified and no embedded datasource could be configured.  Reason: Failed to determine a suitable driver class
  原因:
  DruidDataSourceAutoConfigure在DynamicDataSourceAutoConfiguration之前,其会注入一个DataSourceWrapper,会在原生的spring.datasource下找url, username, password等,而我们动态数据源的配置路径是变化的。
  4、实体类和dao层配置
  在po文件夹下创建blog和user文件夹,分别用于存储blog数据库和user数据库的实体: @TableName(value = "article")  public class ArticlePo {       @TableId(type = IdType.AUTO)      private Integer id;      private String articleId;      private String title;        // get、set...  }   @TableName(value = "user_info")  public class UserInfoPo {       @TableId(type = IdType.AUTO)      private Integer id;      private String userId;      private String name;       // get、set...  }
  注解:
  @TableName: 表名注解,标识实体类对应的表
  @TableId: 主键注解,当type = IdType.AUTO时,表示这个主键是自增主键
  在dao文件夹下创建blog和user文件夹,分别用于存储blog和user的dao: @Repository  public interface ArticleDao extends BaseMapper {   }   @Repository  @DS("user")  public interface UserInfoDao extends BaseMapper {   }
  注解:
  @Repository: 将数据访问层(DAO层)的类标识为Spring Bean
  @DS: 配置非默认数据源,本示例中blog为默认数据源,user为非默认数据源,在使用@DS注解时,有如下注意事项:
  1)不能使用事务,否则数据源不会切换,使用的还是第一次加载的数据源
  2)第一次加载数据源之后,第二次,第三次……操作其他数据源,如果数据源不存在,使用的还是第一次加载的数据源
  3)数据源名称不要包含下划线,否则不能切换
  5、测试验证
  编写ArticleController和UserInfoController: @RestController  @RequestMapping("/article")  public class ArticleController {       @Resource      private ArticleDao articleDao;       @GetMapping(value = "/get")      public ArticlePo get(@RequestParam("articleId") String articleId) {          ArticlePo articlePo = articleDao.selectOne(Wrappers.lambdaQuery()                  .eq(ArticlePo::getArticleId, articleId));          return articlePo;      }       @PostMapping(value = "/insert")      public Boolean insert(@RequestBody ArticlePo articlePo) {          articleDao.insert(articlePo);          Boolean res = false;          if (articlePo.getId() > 0) {              res = true;          }          return res;      }   }   @RestController  @RequestMapping("/user")  public class UserInfoController {       @Resource      private UserInfoDao userInfoDao;       @GetMapping(value = "/get")      public UserInfoPo get(@RequestParam("userId") String userId) {          UserInfoPo res = userInfoDao.selectOne(Wrappers.lambdaQuery().eq(UserInfoPo::getUserId, userId));          return res;      }       @PostMapping(value = "/insert")      public Boolean insert(@RequestBody UserInfoPo userInfoPo) {          userInfoDao.insert(userInfoPo);          Boolean res = false;          if (userInfoPo.getId() > 0) {              res = true;          }          return res;      }   }
  注 : 业务逻辑复杂时,Controller和Mapper中间会有Service层来处理业务逻辑,现在我们就简单的测试一下多数据源,所以直接使用Controller调用Mapper了 MyBatis-Plus的分页
  1、配置分页插件 @Configuration  @MapperScan("com.tn222.springboot.article12.dao")  public class MybatisPlusConfig {        /**       * 分页插件       */      @Bean      public PaginationInterceptor paginationInterceptor(){          return new PaginationInterceptor();      }   }
  2、分页方法
  1)使用MyBatis-Plus的selectPage方法 @GetMapping("/listByLambda") public Object listByLambda(@RequestParam("title") String title, @RequestParam("pageIndex") Integer pageIndex,                             @RequestParam("pageSize") Integer pageSize) {      IPage thisPage = new Page<>(pageIndex, pageSize);      LambdaQueryWrapper eq = Wrappers.lambdaQuery()              .eq(ArticlePo::getTitle, title).orderByDesc(ArticlePo::getId);      thisPage = articleDao.selectPage(thisPage, eq);      return thisPage;  }
  使用MyBatis-Plus的selectPage方法,返回了IPage,示例: {      "records": [          {              "id": 7,              "articleId": "f68c5ccf9e3b4a719b369f9a84316635",              "title": "Mybatis-Plus update"          },          {              "id": 2,              "articleId": "1eabc4f8ce0711ec9b05979114b13a0f",              "title": "Mybatis-Plus update"          }      ],      "total": 3,      "size": 2,      "current": 1,      "orders": [],      "searchCount": true,      "pages": 2  }
  2)sql分页
  有时候有些分页需要关联多张表,使用LambdaQueryWrapper不太方便,这时候可以自己写sql来实现分页,主要有两种:纯sql自己实现分页和使用IPage实现分页
  注 : 这里的sql示例就使用单表查询了,具体的可根据业务场景使用多表查询
  A、纯sql自己实现分页
  分页的数据list和总条数单独调用方法返回 : @Select("select * from article where title=#{title} order by id desc limit #{offset}, #{pageSize}")  List listByTitle(@Param("title") String title, @Param("offset") Integer offset,                              @Param("pageSize") Integer pageSize);   @Select("select count(id) from article where title=#{title}")  int countByTitle(@Param("title") String title);
  B、使用IPage实现分页(常用) @Select("select * from article where title=#{title} order by id desc")  IPage listByPage(IPage thisPage, @Param("title") String title);
  返回IPage,返回值的数据结构见" 1)使用MyBatis-Plus的selectPage方法 "
  本文简单介绍了一下MyBatis-Plus的多数据源和分页,本文示例代码, 详见https://gitee.com/tunan222/spring-boot-demo
  若您觉得还可以,请帮忙点个 "赞" ,谢谢

iPhone4S降速门将和解!向每部赔15美元,网友苹果系统升级老机型降速不是常规操作?中国经济周刊经济网讯据外媒报道,苹果已同意和解一项持续六年集体诉讼。该诉讼指控苹果在2015年更新iOS9后故意降低iPhone4S设备的速度。根据和解协议,苹果将拨出2000万美高端智能手机的购买,优先选择iPhone已趋近共识,怪谁?文丨58数码如果条件允许的话,下一次更换手机的时候,你会选择什么品牌?很多不熟悉iPhone的人,心中都产生过一个疑惑,明明现在的国产手机已经今非昔比,而且价格相比较iPhone而2。9秒破百空气悬架,车身带跳雷,路特斯ELETRE实力如何?作为路特斯旗下首款纯电中大型SUV路特斯ELETRE实力如何?它能在纯电豪华SUV中脱颖而出吗?我想很多朋友对这两个问题很感兴趣吧?从路特斯被吉利汽车收购后,这个品牌在国内市场的关让你的Node。jsWeb应用程序更快的10个技巧由于其事件驱动和异步特性,Node。js已经飞速发展。但是,在现代网络中,仅仅快速是不够的。如果您计划使用Node。js开发您的下一个Web应用程序,您必须采取一切可能的步骤来确保尼康口的70200应该怎么选?作为三大元之一的70200F2。8是摄影人最想入手的中长焦镜头,各厂商的每一次升级都备受关注,而副厂的70200最让人期待的它的价格。一选择自己能接受的价格先说尼康70200F2。该如何选择投影仪?首先建议不要选择几百块钱的投影仪,因为它毕竟价格所限决定了性能。目前国内的投影仪比较出名的有,极米坚果暴风,这三家的投影仪在国内的销量都比是比较大的,所以它的价格也是比较亲民。首先助听器不戴听不好,戴吧耳朵又痒,怎么办?戴助听器会有耳朵痒是外耳道皮肤感觉神经受到轻微刺激后产生的一种感觉。如果是正常的刺激后反应则不要紧,把助听器拿下来,隔一段时间再戴上去。平时应注意清洁干燥自己的助听器,注意一些清洁资讯特斯拉宿敌宣布订单量达4。5万辆,第三款新车续航804公里文懂车帝原创常思玥懂车帝原创行业日前,据台媒报道,富士康母公司鸿海集团的合作伙伴美国造车新势力Fisker宣布,近期订单较2月公布的数字暴增五成,目前累计订单已经达到4。5万辆。美华为MateXs2开售!京东下单享30天无忧退365天只换不修等服务5月6日,华为新一代折叠旗舰MateXs2正式开售。华为MateXs2聚焦折叠屏手机的使用场景与用户痛点,以超轻薄超平整超可靠的产品特性为消费者带来惊艳折叠大屏体验,一经发布就受到越来越多的人把做互联网当做副业,实体经济真的不行了吗?谢谢邀请。这个问题得分几个角度分析一行业种类。有的实体经济是互联网无法替代的,例如第三产业高端订制低值商品零售。毕竟互联网在用户体验和物流成本与配送速度无法取代原有实体经济。而有些美国研究认为人不会死而是去了宇宙,你怎么看?很多人都怕死,但是死后还会这样延续下去,是不是瞬间感觉不怕了呢?想必大多数人都是害怕死亡的,但生老病死又是自然规律,尽管你再怎么害怕,总有一天也得面对,但是科学研究表明,死后还有一
从新科技智慧美学角度解析UNI序列持续走红的缘由川端康成说自然的美是无限的,而人的感受是有限的。追寻美的极致,便是趋近无界。4月28日,一场关于新科技智慧美学的探索之旅逐美之行无界漫谈新科技智慧美学直播正式举行。此次活动由长安汽搭载遥控移动黑科技,准L3级智能驾驶辅助,宽体溜背轿跑基于DSMA架构打造,一款宽体溜背轿跑,在尺寸上面直追B级,价格区间为9。3912。59万元,并且搭载了准L3级智能驾驶辅助系统,支持OTA的升级,给这辆车增加了更多的可玩性,整体DaVinciResolveFairlight助力纽约电影学院音频后期课程纽约电影学院洛杉矶校区声音系在课程中采用了DaVinciResolveFairlight音频后期制作工具,2020年当声音系主任HuchPlatt和他的学生需要快速找到能在家中访问老将VS新秀,谁更胜一筹?面对销量王,EVOS到底抗不抗打?在芯片问题的寒冬尚未褪去之时,SUV市场却依旧火热。作为最近较为热门的新车福特EVOS,也是深受消费者关注。那么在购车选择时,是随大流选择销量稳定的车型,还是感受一把新秀的魅力?这瑞士付费电视网络采用BlackmagicDesign产品拓展体育直播业务瑞士领军级付费电视网络Teleclub实施UltraHD视频播放系统,该系统围绕BlackmagicDesign12G产品搭建而成,为日益增长的线性和PPV体育点播直播频道提供了支最好的风景在路上现代交通方便,道路四通八达。工作节奏紧张,压力大。所以,需要换个地方看看,出去走一走,放松一下。现在的景区建设的很大气壮观,但总感觉空洞洞的,景区l给留下的印象不深,也没特别的震撼打工人通勤路上的御寒利器fooxmet风谜温控发热围巾儿时最喜欢的季节就是冬季了,那时在张家口生活,冬天一有空就去玩冰车,为了御寒,穿的跟笨熊似的,记得那时最御寒的物件除了皮帽子就是围脖了。现在回到老家济南,可能是因为老舍先生在济南的看似乖巧,其实很难驾驭的三大星座金牛座金牛座的人看起乖巧,平常不言不语,不争不抢,可内心其实有很多脾气,只不过不到关键时刻,他们不会轻易展示出来。和金牛接触久了,你就会发现他们其实是外圆内方的性格,他们的温和只是测温更快更方便的凡米发光耳温计疫情防控常态化的今天,家有小宝宝的朋友,对小朋友的温度是天天关心的,除了每天给学校报告体温以外,偶尔的发烧也是非常让人揪心的。传统的水银体温计测温时间长,难度较高,让小朋友安静的测真无线耳机?移动电源?南卡N2S到底是啥真无线耳机真的给我们的日常生活带来了太多的方便,大街上随处可见。移动电源也是出门的必备品,不过说实话出门带真无线耳机加移动电源真的有点累。我想减负,这么南卡的产品经理就想到了。南卡南卡POW3无线快充充电宝真的是超级给力虽然说手机的快充已经在普及,可是对于经常出差的人来说,随身携带一个充电宝已经是必备。今天我再次给大家推荐我已经使用一段时间的南卡POW3超级快充磁吸无线充电宝,20000mAh的大