Spring Boot es algo nuevo para mí. Durante mi proceso de aprendizaje, descubrí que esta cosa todavía es fácil de comenzar. Cuando Spring Boot no está configurado, usará Spring Data JPA de forma predeterminada. Se puede decir que esta cosa es una herramienta muy simple, pero aún prefiero usar mybatis. No hay la mejor herramienta, solo esta es adecuada para mí.
Hablando de mybatis, hay una herramienta muy útil recientemente: mybatis -plus (sitio web oficial). La versión actualizada ahora es 2.1.2, y esta versión también se usa aquí. Mis características favoritas son los generadores de código y los constructores condicionales, para que puedan desarrollarse más fácilmente.
Hay un ejemplo de arranque de primavera en el sitio web oficial de MyBatisPlus. Lo seguí y el programa no se ejecutó. Más tarde descubrí que la base de datos H2 utilizada por la demostración no es la misma que MySQL. Entonces, si desea integrar myBatisPlus, no puede mirar el sitio web oficial y evitar los desvíos.
El siguiente es el proceso de integración
1. Primero, debe obtener todos los archivos JAR requeridos. Las cosas que necesita para pom.xml son las siguientes
pom.xml (incompleto)
<!-mybatis-plus begin-> <spendency> <MoupRoD> com.baomidou </proupid> <artifactID> mybatisplus-spring-boot-starter </artifactid> <version> 1.0.4 </versión> </pendency> <pendency> <proupid> com.baomidou </groupid> <artifactid> mybatise-oplus </artifact> <Versión> 2.1.2 </versión> </pendency> <epardency> <grupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-jdbc </artifactid> </dependency> <!-mybatis-plus end-> <!-Druid alibaba de conexión de conexión de conexión-> <<rippendency> <MoupRid> com.alibaba </groupid> <artifactid> druid </artifactid> <ververy> 1.1.3 </versión> </pendency> <!-mysql-> <pendency> <MoupRid> mysql </groupid> <artifactid> mysql-connector-java </artifactid> <scope> tiempo </scope> </artifactid> mysql-connector-java </artifactid> <scope> tiempo </scope> </artifactid> mysql-connector-java </artifactid> <scope> tiempo </scope> </artifactid> mysql-connector-java </artifactid> <scope> tiempo </scope> </artifactid> mysql-connector-java </artifactiD> <scope> <MoupRid> org.mybatis.spring.boot </groupid> <artifactid> mybatis-spring-boot-starter </artifactid> <versión> 1.3.1 </versión> </pendency>
2. Agregue configuraciones relacionadas con MyBatis, como cuenta, contraseña, etc. Aquí utilicé Application.yml para que coincida.
Application.yml
servidor: puerto: 8080#springspring: devtools: reiniciar: habilitado: true#este es para la implementación de Hot, y no está relacionado con MyBatis#base de datos Configuración de datos: JDBC: mysql: // mysqldb: 3306/tdx_shop? UseUnicode = true & caracterSencoding = UTF-8 Tipo: com.alibaba.druid.pool.druiddataSource #Here está configurando el grupo de conexión druid. Las siguientes son toda la información de configuración para los filtros Druid: Stat, Wall, Log4j Maxactive: 20 InitialSize: 1 Maxwait: 60000 Minidle: 1 TimeBetweenEvictionRunsmillis: 60000 MinevictableDableDetEmemillis: 300000 ValidationQuery: Seleccione 'x' TestHileidle: True TestOnBor MaxopenPreparedStatements: 20 Connection-Properties: druid.stat.merggsql = ture; druid.stat.slowsqlmillis = 5000 #mybatismybatis: mapper-locations: classpath*:/mapper/** mapper.xml #pup el archivo XML en com.xx.mapper puede tener problemas fundados. Aquí está el mapeador bajo recursos #Entity Scan, múltiples paquetes están separados por comas o semicolones. Typealiaspackage: com.tdx.account_service.Entity #Esta es la ubicación de la clase de entidad Configuración: map-worscore-to-camel-case: verdadero caché-habilitado: falso #logginglogging: nivel: warn
El material de configuración es similar a lo que usamos para configurar con MyBatis, pero Spring Boot no tiene un archivo de configuración XML. Presta atención al contenido de la carta roja, básicamente no hay problema.
3. Archivo de configuración mybatis-plus ------ MyBatisPlusConfig. Primero, expliquemos la ruta del archivo en la figura anterior. Entre ellos, MyBatisPlusConfig se coloca en la carpeta de configuración, mientras que el archivo XML se coloca en el mapeador en REOUPES.
Luego está la parte de contenido mybatisplusconfig
Mybatisproperties.java
Paquete com.tdx.account_service.config; import com.baomidou.mybatisplus.mybatisconfiguration; import com.baomidou.mybatisplus.mybatisconfiguration; import com.baomidou.mybatisplus.entity.globalconfiguration; import com.baomidou.mybatisplus.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; importar org.apache.ibatis.mapping.mappedStatement; import org.apache.iBatis.Reflamection.MetaObject; importar org.mybatis.spring.annotation.mapperscan; import og.mybatis.spring.boot.autoconfigure.mybatisproperties; import og.springframework.beans.factory.anotation.autowired; import org.springframework.boot.bind.relaxedpropertyResolver; import org.springframework.boot.context.properties.enableconfigurationProperties; importar org.springframework.boot.web.servlet.filterRegistration; org.springframework.boot.web.servlet.servletregistrationBean; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import og.springfframework.core.envirment; importar; import org.springframework.core.io.defaultresourceloader; import org.springframework.core.io.resourceloader; import org.springframework.util.ObjectUtils; import og.springfringframwork.util.stringutils; import javax.sql.datasource; importe; import java.sql.sqlexception; import java.util.arrayList; import java.util.list;/** * El código está muy lejos del error con el animal que protege * ┏┓ * ┏┛━━━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ┃ ┃ ┃ * ┃ ┳┛ ┃ ┃ ┃ ┃ * ┃ * ┃ * ┃ * ┃ * ┃ * ┃ ┃ ┃ bendición de la bestia* ┃ ┃ ┃ ┃ ┃ ┃ ┗┓ ┏┛* ┃ ┃ ┃ bendición de la bestia* ┃ ┃ ┃ ┃ ┃ ┃ ¡Sin errores! * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * @Description: Configuración MyBatisPlus * ------------------------------------------------------------------------------------------------------------------------------------------------------- PropertyResolver privado relajado relajado; @AUTOWIREDEDIRDED DataSource DataSource; @Autowired Private MyBatisProperties Properties; @AUtowired private resourceloader resourceloader = new DeFaultResourCelOader (); @AUtowired (requerido = falso) interceptor privado [] interceptores; @AUTOWIRED (requerido = falso) Private DatabaseIdProvider DatabaseIdProvider; /** * @Description: MyBatis-PLUS SQL Efficiency Efficiency Plug-in [puede cerrarse en el entorno de producción] * ----------------------------------------------------------------------------------------------------------------------------------------------------------- */ @Bean public dataSource DruidDataSource () lanza SQLException {this.propertyResolver = new RelleedPropertyResolver (entorno, "Spring.DataSource."); System.out.println("=============================================================================================== ==================================================================================================================== =========================================================================================================================================================================================== S ==================================================================================================================== DataSource.SetUrl (PropertyResolver.getProperty ("url")); DataSource.setPassword (PropertyResolver.getProperty ("Password")); DataSource.SetMaxWait (Long.ValueOf (PropertyResolver.getProperty ("max-wait"))); dataSource.SetMinEblableDletEmillis (Long.ValueOf (PropertyResolver.getProperty } /*** @description: complemento de paginación mybatis-plus* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PaginationInterceptor PagationInterceptor () {PagationInterceptor Page = New PaginationInterceptor (); myBAtIsqlSessionFactoryBean () {myBAtIsqlSessionFactoryBean MyBatisPlus = new MyBAtIsqlSessionFactory (); (StringUtils.hastext (this.properties.getConfigLocation ())) {myBatisPlus.setConfigLocation (this.resourceloader.getResource (this.properties.getConfigLocation ())); (! ObjectuTIls.isEmty (this.interceptors)) {myBatisPlus.setPlugins (this.interceptors); Auto-> `0` (" ID de base de datos Auto-Incremento ") Entrada->` 1` (ID de entrada del usuario ") id_worker->` 2` ("ID único global") uuid-> `3` (" Ids un único global ") Mybatconfig.setType (2); mybatisplus.setglobalconfig (global un único config); mybatconfiguronfiguration (2); mybatisplus.setglobalconfig (global unión único); mybatconfiguration mc = new = newe MyBATISCONFIGUNE (); (StringUtils.haslength (this.properties.gettypealiaspackage ()))) {myBatisPlus.settypealiaspackage (this.properties.gettypealiaspackage ()); } if (stringUtilss.hasLength (this.properties.gettypealiaspackage ());} if (stringUtils.hasLength (this.properties.gettypeHandlerspackage ())) {myBatisPlus.SetTypeHandlerspackage (this.Properties.getTypeHypeHandlerspackage ());} ) DruidStatViewServle () {//org.springframework.boot.context.embedded.servletregistrationBean proporciona la clase para el registro. // ServletRationBean.AddinitParameter ("Permitir", "127.0.0.1"); // Iniciar sesión la contraseña para ver la información. }/** * Registre uno: FilterRegistrationBean * * @return */@Bean Public FilterRegistrationBean DruidStatFilter () {FilterRegistrationBean FilterRegistrationBean = New FilterRegistrationBean (new WebStatFilter ()) ignorado.Aquí está el archivo de configuración completo. ¡Es importante tener en cuenta que los paquetes introducidos no son incorrectos!
4. También debe habilitar DAO Scanning. Es muy simple. Agregar @mapperscan ("com.tdx.account_service.dao*") al archivo de inicio. El siguiente es el completo.
En este punto, la configuración se ha completado y puede ejecutar el proyecto después de ejecutarlo.
Creo que mybatis-plus es la parte más divertida del generador de código. El siguiente es el proceso de usar el generador de código
Agregue algo a pom.xml
<Spendency> <ProupId> org.apache.velocity </groupid> <artifactId> Velocity-Engine-Core </artifactId> <versión> 2.0 </versión> </pendency>
1. Archivo de configuración del generador de código
Mybatisplusconfig.java
/*** Copyright (c) 2011-2016, Hubin ([email protected]). * <p> * con licencia bajo la licencia Apache, versión 2.0 (la "licencia"); No puede * usar este archivo, excepto de conformidad con la licencia. Puede obtener una copia de * la licencia en * <p> * http://www.apache.org/licenses/license-2.0 * <p> * a menos que sea requerido por la ley aplicable o acordado por escrito, el software * distribuido bajo la licencia se distribuye en una base "como es", sin * garantías o condiciones de cualquier tipo, ya sea expresas o implicadas. Consulte la * Licencia * para los permisos y limitaciones de rigor de idioma específico bajo * la licencia. */paquete 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.Baomidou.mybataSsplus.enums.enums.enums.enMe.enums.Ensper com.baomidou.mybatisplus.generator.autegenerator; import com.baomidou.mybatisplus.generator.injectionConfig; import com.baomidou.mybatisplus.generator.config.globalconfig; import com.baomidou.mybatisplus.generator.config.packageConfig; import com.baomidou.mybatisplus.generator.config.strateyconfig; importar; com.baomidou.mybatisplus.generator.config.templateConfig; import com.baomidou.mybatisplus.generator.config.converts.mysqltypeConvert; import com.baomidou.mybatisplus.generator.config.po.tableinfo; import com.baomidou.mybatisplus.generator.config.rules.dbcolumntype; import com.baomidou.mybatisplus.generator.config.rule.dbtype; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;/** *code is far away from bug with the animal protecting * ┏┓ ┏┓ *┏┛━━━━━━━┛┻┓ *┃ ┃ *┃ ━ ┃ *┃ ┳┛ ┗┳ ┃ *┃ ┃ *┃ ┃ *┃ ┃ *┗━┓ ┏━┛ * ┃ ┃ ┃ Bless the beast* ┃ ┃ ┃ ┃ code without ¡insectos! * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * @Description: Generador de código MyBatisPlus * ----------------------------------------------------------------------------------------------------------------------------------------------------------- // PATH FILE PRIVADA ESTÁTICA STRING AHORTORNAME = "liang.guangqing"; // Autor Tabla de cadena estática privada = "SC_USER"; // Nombre de la tabla Cadena estática privada prefix = "Sc_"; // Tabla prefijo archivo de archivo estático privado archivo = nuevo archivo (packageName); string static static privado ruta = file.getabsolutePath (); public static void main (string [] args) {// Personalice los campos que deben llenarse la lista <tableFill> tableFillList = new ArrayList <> (); tableFillList.Add (nuevo TableFill ("asdd_ss", fieldfill.insert_update)); // Generador de código Autogenerator mpg = new Autogenerator (). SetGlobalConfig (// Configuración global New GlobalConfig () .SetOutputDir (Path+"/Src/Main/Java") // Salida Directory.setSetFileOverRide (true) // Para que exagere sobre el archivo. XML Cache.setBaseResultMap (true) // XML ResultMap .SetBaseColumnList (true) // xml columnList .setopen (false) // Abrir la carpeta después de la generación. .SetXMLName ("%smapper") .setserviceName ("%sservice") .setserviceImplname ("%sserviceImpl") .SetControllername ("%Scontroller")) .SetDataSource (// Configuración de origen de datos New DataSCeConFig (). type.settypeConvert (new MySQLTyPeConvert () {// Personalizar la tabla de datos Tabla de campo Tipo conversión [Opcional] @Override public dbColumnType ProcessTypeConvert (String fieldType) {System.out.Println ("Tipo de conversión:" + fieldType); // if (fieldType.tOlowercase (). // return dbColumnType.Boolean; .SetUrl ("jdbc: mysql: //127.0.0.1: 3306/tdx_shop? caracterSencoding = utf8")) .SetStrateGy (// Configuración de la política nueva estrategia Conconfig () // .SetCapitalMode (true) // Global Capitalization Naming //.setdbolumnerline(true)////////////////////// /on de naming.settablePrefix (new String [] {prefix}) // Aquí puede modificarlo en su tabla prefix.SetNaming (namingStrateGy.underline_to_camel) // tabla name generation strateg String [] {"Test"}) // Excluye la tabla generada // clase principal de entidad personalizada // .setsuperentityclass ("com.baomidou.demo.testentity") // entidad personalizada, público público //.setsuperentitycolumns(new string [] {"test_id"}) .setablefilllist (tablefilllist) .SetSupermapperClass ("com.baomidou.demo.testmapper") // Servicio personalizado Clase matriz // .SetSuperServiceClass ("com.baomidou.demo.testservice") // Class de implementación de servicio personalizado Class //setsuPerSerServiceImplclass ("Com.Baomidou.demo.TestServiceMpl") .setsuperControllerClass ("com.tdx."+PackageName+". Controler.abstractController") // [Entity] si generar constantes de campo (predeterminado falso) // public String ID de cadena final de estaticidad = "test_id"; {this.name = name; .SetEntityBooleanColumnremoveIsPResfix (true) // .SetRestControllerStyle (true) // .SetControllerPingHyphenStyle (true)) .SetPackageInfo (// packageConfig () // .SetModulenEnfo path.setController ("controlador") // Aquí está el nombre del paquete del controlador, Web predeterminado .SetEntity ("entidad") .SetMapper ("Dao") .SetService ("Servicio") .SetServiceImpl ("Service.Impl") //.setxml(l"Mapper ") .SetCfg (// Inject Custom Configuration, Usted puede usar el valor establecido por el valor. InyectionConfig () {@Override public void initMap () {map <string, object> map = new HashMap <> (); } .setFileOutConfigList (colecciones. <FileOutConfig> SingletOnList (new FileOutConfig ("/Templates/mapper.xml.vm") {// directorio de archivos de salida personalizado @Override public String outputFile (tableInfo tableInfo) {ruta de retorno + "/src/main/recursos/recursos/mApper/ + tableinfo.getEnfO. "Mapper.xml";}}))) .settemplate (// apague la generación XML predeterminada y ajuste la generación al directorio raíz nuevo TemplateConFig (). SetXml (null) // Personalizar la configuración de la plantilla. SRC/Main/Recursos/Director de plantilla. .setserviceImpl ("..."); // ejecutar para generar mpg.execute (); // Imprima la configuración de inyección, aquí demuestre cómo obtener el contenido de inyección en la plantilla [noble] system.err.println (mpg.getcfg (). GetMap (). Get ("ABC")); }}
Todavía hay muchas modificaciones en el archivo. Lo más importante es la información de conexión de MySQL. No hay ninguna razón por la cual su cuenta y contraseña estén mal. Puedes conectarte a él. En segundo lugar, establezca la ruta del archivo de plantilla que generó. El camino que generé aquí se puede ver en la figura anterior. Está bajo com.tdx.account_service. Tenga en cuenta que el archivo XML debe colocarse bajo recursos, de lo contrario, se reconocerá y dijo que este método no se puede encontrar.
Los archivos generados de acuerdo con la plantilla de código del sitio web oficial están básicamente en blanco. La razón principal es que MyBatis-Plus integra métodos públicos, y se pueden hacer referencia a muchas herramientas de uso común. Aquí proporciono el archivo controlador.java.vm que modificé, principalmente según mis propios hábitos.
controlador.java.vm
paquete $ {paquete.controller}; importar org.springframework.web.bind.annotation.requestMapping; import org.springframework.web.bind.annotation.requestparam; #if ($ {RESTControllerstyle}) import org.springframework.web.bind.annotation.restController; #elseimport org.springframework.steretype.controller;#end#if ($ {supercontrollerClasspackage}) importar $ {supercontrollerClasspackage};#endimort org. $ {paquete.entity} .common.datateablejson; import $ {paquete.entity} .common.jsonResult; import $ {paquete.entity}. $ {entity}; importar org.slf4j.logger; import org.slf4j.loggerFactory;/** *Code está lejos de BUG con el bugs con el bugs con el bugs con el bugs con los animales *┏┓ ┏┓ ┏┓ ┃ ┏┓ ┏┓ ┏┓ ┏┓ ┏┓ ┏┓ * *┃ ┳┛ ┗┳ ┃ *┃ ┃ *┃ ┃ *┃ ┗┳ ┃ *┃ ┃ *┃ ┗┳ ┃ *┃ ┃ *┃ ┗┓ ┏━┛ * ┃ ┃ *┃ ┃ *┗┓ ┏━┛ * ┃ ┃ ┃ *┃ ┃ *┗┓ ┏━┛ * ┃ ┃ Blessing* ┃ ┃The code has no bugs! * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫┃┫ * ┗┻┛ ┗┻┛ * * @Description: $ {entidad} controlador * ----------------------------------------------------------- */#if ($ {RestControllerstyle})@RestController#else@controlador#end@requestmapping ("#if ($ {paquete.modulename})/$ {paquete.modulename}# end/#if ($ {ControlyermappingHyphenStyle}) $ {Controlyermappinghyphen}#else $ {table.entitypath} #end ")#if ($ {supercontrollerclass}) público clase $ {table.controllername} extiende $ {SuperControllerClass} {#ElSePublic Class $ {table.controllername} {#end private final logger logger = loggerFactory.getLogger ($ {table.controllername} .class); @AUtowired public $ {table.serviceName} $ {table.entitypath} servicio; /*** @Description: Obtenga la lista de paginación* ----------------------------------------------------------------------------------------------------------------------------------------------------------- Get $ {entity} list ($ {entity} param, @requestparam (valor = "dibujo", defaultValue = "0") Integer Draw, @RequestParam (value = "Longi") Integer Longitud, @RequestParam (value = "inicio") Integer inicio) {dataTablesjson <$ {entity }> Resjson = newatableSJSON () () () (); intente {Integer pageno = getPageno (inicio, longitud); Página <$ {entidad}> página = nueva página <$ {entidad}> (pageno, longitud); $ {TABLE.EntityPath} Service.SelectPage (página, nuevo EntityWrapper <$ {entity}> (param)); resjson.setDraw (dibujar ++); resjson.setRecordstotal (page.gettotal ()); resjson.setRecordSfiltered (page.gettotal ()); resjson.setData (page.getRecords ()); resjson.setsuccess (verdadero); } catch (excepción e) {resjson.setsuccess (falso); resjson.setError ("Información de excepción: {"+e.getClass (). getName ()+"}"); logger.info ("Información de excepción: {}"+e.getMessage ()); } return Resjson; } /** * @Description: Get $ {entidad} por ID * --------------------------------------------------------------------------------------------------------------------------------------------------------------- id) {jsonResult <$ {entity}> resjson = new JsonResult <> (); intente {$ {entidad} param = $ {table.entitypath} servicio.selectById (id); resjson.setData (param); resjson.setsuccess (verdadero); } catch (excepción e) {resjson.setsuccess (falso); resjson.setMessage ("Información de excepción: {"+e.getClass (). getName ()+"}"); logger.info ("Información de excepción: {}"+e.getMessage ()); } return Resjson; } /** * @Description: Eliminar $ {entidad} por ID * ----------------------------------------------------------------------------------------------------------------------------------------------------------- JSONRESULT <> (); intente {resjson.setsuccess ($ {table.entitypath} servicio.deleteById (id)); } catch (excepción e) {resjson.setsuccess (falso); resjson.setMessage ("Información de excepción: {"+e.getClass (). getName ()+"}"); logger.info ("Información de excepción: {}"+e.getMessage ()); } return Resjson; } /** * @description : Update ${entity} by id * -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @since : Create in $ {date} */ @RequestMapping (value = "/ update $ {entity} byid", método = requestmethod.post) Update de objeto público $ {entity} byid ($ {entity} param) {jsonResult <$ {entity}> resjson = new jSonResult <> (); intente {resjson.setsuccess ($ {table.entitypath} servicio.updateById (param)); } catch (excepción e) {resjson.setsuccess (falso); resjson.setMessage ("Información de excepción: {"+e.getClass (). getName ()+"}"); logger.info ("Información de excepción: {}"+e.getMessage ()); } return Resjson; } /** * @Description: Agregar $ {entidad} * ----------------------------------------------------------------------------------------------------------------------------------------------------------- JSONRESULT <$ {entidad}> resjson = new JsonResult <> (); intente {resjson.setsuccess ($ {table.entitypath} servicio.insert (param)); } catch (excepción e) {resjson.setsuccess (falso); resjson.setMessage ("Información de excepción: {"+e.getClass (). getName ()+"}"); logger.info ("Información de excepción: {}"+e.getMessage ()); } return Resjson; }}Además de este archivo, sigo el sitio web oficial de las otras plantillas de código. Aquí me refiero a 3 archivos externos, incluido AbstractController.java (clase base del controlador), DataTablejson.java y jsonResult.java. Luego, estos archivos se refieren a otros archivos. Estaba confundido. ¿Por qué hay tantos archivos? Parece que si todos ellos se publican, ocupará más espacio. Así que elegí creer en Code Cloud. Si lo necesita, descargue la nube de código de acuerdo con los pocos archivos en Code Cloud. Cabe señalar que mis plantillas son reemplazadas directamente por el directorio de plantillas en mybatis-plus.jar.
Finalmente, es el proceso de prueba
Los siguientes fragmentos de código se colocan en el archivo del controlador, y luego se inicia el programa, correspondiente al puerto y el método de solicitud. Para las pruebas, debe operar de acuerdo con su propia clase de entidad, por lo que es solo para referencia.
/** * página de paginación */@getmapping ("/test") página pública <serve> test () {return UserService.SelectPage (nueva página <Serement> (0, 12)); }/*** AR Prueba parcial*/@getmapping ("/test1") Página pública <Ser User> test1 () {user User = new User (); System.err.println ("Eliminar todo:" + user.delete (nulo)); //user.setid(2017091801l); user.setAccout ("Test"+Num ++); user.settype ("prueba"); user.setCreateTime (nueva fecha ()); user.setPhone ("13111110000"); user.setPassword ("123456"); user.setNickName ("Guangqing"+2*num ++); user.insert (); System.err.println("Query insert result: " + user.selectById().toString()); //user.setNickname("mybatis-plus-ar"); System.err.println("Update:" + user.updateById()); return user.selectPage(new Page<User>(0, 12), null); } /** * Add, delete, modify and check 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("Delete a data: " + userService.deleteById(1L)); System.err.println("Insert a data: " + 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); // Automatic writeback ID Long id = user.getId(); System.err.println("Insert a piece of data: " + result + ", Insert information: " + user.toString()); System.err.println("Query: " + userService.selectById(id).toString()); Page<User> userListPage = userService.selectPage(new Page<User>(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<User> page =new Page<User>(pageNo,length); EntityWrapper<User> ew = new EntityWrapper<User>(); 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<User> 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. Pagination size Number of displays on one page Current page number* Method 1: http://localhost:8080/user/page?size=1¤t=1<br> * Method 2: http://localhost:8080/user/pagehelper?size=1¤t=1<br> * / // Parameter mode pagination @GetMapping("/page") public Object page(Page page) { return userService.selectPage(page); } // ThreadLocal Pattern pagination @GetMapping("/pagehelper") public Object pagehelper(Page page) { PageHelper.setPagination(page); page.setRecords(userService.selectList(null)); page.setTotal(PageHelper.freeTotal());//Get the total number and free resources. PageHelper.getTotal() return page; } /** * Test things* http://localhost:8080/user/test_transactional<br> * Access the following and no data is found to indicate that things are reliable! ! <br> * http://localhost:8080/user/test<br> * <br> * Start Application Add @EnableTransactionManagement The annotation seems to be enabled without default<br> * Methods that require things plus @Transactional is a must! ! */ @Transactional @GetMapping("/test_transactional") public void testTransactional() { //userService.insert(new User(1000L, "Test Things", 16, 3)); System.out.println("Exception is thrown manually here and data is automatically rolled back"); throw new RuntimeException(); }这么多的测试,我觉得最有趣的是条件构造器,在官网上有更齐全的,而我这里是按照我自己的需求写的。
最后谢谢大家的观看,写博客经验不足,写得不好请见谅,如果能给你带来帮助请点个赞,若遇到不明白的,或者我有写错的地方请提出,谢谢!也希望大家多多支持武林网。