Spring boot对于我来说是一个刚接触的新东西,学习过程中,发现这东西还是很容易上手的,Spring boot没配置时会默认使用Spring data jpa,这东西可以说一个极简洁的工具,可是我还是比较喜欢用mybatis,工具是没有最好的,只有这合适自己的。
发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及成都茶艺设计等,在网站建设公司、全网营销推广、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。
说到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/**Mapper.xml #把xml文件放在com.XX.mapper.*中可能会出现找到的问题,这里把他放在resource下的mapper中 #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.tdx.account_service.entity #这里是实体类的位置 configuration: map-underscore-to-camel-case: true cache-enabled: false #logging logging: level: warn
配置的东西和我们以前用mybatis配置可以说差不多,但spring boot是没有xml配置文件的。注意一下红字的内容,基本没问题了。
3、mybatis-Plus配置文件------MybatisPlusConfig,首先上图说明一下文件路径。其中MybatisPlusConfig是放在config文件夹内,而xml文件是放在resouces下mapper中。

接着就是MybatisPlusConfig内容部分了
MybatisProperties.java
package com.tdx.account_service.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.baomidou.mybatisplus.MybatisConfiguration;
import com.baomidou.mybatisplus.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.entity.GlobalConfiguration;
import com.baomidou.mybatisplus.enums.DBType;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.plugins.parser.ISqlParser;
import com.baomidou.mybatisplus.plugins.parser.ISqlParserFilter;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS;
import com.baomidou.mybatisplus.toolkit.PluginUtils;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* code is far away from bug with the animal protecting
* ┏┓ ┏┓
* ┏┛┻━━━┛┻┓
* ┃ ┃
* ┃ ━ ┃
* ┃ ┳┛ ┗┳ ┃
* ┃ ┃
* ┃ ┻ ┃
* ┃ ┃
* ┗━┓ ┏━┛
* ┃ ┃神兽保佑
* ┃ ┃代码无BUG!
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*
*
* @Description : MybatisPlus配置
* ---------------------------------
* @Author : Liang.Guangqing
* @Date : Create in 2017/9/19 13:54
*/
@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;
/**
* @Description : mybatis-plus SQL执行效率插件【生产环境可以关闭】
* ---------------------------------
* @Author : Liang.Guangqing
* @Date : Create in 2017/9/19 13:57
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 配置DataSource
* @return
* @throws SQLException
*/
@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;
}
/**
* @Description : mybatis-plus分页插件
* ---------------------------------
* @Author : Liang.Guangqing
* @Date : Create in 2017/9/19 13:59
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
/**
* 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定
* 配置文件和mybatis-boot的配置文件同步
* @return
*/
@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;
}
/**
* 注册一个StatViewServlet
* @return
*/
@Bean
public ServletRegistrationBean DruidStatViewServle(){
//org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//添加初始化参数:initParams
//白名单:
// servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
// servletRegistrationBean.addInitParameter("deny","192.168.1.73");
//登录查看信息的账号密码.
servletRegistrationBean.addInitParameter("loginUsername","root");
servletRegistrationBean.addInitParameter("loginPassword","root");
//是否能够重置数据.
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
/**
* 注册一个:filterRegistrationBean
*
* @return
*/
@Bean
public FilterRegistrationBean druidStatFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
这里是完整的配置文件,需要注意的是引入的包,别引错了!
4、还要开启dao的扫描,很简单,就是在启动文件中添加@MapperScan("com.tdx.account_service.dao*"),如下是完整的

到这里,配置算是完成了,运行一下项目是可以运行起来的。
我觉得Mybatis-Plus最好玩得应该是代码生成器这部分内容,下面是代码生成器的使用过程
pom.xml上要加点东西
org.apache.velocity velocity-engine-core 2.0
1、代码生成器的配置文件
MybatisPlusConfig.java
/** * Copyright (c) 2011-2016, hubin (jobob@qq.com). ** Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ 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; /** *code is far away from bug with the animal protecting * ┏┓ ┏┓ *┏┛┻━━━┛┻┓ *┃ ┃ *┃ ━ ┃ *┃ ┳┛ ┗┳ ┃ *┃ ┃ *┃ ┻ ┃ *┃ ┃ *┗━┓ ┏━┛ * ┃ ┃神兽保佑 * ┃ ┃代码无BUG! * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * @Description : MybatisPlus代码生成器 * --------------------------------- * @Author : Liang.Guangqing * @Date : Create in 2017/9/19 14:48 */ 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;
/**
*code is far away from bug with the animal protecting
* ┏┓ ┏┓
*┏┛┻━━━┛┻┓
*┃ ┃
*┃ ━ ┃
*┃ ┳┛ ┗┳ ┃
*┃ ┃
*┃ ┻ ┃
*┃ ┃
*┗━┓ ┏━┛
* ┃ ┃神兽保佑
* ┃ ┃代码无BUG!
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*
* @description : ${entity} 控制器
* ---------------------------------
* @author ${author}
* @since ${date}
*/
#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;
/**
* @description : 获取分页列表
* ---------------------------------
* @author : ${author}
* @since : Create in ${date}
*/
@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;
}
/**
* @description : 通过id获取${entity}
* ---------------------------------
* @author : ${author}
* @since : Create in ${date}
*/
@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;
}
/**
* @description : 通过id删除${entity}
* ---------------------------------
* @author : ${author}
* @since : Create in ${date}
*/
@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;
}
/**
* @description : 通过id更新${entity}
* ---------------------------------
* @author : ${author}
* @since : Create in ${date}
*/
@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;
}
/**
* @description : 添加${entity}
* ---------------------------------
* @author : ${author}
* @since : Create in ${date}
*/
@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文件里面,然后启动程序,对应端口,请求方法。测试的话是需要按照自己的实体类操作的,所以仅供参考。
/**
* 分页 PAGE
*/
@GetMapping("/test")
public Page test() {
return userService.selectPage(new Page(0, 12));
}
/**
* AR 部分测试
*/
@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);
}
/**
* 增删改查 CRUD
*/
@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;
}
/**
* 7、分页 size 一页显示数量 current 当前页码
* 方式一:http://localhost:8080/user/page?size=1¤t=1
* 方式二:http://localhost:8080/user/pagehelper?size=1¤t=1
*/
// 参数模式分页
@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;
}
/**
* 测试事物
* http://localhost:8080/user/test_transactional
* 访问如下并未发现插入数据说明事物可靠!!
* http://localhost:8080/user/test
*
* 启动 Application 加上 @EnableTransactionManagement 注解其实可无默认貌似就开启了
* 需要事物的方法加上 @Transactional 必须的哦!!
*/
@Transactional
@GetMapping("/test_transactional")
public void testTransactional() {
//userService.insert(new User(1000L, "测试事物", 16, 3));
System.out.println(" 这里手动抛出异常,自动回滚数据");
throw new RuntimeException();
} 这么多的测试,我觉得最有趣的是条件构造器,在官网上有更齐全的,而我这里是按照我自己的需求写的。
最后谢谢大家的观看,写博客经验不足,写得不好请见谅,如果能给你带来帮助请点个赞,若遇到不明白的,或者我有写错的地方请提出,谢谢!也希望大家多多支持创新互联。