spring boot整合mybatis+mybatis

网友投稿 271 2023-02-21


spring boot整合mybatis+mybatis

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/**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(pwGGHeImropertyResolver.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://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 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}",wGGHeImmethod = 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&current=1

* 方式二:http://localhost:8080/user/pagehelper?size=1&current=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
http://

*

* 启动 Application 加上 @EnableTransactionManagement 注解其实可无默认貌似就开启了

* 需要事物的方法加上 @Transactional 必须的哦!!

*/

@Transactional

@GetMapping("/test_transactional")

public void testTransactional() {

//userService.insert(new User(1000L, "测试事物", 16, 3));

System.out.println(" 这里手动抛出异常,自动回滚数据");

throw new RuntimeException();

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于python 接口测试的信息
下一篇:微信小程序switch组件使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~