springboot2.3整合mybatis-plus3.3.2较为详细的教程

  • 前言
  • 项目环境
    • maven依赖如下
    • 项目配置如下
    • 建表语句如下
    • 使用mybatis-plus代码生成插件生成代码
    • 配置分页插件
    • 启动类加扫描dao注解
  • mabatis-plus 基础演示
  • mybatis-plus的条件构造器
  • 自定义sql语句

前言

mybatis官网
Mybatis-Plus是一个Mybatis框架的增强插件,核心理念
是为简化开发而生
根据官方描述,MP只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑.并且只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间.代码生成,分页,性能分析等功能一应俱全。

项目环境

ide工具:idea
springboot版本:2.3.0
mybatis-plus:3.3.2
jdk:12
数据库:MySQL(版本8.0+)

maven依赖如下

  <dependencies>
<!--  thymeleaf模板      --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<!--        mvc框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!-- 数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 实现对 Druid 连接池的自动化配置 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version></dependency>
<!--        lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
<!--        mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version></dependency><!--       mybatis-plus 代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.2</version></dependency><!--        代码生成模板--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.30</version></dependency><!-- 1. swagger-bootstrap-ui 目前改名为 knife4j --><!-- 2. 实现 swagger-bootstrap-ui 的自动化配置  --><!-- 3. 因为 knife4j-spring 已经引入 Swagger 依赖,所以无需重复引入 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring</artifactId><version>1.9.6</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-ui</artifactId><version>1.9.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>

项目配置如下

# 配置端口号
server:port: 8080# 数据源配置
spring:datasource:url: jdbc:mysql://localhost:3306/mp_test?useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 自己的数据库连接密码type: com.alibaba.druid.pool.DruidDataSource#模板引擎设置thymeleaf:mode: HTMLencoding: UTF-8servlet:content-type: text/html# 开发时关闭缓存,页面实时刷新cache: false# mybatis- plus配置
mybatis-plus:# xml扫描,多个目录用逗号或者分号隔开隔开mapper-locations: classpath:mapper/*.xml# 以下配置均有默认值,可以不设置global-config:db-config:#主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";id-type: autoconfiguration:# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射map-underscore-to-camel-case: true# 返回map时true:当查询数据为空时字段返回为null,false:不加这个查询数据为空时,字段将被隐藏call-setters-on-nulls: true# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

建表语句如下

create schema mp_test;
use mp_test;
CREATE TABLE `mp_user` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` varchar(32) DEFAULT NULL COMMENT '姓名',`age` int(11) DEFAULT NULL COMMENT '年龄',`skill` varchar(32) DEFAULT NULL COMMENT '技能',`evaluate` varchar(64) DEFAULT NULL COMMENT '评价',`fraction` bigint(11) DEFAULT NULL COMMENT '分数',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';INSERT INTO `mp_user` VALUES (1, '小明', 20, '画画', '该学生在画画方面有一定天赋', 89);
INSERT INTO `mp_user` VALUES (2, '小兰', 19, '游戏', '近期该学生由于游戏的原因导致分数降低了', 64);
INSERT INTO `mp_user` VALUES (3, '张张', 18, '英语', '近期该学生参加英语比赛获得二等奖', 90);
INSERT INTO `mp_user` VALUES (4, '大黄', 20, '体育', '该学生近期由于参加篮球比赛,导致脚伤', 76);
INSERT INTO `mp_user` VALUES (5, '大白', 17, '绘画', '该学生参加美术大赛获得三等奖', 77);
INSERT INTO `mp_user` VALUES (7, '小龙', 18, 'JAVA', '该学生是一个在改BUG的码农', 59);
INSERT INTO `mp_user` VALUES (9, 'Sans', 18, '睡觉', 'Sans是一个爱睡觉,并且身材较矮骨骼巨大的骷髅小胖子', 60);
INSERT INTO `mp_user` VALUES (10, 'papyrus', 18, 'JAVA', '个性张扬的骷髅,给人自信、有魅力的骷髅小瘦子', 58);
INSERT INTO `mp_user` VALUES (11, '小红', 12, '画肖像', '小红是一个很红的女孩', 61);
INSERT INTO `mp_user` VALUES (12, 'Tom', 7, '理发', '全世界的理发师统称为tom老师', 61);
INSERT INTO `mp_user` VALUES (13, '小黑', 3, NULL, NULL, 61);
INSERT INTO `mp_user` VALUES (14, '楚子航', 24, '君焰', '杀胚一个', 99);
INSERT INTO `mp_user` VALUES (15, '路明非', 6, '自爆', '废材一个', 60);

使用mybatis-plus代码生成插件生成代码

在测试包新建CodeGenerator.java类
代码如下

package com.wlf.demo;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*** @author wan Email-wlf18726994755@163.com* @version 1.0* @className CodeGenerator* @date 2020/6/5 9:35**/public class CodeGenerator {/*** <p>* 读取控制台内容* </p>*/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("无良芳");gc.setOpen(false);//这里可以设置为false,是一个api工具类gc.setSwagger2(true); //实体属性 Swagger2 注解mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mp_test?serverTimezone=GMT%2B8");// dsc.setSchemaName("public");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("你的数据库密码");mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setModuleName(scanner("模块名"));//这里需要填上自己的项目包路径。pc.setParent("com.wlf.demo");mpg.setPackageInfo(pc);// 自定义配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};// 如果模板引擎是 freemarkerString templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocity
//         String templatePath = "/templates/mapper.xml.vm";// 自定义输出配置List<FileOutConfig> focList = new ArrayList<>();// 自定义配置会被优先输出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
//                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
//                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});/*cfg.setFileCreate(new IFileCreate() {@Overridepublic boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {// 判断自定义文件夹是否需要创建checkDir("调用默认方法创建的目录,自定义目录用");if (fileType == FileType.MAPPER) {// 已经生成 mapper 文件判断存在,不想重新生成返回 falsereturn !new File(filePath).exists();}// 允许生成模板文件return true;}});*/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("你自己的父类实体,没有就不用设置!");strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);// 公共父类
//        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");// 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");//去除表名的前缀strategy.setTablePrefix("mp_");mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();}
}

直接运行此类,提示输入模块名就是新的包名,作者在这里输入的是
mp,然后提示你输入表名,按规定输入表名回车,即可生成代码。
项目结构图
这里我说一下项目结构,和以前的ssm项目结构差不多,
config 一些配置类。
controller 控制层,接受处理请求
entity 实体类,没啥好说的。
mapper dao层,数据库连接层
service 服务层 处理一些复杂的服务,一般来说,不建议在控制层里写过多的代码。控制层只用来发送和接受数据,对数据的处理业务统统放在service层。

配置分页插件

项目下新建config包,在此包下新建MybatisPlusConfig.java类
详细代码如下

@Configuration
public class MybatisPlusConfig {/*** 分页插件*/@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}
}

启动类加扫描dao注解

@SpringBootApplication
@MapperScan("com.wlf.demo.mp.mapper") //扫描dao
public class SpringbootMybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisPlusApplication.class, args);}}

到这里环境搭建已经完成。

mabatis-plus 基础演示

到这里我们可以看一看生成的代码service的实现类里面没有任何代码,MyBatis-Plus官方封装了许多基本CRUD的方法,可以直接使用大量节约时间,MP共通方法详见IService,ServiceImpl,BaseMapper源码,写入操作在ServiceImpl中已有事务绑定,这里我们列举一下常用的方法演示。
原本是打算写一个前端页面更直观的进行测试,算了算了,用插件测试测试得了

@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate IUserService iUserService;/*** 根据用户id获取用户信息* @param id 用户id* @return User 用户实体*/@GetMapping("/getUser")public User getUser(@RequestParam("id") Integer id){return iUserService.getById(id);}/*** 查询全部信息* @return 返回用户实体类集合*/@GetMapping("/getList")public List<User> getList(){return iUserService.list();}/*** 分页查询全部数据* 这里只做演示,不写前端* @return IPage<User> 分页数据*/@GetMapping("/getUserListPage")public IPage<User> getUserListPage(){IPage<User> page = new Page<>();//当前页page.setCurrent(4);//每页条数page.setSize(2);return iUserService.page(page);}/*** 根据指定字段查询用户信息集合* @Return Collection<User> 用户实体集合*/@GetMapping("/getListMap")public Collection<User> getListMap(){Map<String,Object> map = new HashMap<>();//kay是字段名 value是字段值map.put("age",20);return iUserService.listByMap(map);}/*** 新增用户信息*/@GetMapping("/saveUser")public void saveUser(){User userInfoEntity = new User();userInfoEntity.setName("陈墨瞳");userInfoEntity.setSkill("侧写");userInfoEntity.setAge(18);userInfoEntity.setFraction(99L);userInfoEntity.setEvaluate("无言灵,长得漂亮");iUserService.save(userInfoEntity);}/*** 批量新增用户信息*/@RequestMapping("/saveUserList")public void saveUserList(){//创建对象User sans = new User();sans.setName("芬格尔");sans.setSkill("睡觉");sans.setAge(18);sans.setFraction(60L);sans.setEvaluate("芬格尔是一个爱睡觉,并且身手十分了的");User papyrus = new User();papyrus.setName("零");papyrus.setSkill("镜瞳");papyrus.setAge(18);papyrus.setFraction(99L);papyrus.setEvaluate("高冷女王");//批量保存List<User> list =new ArrayList<>();list.add(sans);list.add(papyrus);iUserService.saveBatch(list);}/*** 更新用户信息*/@RequestMapping("/updateUser")public void updateUser(){//根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件User userInfoEntity = new User();userInfoEntity.setId(1L);userInfoEntity.setAge(19);iUserService.updateById(userInfoEntity);}/*** 新增或者更新用户信息*/@RequestMapping("/saveOrUpdateUser")public void saveOrUpdate(){//传入的实体类userInfoEntity中ID为null就会新增(ID自增)//实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增User userInfoEntity = new User();userInfoEntity.setId(1L);userInfoEntity.setAge(20);iUserService.saveOrUpdate(userInfoEntity);}/*** 根据ID删除用户信息*/@RequestMapping("/deleteUser")public void deleteInfo(String id){iUserService.removeById(id);}/*** 根据ID批量删除用户信息*/@RequestMapping("/deleteUserList")public void deleteInfoList(){List<String> userIdlist = new ArrayList<>();userIdlist.add("12");userIdlist.add("13");iUserService.removeByIds(userIdlist);}/*** 根据指定字段删除用户信息*/@RequestMapping("/deleteUserMap")public void deleteInfoMap(){//kay是字段名 value是字段值Map<String,Object> map = new HashMap<>();map.put("skill","删除");map.put("fraction",10L);iUserService.removeByMap(map);}}

这里推荐一个idea的插件,用来调试api十分方便
安装好后就可以愉快的测试api接口了。

mybatis-plus的条件构造器

当查询条件复杂的时候,我们可以使用MP的条件构造器,请参考下面的QueryWrapper条件参数说明。

查询方式 方法说明 实例
eq 等价于等于 eq(“name”, “老王”)—>name = ‘老王’
allEq 全部eq(或个别isNull) allEq({id:1,name:“老王”,age:null}, false)—>id = 1 and name = ‘老王’
ne 不等于<> ne(“name”, “老王”)—>name <> ‘老王’
gt 大于 > gt(“age”, 18)—>age > 18
ge 大于等于 >= ge(“age”, 18)—>age >= 18
lt 小于 < lt(“age”, 18)—>age < 18
le 小于等于 <= le(“age”, 18)—>age <= 18
between BETWEEN 值1 AND 值2 between(“age”, 18, 30)—>age between 18 and 30
notBetween NOT BETWEEN 值1 AND 值2 notBetween(“age”, 18, 30)—>age not between 18 and 30
like LIKE ‘%值%’ like(“name”, “王”)—>name like ‘%王%’
notLike NOT LIKE ‘%值%’ notLike(“name”, “王”)—>name not like ‘%王%’
likeLeft LIKE ‘%值’ likeLeft(“name”, “王”)—>name like ‘%王’
likeRight LIKE ‘值%’ likeRight(“name”, “王”)—>name like ‘王%’
isNull 字段 IS NULL isNull(“name”)—>name is null
isNotNull 字段 IS NOT NULL isNotNull(“name”)—>name is not null
in 字段 IN (value.get(0), value.get(1), …)
字段 IN (v0, v1, …)
in(“age”,{1,2,3})—>age in (1,2,3)
in(“age”, 1, 2, 3)—>age in (1,2,3)
notIn 字段 NOT IN (value.get(0), value.get(1), …)
字段 NOT IN (v0, v1, …)
notIn(“age”,{1,2,3})—>age not in (1,2,3)
notIn(“age”, 1, 2, 3)—>age not in (1,2,3)
inSql 字段 IN ( sql语句 ) inSql(“age”, “1,2,3,4,5,6”)—>age in (1,2,3,4,5,6)
inSql(“id”, “select id from table where id < 3”)—>id in (select id from table where id < 3)
notInSql 字段 NOT IN ( sql语句 ) notInSql(“age”, “1,2,3,4,5,6”)—>age not in (1,2,3,4,5,6)
notInSql(“id”, “select id from table where id < 3”)—>id not in (select id from table where id < 3)
groupBy 分组:GROUP BY 字段, … groupBy(“id”, “name”)—>group by id,name
orderByAsc 排序:ORDER BY 字段, … ASC orderByAsc(“id”, “name”)—>order by id ASC,name ASC
orderByDesc 排序:ORDER BY 字段, … DESC orderByDesc(“id”, “name”)—>order by id DESC,name DESC
orderBy 排序:ORDER BY 字段, … orderBy(true, true, “id”, “name”)—>order by id ASC,name ASC
having HAVING ( sql语句 ) having(“sum(age) > 10”)—>having sum(age) > 10

having(“sum(age) > {0}”, 11)—>having sum(age) > 11
or 拼接 OR eq(“id”,1).or().eq(“name”,“老王”)—>id = 1 or name = ‘老王’
or OR 嵌套 or(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>or (name = ‘李白’ and status <> ‘活着’)
and AND 嵌套 and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>and (name = ‘李白’ and status <> ‘活着’)
nested 正常嵌套 不带 AND 或者 OR nested(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>(name = ‘李白’ and status <> ‘活着’)

下面演示了一些常见的实例,有一说一,就是一个字,香!!!
在controller包下新建一个UserPlusController类,代码如下,

@RestController
@RequestMapping("/userPlus")
public class UserPlusController {@Resourceprivate IUserService iUserService;@GetMapping("/getUserListPage")public Map<String,Object> getUserListPage(){Map<String, Object> map = new HashMap<>();//查询成绩高于80的用户QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.lambda().gt(User::getFraction,80);List<User> list = iUserService.list(wrapper);map.put("userfraction",list);//查询年龄大于5岁,小于等于15岁的同学QueryWrapper<User> wrapper1 = new QueryWrapper<>();wrapper1.lambda().gt(User::getAge,5);wrapper1.lambda().le(User::getAge,15);List<User> list1 = iUserService.list(wrapper1);map.put("userAge5~15",list1);//模糊查询技能字段带有画的数据,并且按照年龄降序QueryWrapper<User> wrapper2 = new QueryWrapper<>();wrapper2.lambda().like(User::getSkill,"画");wrapper2.lambda().orderByDesc(User::getAge);List<User> list2 = iUserService.list(wrapper2);map.put("UserAgeSkill", list2);//模糊查询名字带有"小"或者年龄大于18的学生QueryWrapper<User> wrapper3 = new QueryWrapper<>();wrapper3.lambda().like(User::getName,"小");wrapper3.lambda().or().gt(User::getAge,18);List<User> list3 = iUserService.list(wrapper3);map.put("userOr",list3);//查询评价不为null的学生,并分页IPage<User> page = new Page<>();page.setCurrent(1);page.setSize(5);QueryWrapper<User> wrapper4 = new QueryWrapper<>();wrapper4.lambda().isNotNull(User::getEvaluate);page =  iUserService.page(page,wrapper4);map.put("userPage",page);return map;}
}

自定义sql语句

你认为mp的条件构造器这么香了还需要自己写sql语句嘛,好吧,有些时候确实需要。介绍一下自定义sql语句,没啥难的,和以前没有mp一样,自己添加dao层接口,在mapper.xml里面写sql语句,就这还没完,mp对于自定义sql语句还有优化。香就完事了。没啥好说的看一张图吧。

回归正题。需求查询分数大于80的学生信息,并分页。
第一步,编写mapper.xml语句,看看这简洁分页查询语句,直接看语句你甚至都感觉不到这个语句竟然可以做到分页查询。这和普通的查询没什么区别嘛。

<select id="selectUserByFraction" resultType="com.wlf.demo.mp.entity.User" parameterType="long">select * from mp_user where  fraction > #{fraction}</select>

第二步,编写dao层代码,我直接贴代码

/*** 查询大于该分数的学生,并分页* @param page 分页参数* @param fraction 分数* @return 分页数据*/IPage<User> selectUserByFraction(IPage<User> page,Long fraction);

这里再给大家推荐一个插件。
装上之后dao层代码会有提示点击直接跳转到mapper文件中,也可以直接生成mapper标签。香!!!
如图点击那个小鸟会有神奇的事情发生。
第三步,给service接口添加方法

 /*** 查询大于该分数的学生,并分页* @param page 分页参数* @param fraction 分数* @return 分页数据*/IPage<User> selectUserByFraction(IPage<User> page, Long fraction);

再实现方法。

 @Overridepublic IPage<User> selectUserByFraction(IPage<User> page, Long fraction) {return this.baseMapper.selectUserByFraction(page,fraction);}

最后我们controller测试一下,新建UserCustomController类

@RestController
@RequestMapping("/userCustom")
public class UserCustomController {@Resourceprivate IUserService iUserService;/*** 查询分数大于80* @return 分页数据*/@GetMapping("/getUserListSql")public IPage<User> getUserListSql() {IPage<User> page = new Page<>();page.setCurrent(1);page.setSize(2);return iUserService.selectUserByFraction(page, 80L);}}

到这里文章也基本结束了。好的。
原本想弄个前端界面的,嗨,谁说前端简单我锤谁。
有什么问题可以评论区告诉我呦
项目源码点击这里

springboot2.3整合mybatis-plus3.3.2较为详细的教程相关推荐

  1. SpringBoot2.0应用(五):SpringBoot2.0整合MyBatis

    如何整合MyBatis 1.pom依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><arti ...

  2. 【夏目鬼鬼分享】SpringBoot2.0整合mybatis

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  3. SpringBoot2.0之四 简单整合MyBatis

    从最开始的SSH(Struts+Spring+Hibernate),到后来的SMM(SpringMVC+Spring+MyBatis),到目前的S(SpringBoot),随着框架的不断更新换代,也为 ...

  4. 使用Druid数据库连接池整合MyBatis Plus时,出现Error attempting to get column 'startTime' from result set. 类似错误

    问题描述: 使用Druid数据库连接池整合MyBatis Plus3.2.0时,出现Error attempting to get column 'startTime' from result set ...

  5. springboot2整合mysql5_SpringBoot2.X (二十五):SpringBoot整合 Mybatis + MySQL CURD 示例

    话不多数,直接开始撸代码- 工程结构图 开始之前先放张工程结构图 1.maven 依赖: org.springframework.boot spring-boot-starter-web org.my ...

  6. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  7. SpringBoot2.x【四】自动化生成代码整合Mybatis

    SpringBoot2.x[四]自动化生成代码整合Mybatis Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以简易理解为中介,相对于它,还有个中介是hibernate, ...

  8. java mybatis狂神说sql_狂神说SpringBoot09:整合MyBatis

    狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习.未经作者授权,禁止转载 整合MyBatis 官方文档:http://mybatis. ...

  9. mysql8.0用mybatis哪个版本_SpringBoot整合MyBatis与MySql8.0

    一.前言 之前已经有一篇文章讨论过SpringBoot整合MyBatis,因而此篇不在重复累赘,本文主要是最新版的SpringBoot2.0与MyBatis.最新MySQL8.0整合过程中遇到的问题进 ...

最新文章

  1. linux ubuntu安装 mono,在Ubuntu 18.04系统中安装Mono及基本使用Mono的方法
  2. UVA11646 Athletics Track(计算几何、弧长公式)
  3. 怎样知道邮箱的端口_AllenNLP源码拓展——训练结束向邮箱发邮件
  4. Eclipse+MyEclipse+Tomcat平台搭建步骤
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1056:点和正方形的关系
  6. 信息掩码游戏地图掩码相关(msk)
  7. w ndows7浏览器网页,win7系统IE浏览器播放网页视频失败的解决方法
  8. MSSQL的表备份成INSERT脚本的存储过程
  9. 如何在MSWord中加入MSAgent
  10. 编码原则1-单一职责原则
  11. Google浏览器Chrome,永久开启flash支持的办法
  12. 计算机专业的英文简历范文带翻译,英文个人简历带翻译【英文简历范文带翻译】...
  13. [iOS开发]weak底层原理
  14. Linux常用命令之CUT
  15. Easy Excel
  16. intel realsense 深度相机深度图像处理API总结
  17. JavaScript基础——JS编译器你都做了啥?
  18. 平安好医生发布半年报,“关键先生”方蔚豪寻求变阵|看财报
  19. 微信端跳转外部浏览器进行apk文件下载的实现原理及源码
  20. arp截取web图片与账号密码

热门文章

  1. dango models and database ---- verbose name
  2. 云计算学习网站都有哪些?学习云计算的方法
  3. Python爬虫实战(2)之爬取NBA球队各个球员头像图片
  4. #Javascript基础
  5. 华为q1设置虚拟服务器,华为路由Q1的上网设置教程
  6. Tolua for Unity3d 编译字节码
  7. S型加减速程序,C++,PLC,AGV
  8. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
  9. 解决gitlab-runner一直处于等待中
  10. SubShader中的LOD