栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring boot整合mybatis+mybatis-plus的示例代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring boot整合mybatis+mybatis-plus的示例代码

Spring boot对于我来说是一个刚接触的新东西,学习过程中,发现这东西还是很容易上手的,Spring boot没配置时会默认使用Spring data jpa,这东西可以说一个极简洁的工具,可是我还是比较喜欢用mybatis,工具是没有最好的,只有这合适自己的。

说到mybatis,最近有一个很好用的工具--------mybatis-Plus(官网),现在更新的版本是2.1.2,这里使用的也是这个版本。我比较喜欢的功能是代码生成器,条件构造器,这样就可以更容易的去开发了。

mybatisPlus官网上是有Spring boot整个的例子的,我也跟着它走了一篇,结果,程序没跑起来,后来才知道demo用的H2 database,和mysql根本不是同一样东西,所以各位想要整合mybatisPlus,可以不看官网的,可以少走弯路。

下面就是整合的过程

1、首先要把需要的jar文件都弄过来,pom.xml需要的东西如下

pom.xml(不完整)



  com.baomidou
  mybatisplus-spring-boot-starter
  1.0.4


  com.baomidou
  mybatis-plus
  2.1.2


  org.springframework.boot
  spring-boot-starter-jdbc





  com.alibaba
  druid
  1.1.3



  mysql
  mysql-connector-java
  runtime


  org.mybatis.spring.boot
  mybatis-spring-boot-starter
  1.3.1

2、添加mybatis相关的配置,如账号、密码等。这里我使用了application.yml来配。

application.yml

server:
  port: 8080

#spring
spring:
 devtools:
  restart:
   enabled: true   #这里是为了热部署的,与mybatis是无关的

 #DATAbase ConFIG
 datasource:
  driver-class-name: com.mysql.jdbc.Driver
  username: root
  password: root
  url: jdbc:mysql://mysqldb:3306/tdx_shop?useUnicode=true&characterEncoding=utf-8
  type: com.alibaba.druid.pool.DruidDataSource  #这里是配置druid连接池,以下都是druid的配置信息
  filters: stat,wall,log4j
  maxActive: 20
  initialSize: 1
  maxWait: 60000
  minIdle: 1
  timeBetweenEvictionRunsMillis: 60000
  minEvictableIdleTimeMillis: 300000
  validationQuery: select 'x'
  testWhileIdle: true
  testOnBorrow: false
  testOnReturn: false
  poolPreparedStatements: true
  maxOpenPreparedStatements: 20
  connection-properties: druid.stat.merggSql=ture;druid.stat.slowSqlMillis=5000

#mybatis
mybatis:
 mapper-locations: classpath*:/mapper
@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
public class MybatisPlusConfig {
  @Autowired
  private Environment environment;
  private RelaxedPropertyResolver propertyResolver;
  @Autowired
  private DataSource dataSource;
  @Autowired
  private MybatisProperties properties;
  @Autowired
  private ResourceLoader resourceLoader = new DefaultResourceLoader();
  @Autowired(required = false)
  private Interceptor[] interceptors;
  @Autowired(required = false)
  private DatabaseIdProvider databaseIdProvider;

  
  @Bean
  public PerformanceInterceptor performanceInterceptor() {
    return new PerformanceInterceptor();
  }

  
  @Bean
  public DataSource druidDataSource() throws SQLException {
    this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource.");

    System.out.println("====================注入druid!====================");
    DruidDataSource datasource = new DruidDataSource();
    datasource.setUrl(propertyResolver.getProperty("url"));
    datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name"));
    datasource.setUsername(propertyResolver.getProperty("username"));
    datasource.setPassword(propertyResolver.getProperty("password"));
    datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initial-size")));
    datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("min-idle")));
    datasource.setMaxWait(Long.valueOf(propertyResolver.getProperty("max-wait")));
    datasource.setMaxActive(Integer.valueOf(propertyResolver.getProperty("max-active")));
    datasource.setMinEvictableIdleTimeMillis(Long.valueOf(propertyResolver.getProperty("min-evictable-idle-time-millis")));
    try {
      datasource.setFilters(propertyResolver.getProperty("filters"));
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return datasource;
  }

  
  @Bean
  public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor page = new PaginationInterceptor();
    page.setDialectType("mysql");
    return page;
  }

  
  @Bean
  public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {
    MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
    mybatisPlus.setDataSource(dataSource);
    mybatisPlus.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
      mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
    mybatisPlus.setConfiguration(properties.getConfiguration());
    if (!ObjectUtils.isEmpty(this.interceptors)) {
      mybatisPlus.setPlugins(this.interceptors);
    }
    // MP 全局配置,更多内容进入类看注释
    GlobalConfiguration globalConfig = new GlobalConfiguration();
    globalConfig.setDbType(DBType.MYSQL.name());
    // ID 策略 AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID")
    globalConfig.setIdType(2);
    mybatisPlus.setGlobalConfig(globalConfig);
    MybatisConfiguration mc = new MybatisConfiguration();
    mc.setDefaultscriptingLanguage(MybatisXMLLanguageDriver.class);
    mybatisPlus.setConfiguration(mc);
    if (this.databaseIdProvider != null) {
      mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);
    }
    if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
      mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
    }
    if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
      mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
    }
    if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
      mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());
    }
    return mybatisPlus;
  }

  
  @Bean
  public ServletRegistrationBean DruidStatViewServle(){
    //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid
  @Bean
  public FilterRegistrationBean druidStatFilter(){
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
    //添加过滤规则.
    filterRegistrationBean.addUrlPatterns("
package com.tdx.account_service.generator;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;


public class MysqlGenerator {
  private static String packageName="account_service";  //文件路径
  private static String authorName="Liang.Guangqing";   //作者
  private static String table="sc_user";  //table名字
  private static String prefix="sc_";    //table前缀
  private static File file = new File(packageName);
  private static String path = file.getAbsolutePath();
  public static void main(String[] args) {
    // 自定义需要填充的字段
    List tableFillList = new ArrayList<>();
    tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));
    // 代码生成器
    AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
 // 全局配置
 new GlobalConfig()
     .setOutputDir(path+"/src/main/java")//输出目录
     .setFileOverride(true)// 是否覆盖文件
     .setActiveRecord(true)// 开启 activeRecord 模式
     .setEnableCache(false)// XML 二级缓存
     .setbaseResultMap(true)// XML ResultMap
     .setbaseColumnList(true)// XML columList
     .setOpen(false)//生成后打开文件夹
     .setAuthor(authorName)
 // 自定义文件命名,注意 %s 会自动填充表实体属性!
  .setMapperName("%sMapper")
  .setXmlName("%sMapper")
  .setServiceName("%sService")
  .setServiceImplName("%sServiceImpl")
  .setControllerName("%sController")
    ).setDataSource(
 // 数据源配置
 new DataSourceConfig()
     .setDbType(DbType.MYSQL)// 数据库类型
     .setTypeConvert(new MySqlTypeConvert() {
// 自定义数据库表字段类型转换【可选】
@Override
public DbColumnType processTypeConvert(String fieldType) {
  System.out.println("转换类型:" + fieldType);
  // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
  //  return DbColumnType.BOOLEAN;
  // }
  return super.processTypeConvert(fieldType);
}
     })
     .setDriverName("com.mysql.jdbc.Driver")
     .setUsername("root")
     .setPassword("root")
     .setUrl("jdbc:mysql://127.0.0.1:3306/tdx_shop?characterEncoding=utf8")
    ).setStrategy(
 // 策略配置
 new StrategyConfig()
     // .setCapitalMode(true)// 全局大写命名
     //.setDbColumnUnderline(true)//全局下划线命名
     .setTablePrefix(new String[]{prefix})// 此处可以修改为您的表前缀
     .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
     .setInclude(new String[] { table }) // 需要生成的表
     .setRestControllerStyle(true)
     //.setExclude(new String[]{"test"}) // 排除生成的表
     // 自定义实体父类
     // .setSuperEntityClass("com.baomidou.demo.TestEntity")
     // 自定义实体,公共字段
     //.setSuperEntityColumns(new String[]{"test_id"})
     .setTableFillList(tableFillList)
 // 自定义 mapper 父类
 // .setSuperMapperClass("com.baomidou.demo.TestMapper")
 // 自定义 service 父类
 // .setSuperServiceClass("com.baomidou.demo.TestService")
 // 自定义 service 实现类父类
 // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
 // 自定义 controller 父类
 .setSuperControllerClass("com.tdx."+packageName+".controller.AbstractController")
 // 【实体】是否生成字段常量(默认 false)
 // public static final String ID = "test_id";
 // .setEntityColumnConstant(true)
 // 【实体】是否为构建者模型(默认 false)
 // public User setName(String name) {this.name = name; return this;}
 // .setEntityBuilderModel(true)
 // 【实体】是否为lombok模型(默认 false)document
 // .setEntityLombokModel(true)
 // Boolean类型字段是否移除is前缀处理
 // .setEntityBooleanColumnRemoveIsPrefix(true)
 // .setRestControllerStyle(true)
 // .setControllerMappingHyphenStyle(true)
    ).setPackageInfo(
 // 包配置
 new PackageConfig()
     //.setModuleName("User")
     .setParent("com.tdx."+packageName)// 自定义包路径
     .setController("controller")// 这里是控制器包名,默认 web
     .setEntity("entity")
     .setMapper("dao")
     .setService("service")
     .setServiceImpl("service.impl")
     //.setXml("mapper")
    ).setCfg(
 // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
 new InjectionConfig() {
   @Override
   public void initMap() {
     Map map = new HashMap<>();
     map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
     this.setMap(map);
   }
 }.setFileOutConfigList(Collections.singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
   // 自定义输出文件目录
   @Override
   public String outputFile(TableInfo tableInfo) {
     return path+"/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
   }
 }))
    ).setTemplate(
 // 关闭默认 xml 生成,调整生成 至 根目录
 new TemplateConfig().setXml(null)
 // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
 // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
 // .setController("...");
 // .setEntity("...");
 // .setMapper("...");
 // .setXml("...");
 // .setService("...");
 // .setServiceImpl("...");
    );

    // 执行生成
    mpg.execute();

    // 打印注入设置,这里演示模板里面怎么获取注入内容【可无】
    System.err.println(mpg.getCfg().getMap().get("abc"));
  }
}

文件中修改的内容还是很多的,最主要的还是mysql的连接信息,没理由你账号,密码都错了还能连得上吧,其次设置一下你生成的模板文件路径,我这里生成的路径在上面图可以看得到,是在com.tdx.account_service下的,注意,xml文件要放在resources下,不然是识别的,说找不到这个方法

按照官网的代码模板生成的文件基本是白白的,主要是mybatis-Plus集成了公共方法,很多常用的工具都可以引用了。在这里我提供一下我修改后Controller.java.vm文件,主要还是按照我自己的习惯去弄的

controller.java.vm

package ${package.Controller};
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.common.DatatablesJSON;
import ${package.Entity}.common.JSONResult;
import ${package.Entity}.${entity};
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end
  private final Logger logger = LoggerFactory.getLogger(${table.controllerName}.class);
  @Autowired
  public ${table.serviceName} ${table.entityPath}Service;

  
  @RequestMapping(value = "/get${entity}List",method = RequestMethod.POST)
  public Object get${entity}List(${entity} param , @RequestParam(value = "draw",defaultValue = "0") Integer draw,
      @RequestParam(value = "length") Integer length,
      @RequestParam(value = "start") Integer start) {
      DatatablesJSON<${entity}> resJson=new DatatablesJSON<>();
      try {
 Integer pageNo=getPageNo(start,length);
 Page<${entity}> page=new Page<${entity}>(pageNo,length);
 ${table.entityPath}Service.selectPage(page,new EntityWrapper<${entity}>(param));
 resJson.setDraw(draw++);
 resJson.setRecordsTotal(page.getTotal());
 resJson.setRecordsFiltered(page.getTotal());
 resJson.setData(page.getRecords());
 resJson.setSuccess(true);
      }catch (Exception e){
 resJson.setSuccess(false);
 resJson.setError("异常信息:{"+e.getClass().getName()+"}");
 logger.info("异常信息:{}"+e.getMessage());
      }
      return resJson;
  }

  
  @RequestMapping(value = "/get${entity}ById",method = RequestMethod.GET)
  public Object get${entity}ById(String id) {
      JSONResult<${entity}> resJson = new JSONResult<>();
      try {
 ${entity} param= ${table.entityPath}Service.selectById(id);
 resJson.setData(param);
 resJson.setSuccess(true);
      }catch (Exception e) {
 resJson.setSuccess(false);
 resJson.setMessage("异常信息:{"+e.getClass().getName()+"}");
 logger.info("异常信息:{}"+e.getMessage());
      }
      return resJson;
  }

  
  @RequestMapping(value = "/delete${entity}ById",method = RequestMethod.GET)
  public Object delete${entity}ById(String id) {
      JSONResult<${entity}> resJson = new JSONResult<>();
      try{
 resJson.setSuccess(${table.entityPath}Service.deleteById(id));
      }catch (Exception e) {
 resJson.setSuccess(false);
 resJson.setMessage("异常信息:{"+e.getClass().getName()+"}");
 logger.info("异常信息:{}"+e.getMessage());
      }
      return resJson;
  }

  
  @RequestMapping(value = "/update${entity}ById",method = RequestMethod.POST)
  public Object update${entity}ById(${entity} param) {
      JSONResult<${entity}> resJson = new JSONResult<>();
      try{
 resJson.setSuccess(${table.entityPath}Service.updateById(param));
      }catch (Exception e) {
 resJson.setSuccess(false);
 resJson.setMessage("异常信息:{"+e.getClass().getName()+"}");
 logger.info("异常信息:{}"+e.getMessage());
      }
      return resJson;
  }

  
  @RequestMapping(value = "/add${entity}",method = RequestMethod.POST)
  public Object add${entity}(${entity} param) {
      JSONResult<${entity}> resJson = new JSONResult<>();
      try{
 resJson.setSuccess(${table.entityPath}Service.insert(param));
      }catch (Exception e) {
 resJson.setSuccess(false);
 resJson.setMessage("异常信息:{"+e.getClass().getName()+"}");
 logger.info("异常信息:{}"+e.getMessage());
      }
      return resJson;
  }
}

除了这个文件,其他代码模板我都是按照官网那样的,这里引用3个外部的文件,有AbstractController.java(控制器基类)、DatatablesJSON.java和JSONResult.java,然后这些文件又引用了其他文件,我懵逼了,怎么文件这么多啊,看来如果全部都贴上来得多占地方啊,所以我选择相信码云,如果需要请在码云上按照少的文件下载,码云地址。需要注意的是,我的模板是直接代替了mybatis-plus.jar中的templates目录。

最后就到了测试过程

下面的代码段都是放在Controller文件里面,然后启动程序,对应端口,请求方法。测试的话是需要按照自己的实体类操作的,所以仅供参考。

  
  @GetMapping("/test")
  public Page test() {
    return userService.selectPage(new Page(0, 12));
  }

  
  @GetMapping("/test1")
  public Page test1() {
    User user = new User();
    System.err.println("删除所有:" + user.delete(null));
    //user.setId(2017091801L);
    user.setAccout("test"+num++);
    user.setType("test");
    user.setCreateTime(new Date());
    user.setPhone("13111110000");
    user.setPassword("123456");
    user.setNickname("guangqing"+2*num++);
    user.insert();
    System.err.println("查询插入结果:" + user.selectById().toString());
    //user.setNickname("mybatis-plus-ar");
    System.err.println("更新:" + user.updateById());
    return user.selectPage(new Page(0, 12), null);
  }

  
  @GetMapping("/test2")
  public User test2() {
    User user = new User();
    user.setId(123456L);
    user.setAccout("test");
    user.setType("test");
    user.setCreateTime(new Date());
    user.setPhone("13111110000");
    user.setPassword("123456");
    user.setNickname("guangqing");
    System.err.println("删除一条数据:" + userService.deleteById(1L));
    System.err.println("插入一条数据:" + userService.insert(user));
    User user2 = new User();
    user.setId(223456L);
    user.setAccout("test2");
    user.setType("test");
    user.setCreateTime(new Date());
    user.setPhone("13111110000");
    user.setPassword("123456");
    user.setNickname("guangqing");
    boolean result = userService.insert(user);
    // 自动回写的ID
    Long id = user.getId();
    System.err.println("插入一条数据:" + result + ", 插入信息:" + user.toString());
    System.err.println("查询:" + userService.selectById(id).toString());
    Page userListPage = userService.selectPage(new Page(1, 5), new EntityWrapper<>(new User()));
    System.err.println("total=" + userListPage.getTotal() + ", current list size=" + userListPage.getRecords().size());
    return userService.selectById(1L);
  }

  @GetMapping("testSelect")
  public Object testSelect() {
    Integer start = 0;
    Integer length =10;
    User param = new User();
    //param.setNickname("guangqing2");
    Integer pageNo=getPageNo(start,length);
    Page page =new Page(pageNo,length);
    EntityWrapper ew = new EntityWrapper();
    ew.setEntity(param);
    ew.where("password={0}","123456")
 .like("nickname","guangqing")
 .ge("create_time","2017-09-21 15:50:00");
    userService.selectPage(page, ew);
    DatatablesJSON resJson= new DatatablesJSON<>();
    //resJson.setDraw(draw++);
    resJson.setRecordsTotal(page.getTotal());
    resJson.setRecordsFiltered(page.getTotal());
    resJson.setData(page.getRecords());
    return resJson;
  }


  @GetMapping("/selectsql")
  public Object getUserBySql() {
    JSonObject result = new JSonObject();
    result.put("records", userService.selectListBySQL());
    return result;
  }

  

  // 参数模式分页
  @GetMapping("/page")
  public Object page(Page page) {
    return userService.selectPage(page);
  }

  // ThreadLocal 模式分页
  @GetMapping("/pagehelper")
  public Object pagehelper(Page page) {
    PageHelper.setPagination(page);
    page.setRecords(userService.selectList(null));
    page.setTotal(PageHelper.freeTotal());//获取总数并释放资源 也可以 PageHelper.getTotal()
    return page;
  }


  
  @Transactional
  @GetMapping("/test_transactional")
  public void testTransactional() {
    //userService.insert(new User(1000L, "测试事物", 16, 3));
    System.out.println(" 这里手动抛出异常,自动回滚数据");
    throw new RuntimeException();
  }

这么多的测试,我觉得最有趣的是条件构造器,在官网上有更齐全的,而我这里是按照我自己的需求写的。

最后谢谢大家的观看,写博客经验不足,写得不好请见谅,如果能给你带来帮助请点个赞,若遇到不明白的,或者我有写错的地方请提出,谢谢!也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/141837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号