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

阿里一手爆出Springboot整合MybatisPlus(超详细)完整教程

  新建springboot项目
  开发工具:idea2019.2,maven3
  pom.xml                 org.springframework.boot             spring-boot-starter                               org.springframework.boot             spring-boot-starter-web                               mysql             mysql-connector-java             runtime                               org.projectlombok             lombok             true                                        com.baomidou             mybatis-plus-boot-starter             3.2.0                               com.baomidou             mybatis-plus-generator             3.2.0                               org.freemarker             freemarker             2.3.28                               com.alibaba             fastjson             1.2.47           application.yml:server:   port: 8081   servlet:     context-path: /  spring:   datasource:     driver-class-name: com.mysql.cj.jdbc.Driver     url: jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true     username: root     password: lyja   jackson:     date-format: yyyy-MM-dd HH:mm:ss     time-zone: GMT+8     serialization:       write-dates-as-timestamps: false  mybatis-plus:   configuration:     map-underscore-to-camel-case: true     auto-mapping-behavior: full     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   mapper-locations: classpath*:mapper/**/*Mapper.xml   global-config:     # 逻辑删除配置     db-config:       # 删除前       logic-not-delete-value: 1       # 删除后       logic-delete-value: 0 mybatisplus分页插件MybatisPlusConfig:package com.example.conf;  import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  /**  * 配置分页插件  *  */ @Configuration public class MybatisPlusConfig {      /**      * 分页插件      */     @Bean     public PaginationInterceptor paginationInterceptor() {         return new PaginationInterceptor();     } }  mybatisplus自动生成代码GeneratorCodeConfig.java:package com.example.conf;  import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;  import java.util.Scanner;  /**  * 自动生成mybatisplus的相关代码  */ public class GeneratorCodeConfig {      public static String scanner(String tip) {         Scanner scanner = new Scanner(System.in);         StringBuilder help = new StringBuilder();         help.append("请输入" + tip + ":");         System.out.println(help.toString());         if (scanner.hasNext()) {             String ipt = scanner.next();             if (StringUtils.isNotEmpty(ipt)) {                 return ipt;             }         }         throw new MybatisPlusException("请输入正确的" + tip + "!");     }      public static void main(String[] args) {         // 代码生成器         AutoGenerator mpg = new AutoGenerator();          // 全局配置         GlobalConfig gc = new GlobalConfig();         String projectPath = System.getProperty("user.dir");         gc.setOutputDir(projectPath + "/src/main/java");         gc.setAuthor("astupidcoder");         gc.setOpen(false);         //实体属性 Swagger2 注解         gc.setSwagger2(false);         mpg.setGlobalConfig(gc);          // 数据源配置         DataSourceConfig dsc = new DataSourceConfig();         dsc.setUrl("jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");         dsc.setDriverName("com.mysql.cj.jdbc.Driver");         dsc.setUsername("root");         dsc.setPassword("lyja");         mpg.setDataSource(dsc);          // 包配置         PackageConfig pc = new PackageConfig(); //        pc.setModuleName(scanner("模块名"));         pc.setParent("com.example");         pc.setEntity("model.auto");         pc.setMapper("mapper.auto");         pc.setService("service");         pc.setServiceImpl("service.impl");         mpg.setPackageInfo(pc);          // 自定义配置 //        InjectionConfig cfg = new InjectionConfig() { //            @Override //            public void initMap() { //                // to do nothing //            } //        };          // 如果模板引擎是 freemarker //        String templatePath = "/templates/mapper.xml.ftl";         // 如果模板引擎是 velocity         // String templatePath = "/templates/mapper.xml.vm";          // 自定义输出配置 //        List focList = new ArrayList<>();         // 自定义配置会被优先输出 //        focList.add(new FileOutConfig(templatePath) { //            @Override //            public String outputFile(TableInfo tableInfo) { //                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! //                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() //                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; //            } //        });         /*         cfg.setFileCreate(new IFileCreate() {             @Override             public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {                 // 判断自定义文件夹是否需要创建                 checkDir("调用默认方法创建的目录");                 return false;             }         });         */ //        cfg.setFileOutConfigList(focList); //        mpg.setCfg(cfg);          // 配置模板         TemplateConfig templateConfig = new TemplateConfig();          // 配置自定义输出模板         //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别         // templateConfig.setEntity("templates/entity2.java");         // templateConfig.setService();         // templateConfig.setController();          templateConfig.setXml(null);         mpg.setTemplate(templateConfig);          // 策略配置         StrategyConfig strategy = new StrategyConfig();         strategy.setNaming(NamingStrategy.underline_to_camel);         strategy.setColumnNaming(NamingStrategy.underline_to_camel);         strategy.setSuperEntityClass("com.baomidou.mybatisplus.extension.activerecord.Model");         strategy.setEntityLombokModel(true);         strategy.setRestControllerStyle(true);          strategy.setEntityLombokModel(true);         // 公共父类 //        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");         // 写于父类中的公共字段 //        strategy.setSuperEntityColumns("id");         strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));         strategy.setControllerMappingHyphenStyle(true);         strategy.setTablePrefix(pc.getModuleName() + "_");         mpg.setStrategy(strategy);         mpg.setTemplateEngine(new FreemarkerTemplateEngine());         mpg.execute();     } }  测试
  建表:
  执行GeneratorCodeConfig.java文件,输入表名user:
  解决方法:在数据库连接中配置添加allowPublicKeyRetrieval=true
  查看生成的文件;
  添加扫描mapper注解
  启动springboot的application启动类:会报错,提示找不到mapper文件,我们需要在springboot启动类上添加扫描mapper的注解: package com.example;  import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;  @SpringBootApplication @MapperScan("com.example.mapper") public class DemoApplication {      public static void main(String[] args) {         SpringApplication.run(DemoApplication.class, args);     }  }
  UserController.java中新增接口:   @Autowired     private IUserService userService;     @PostMapping("/getUser")     public User getUser(){         return userService.getById(1);     }
  postman测试:
  没问题。
  上面是mybatisplus测试成功,下面我们继续测试我们自己写的sql是否成功。
  在resources目录下新建mapper文件夹,新建UserMapper.xml文件: <?xml version="1.0" encoding="UTF-8"?>                
  UserMapper.java package com.example.mapper.auto;  import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.model.auto.User;  import java.util.List;  /**  * 

* Mapper 接口 * * * @author astupidcoder * @since 2020-05-13 */ public interface UserMapper extends BaseMapper { public ListfindAllUser(); }   IUserService: package com.example.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.model.auto.User; import java.util.List; /** *

* 服务类 * * * @author astupidcoder * @since 2020-05-13 */ public interface IUserService extends IService { public List findAllUser(); }   UseServiceImpl.java: package com.example.service.impl; import com.example.model.auto.User; import com.example.mapper.auto.UserMapper; import com.example.service.IUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *

* 服务实现类 * * * @author astupidcoder * @since 2020-05-13 */ @Service public class UserServiceImpl extends ServiceImpl implements IUserService { @Autowired private UserMapper userMapper; @Override public List findAllUser() { return userMapper.findAllUser(); } }   UserController.java: package com.example.controller; import com.example.model.auto.User; import com.example.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** *

* 前端控制器 * * * @author astupidcoder * @since 2020-05-13 */ @RestController @RequestMapping("/user") public class UserController { @Autowired private IUserService userService; @PostMapping("/getUser") public User getUser(){ return userService.getById(1); } @PostMapping("/findAllUser") public List findAllUser(){ return userService.findAllUser(); } }   测试findAllUser接口:   常用的工具类:   ResultInfo.java package com.example.conf; import lombok.Data; import java.io.Serializable; /** *返回结果类统一封装 */ @Data public class ResultInfo implements Serializable { // 状态码 private Integer code; // 消息 private String message; // 数据对象 private Object result; private Integer total; /** * 无参构造器 */ public ResultInfo() { super(); } public ResultInfo(Status status) { super(); this.code = status.code; this.message = status.message; } public ResultInfo result(Object result) { this.result = result; return this; } public ResultInfo message(String message) { this.message = message; return this; } public ResultInfo total(Integer total) { this.total = total; return this; } /** * 只返回状态,状态码,消息 * * @param code * @param message */ public ResultInfo(Integer code, String message) { super(); this.code = code; this.message = message; } /** * 只返回状态,状态码,数据对象 * * @param code * @param result */ public ResultInfo(Integer code, Object result) { super(); this.code = code; this.result = result; } /** * 返回全部信息即状态,状态码,消息,数据对象 * * @param code * @param message * @param result */ public ResultInfo(Integer code, String message, Object result) { super(); this.code = code; this.message = message; this.result = result; } }   Status.java package com.example.conf; /** * 枚举类对象 */ public enum Status { // 公共 SUCCESS(2000, "成功"), UNKNOWN_ERROR(9998,"未知异常"), SYSTEM_ERROR(9999, "系统异常"), INSUFFICIENT_PERMISSION(4003, "权限不足"), WARN(9000, "失败"), REQUEST_PARAMETER_ERROR(1002, "请求参数错误"), // 登录 LOGIN_EXPIRE(2001, "未登录或者登录失效"), LOGIN_CODE_ERROR(2002, "登录验证码错误"), LOGIN_ERROR(2003, "用户名不存在或密码错误"), LOGIN_USER_STATUS_ERROR(2004, "用户状态不正确"), LOGOUT_ERROR(2005, "退出失败,token不存在"), LOGIN_USER_NOT_EXIST(2006, "该用户不存在"), LOGIN_USER_EXIST(2007, "该用户已存在"); public int code; public String message; Status(int code, String message) { this.code = code; this.message = message; } } 附录:   一份详尽的yml配置文件(关于数据源的配置比较详尽): server: port: 8085 servlet: context-path: /test spring: #redis集群 redis: host: 127.0.0.1 port: 6379 timeout: 20000 # 集群环境打开下面注释,单机不需要打开 # cluster: # 集群信息 # nodes: xxx.xxx.xxx.xxx:xxxx,xxx.xxx.xxx.xxx:xxxx,xxx.xxx.xxx.xxx:xxxx # #默认值是5 一般当此值设置过大时,容易报:Too many Cluster redirections # maxRedirects: 3 password: lyja application: name: test jedis: pool: max-active: 8 min-idle: 0 max-idle: 8 max-wait: -1 database: 0 autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure datasource: dynamic: #设置默认的数据源或者数据源组,默认值即为master primary: master strict: false datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: lyja # 数据源配置 druid: # druid连接池监控 stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin # 初始化时建立物理连接的个数 initial-size: 5 # 最大连接池数量 max-active: 30 # 最小连接池数量 min-idle: 5 # 获取连接时最大等待时间,单位毫秒 max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 连接保持空闲而不被驱逐的最小时间 min-evictable-idle-time-millis: 300000 # 用来检测连接是否有效的sql,要求是一个查询语句 validation-query: select count(*) from dual # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 test-while-idle: true # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 test-on-borrow: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 test-on-return: false # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 pool-prepared-statements: false # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 max-pool-prepared-statement-per-connection-size: 50 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计 filters: stat,wall # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connection-properties: druid.stat.mergeSql: true druid.stat.slowSqlMillis: 500 # 合并多个DruidDataSource的监控数据 use-global-data-source-stat: true filter: stat: log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true servlet: multipart: # 开启 multipart 上传功能 enabled: true # 文件写入磁盘的阈值 file-size-threshold: 2KB # 最大文件大小 max-file-size: 200MB # 最大请求大小 max-request-size: 215MB mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*Mapper.xml global-config: # 逻辑删除配置 db-config: # 删除前 logic-not-delete-value: 1 # 删除后 logic-delete-value: 0 logging: level: root: info com.example: debug   总结:   所有的面试题目都不是一成不变的,特别是像一线大厂,上面的资料只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(777)领取,祝大家更上一层楼!!!   原文作者:易水寒   原文出处:https://www.cnblogs.com/liuyj-top/p/12976396.html


Redmi10Prime海外发布6000mAh电池联发科G889月3日下午,Redmi在印度发布了一款入门价位4G新机Redmi10Prime。Redmi10Prime正面为居中打孔屏设计,配备一块6。5英寸24001080分辨率90Hz刷新65岁的老人适合什么戴什么样的助听器?会产生依赖性吗?65岁的老人一般手的操作性不太灵活,建议首选耳背机,摘戴方便,体积较大,只要耳塞戴好就行,不像定制机,一定要带到耳道正中间才行,年纪大了的老人一定选择简易好佩戴的,而且耳背机功率较如何正确的认识助听器?我们的听力损失,事实上,对助听器效果影响至大的是自己的听觉分辨能力。多数患者都有不同程度的分辨能力的损失。损失的不多,助听器可以补偿。若损失过于严重的助听器也就无能为力了。助听器毕别人给的助听器可以直接戴吗?不行的,应该让专业人员检测,根据你自己听力情况和外耳道大小,选择合适你自己的助听器。助听器不是随便拿来一个就可以戴的配助听器就像配眼镜一样要经过专业的听力检查听力分析助听器分析调试耳聋可以佩戴助听器吗?耳聋的患者应该首先到医院就诊,由耳鼻喉科医生做全面检查,确定耳聋的性质程度和可能的病因,检查完成后医生认为适合佩戴助听器的时候,再根据听力的情况,由助听器验配师,根据患者的听力结果海南将继续对购置新能源汽车予以奖励,申请程序省工业和信息化厅省财政厅省公安厅5月29日联合发出通知,为促进新能源汽车消费,今年我省将继续对购置新能源汽车予以奖励,将根据购车价格每台奖励6000至1万元,奖励总量不超过2。5万果不其然!iPhone12618价格再降,售价感人在手机领域,即便没有买过苹果手机的消费者,对苹果手机也都有这样的定位,高端创新标杆!苹果几乎每一代iPhone的发布,不仅线下门庭若市,线上更是销售火爆。华为出货量受限,iPhon余承东11点突然发文,与华为P50无关,但对华为至关重要如果说,此前一段时间,手机江湖的主题,是旗舰新机发布,魅族18vivoS9黑鲨4一加9小米11Pro等百花争艳的话。那么,接下来半个多月,手机市场最重要的事件,无疑就是狂欢节对决了仍可搜出低俗内容部分App青少年模式存不足来源人民网原创稿互联网App的防沉迷青少年模式效果如何?日前,人民网选取了抖音快手爱奇艺腾讯视频优酷斗鱼虎牙哔哩哔哩微信微博十款涉及互联网直播视频播放游戏社交等内容形式的App进行华为芯片解禁?发布鸿蒙系统和新一代平板,搭载高通芯片今天晚上不止是华为鸿蒙系统2。0的发布会那么简单,还有新产品推出,据一些数码博主爆料,华为可能发布新一代重磅产品MatePadPro,这里所说的MatePadPro不是去年老版本,高品质五星入门机RedmiNote10评测一款5G手机要花多少钱才能买到?在5G手机刚刚推出的时候这个答案可能是三四千或是四五千块,但是在过去这么久之后,现在5G手机的门槛早已被大大降低,买一台5G手机仅需要999元。红米
华为和小米到底该怎么选择?专家从3个方面带你一眼看出差距华为手机和小米手机都是国内热度很高的两种手机品牌,都是国产手机的品牌,但是双方的初始道路却不一样,华为凭借自己的研发技术,打造出一款又一款的令人惊叹的机型,小米则是选择性价比以及MOppoFindN屏幕供应商曝光,使用的是三星显示器的可折叠OLED面板据12月14日报道,Oppo将于12月15发布的首款可折叠手机FindN使用的是三星显示器的可折叠OLED面板。消息人士称,这家韩国显示面板制造商已向这家中国智能手机制造商提供了7三星GalaxyS22Plus参数大全三星GalaxyS22Plus价格暂无价格上市时间2021年屏幕尺寸6。2英寸分辨率32001440屏幕技术康宁大猩猩玻璃VictusHDR技术HDR10输入方式虚拟按键触摸屏类型要么掉入万丈深渊,要么涅槃重生有人常拿任正非与和盛稻夫相比较。二人一个是中国民营企业做实业做通信科技并且代表中国制造(创造)的最高水平的人物,一个是日本最高企业(组织)管理的图腾象征。但有一点任总与和盛是一致的华为6月2日举行鸿蒙发布会,你最关心啥?会让败蹬们睡不着觉吗?等了两年,终于等到华为正式举行鸿蒙发布会,讲实话,非常期待!我觉得华为这次鸿蒙发布会是有备而来,肯定在功能特性上和用户体验上一定有精彩的地方,这两年系统我的华为手机时不时就会有个小华为奇葩面试题,你能答出来吗?上月网传华为公司有这样一个面试题,引起了很多网友的讨论兴趣。一头牛重800kg,一座桥承重700kg,牛怎样过河?针对这个问题,网友们天马行空,大开脑洞,为我们呈现出一场精彩智慧对堆料十足的岚图FREE,内屏可升降丹拿音响,定义豪华高端近两年新能源汽车发展十分迅猛,大多数的品牌的车企都开始往这个领域发展,作为老品牌自主车企的东风汽车也开始向这一领域进军,推出了全新高端电动车品牌岚图,其中这款岚图FREE就是首款车20多万买一款插电混合动力SUV,需要什么样的理由在同一车系燃油版和混动版之间,很多人会为了省个两三万块买燃油版车型,在我看来,这并不划算。发动机排量在2。0L以上,开个几年,后期油耗差距几乎可以补回来。特别是堵车的时候,更能体会屡教不改社区团购平台十荟团被顶格处罚150万来源联商网撰文拾一对于社区团购企业来说,用激进的价格补贴策略打压对手,抢占市场,已经玩不转了。5月27日,市场监管总局对社区团购平台十荟团不正当价格行为再次作出顶格罚款并责令停业整OPPOReno6系列来了,哪一款是你的菜?OPPOReno6系列正式发布,一共有三款机型,Reno6Reno6Pro和Reno6Pro,Reno6起售价2799元,比上一代仅仅多了100元,全系标配65W充电90Hz刷新率中石化入局换电,未来新能源汽车可去加油站换电国家发改委国家能源局发布了关于进一步提升充换电基础设施服务保障能力的实施意见(征求意见稿)。建议推行发展新能源充电配套,从公告看出,除了增加公共充电桩数量和布局外,推行换电模式与充