En comparación con mybatis de uso común, mybatisPlus puede ayudarnos a centrarnos más en el desarrollo empresarial y reducir la codificación de archivos sql. Ahora use SpringBoot + mybatisPlus para construir un proyecto. 1. Resumen de los problemas encontrados durante el proceso de construcción
(1) Informe de errores de inicio
Agregar dependencia
<dependency> <groupId> com.baomidou </groupId> <artifactId> mybatis-plus-boot-starter </artifactId> <version> 3.3.1.tmp </version> </dependency>
Debido a la relación de referencia, es obligatorio actualizar el número de versión mybatis-spring-boot-starter a 2.0.0 o superior.
<dependency> <groupId> org.mybatis.spring.boot </groupId> <artifactId> mybatis-spring-boot-starter </artifactId> <version> 2.0.1 </version> </dependency>
(2) El servicio puede tener un método para operar la base de datos heredando IService <T>
Formas de realizar la consulta 1,
userService.getOne (Wrappers. <User> lambdaQuery (). eq (false, User :: getId, 3L) .orderByDesc (User :: getId) .last ("límite 1"));
Formas de realizar la consulta 2,
QueryWrapper <User> wrapper = new QueryWrapper <> (); wrapper.eq ("nombre", "Guardar1"). o (). eq ("número_teléfono", "17300000001"). orderByDesc ("id");
(3) Hay muchas trampas en el método mybatisPlus. Por ejemplo, el método getOne devuelve un solo modelo, pero sql no agrega límite 1
Por lo tanto, debe escribirse en back.last ("límite 1"));
Por lo tanto, puede haber muchos problemas en el uso, se recomienda mirar primero la implementación del método de IService.
## spring-boot-demo-mybatis-plus #pom <? xml version = "1.0" encoding = "UTF-8"?> <proyecto xmlns = "http://maven.apache.org/POM/4.0.0 "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance " xsi: schemaLocation =" http://maven.apache.org/POM/4.0.0 https: //maven.apache. org / xsd / maven-4.0.0.xsd "> <modelVersion> 4.0.0 </modelVersion> <parent> <groupId> com.juejueguai </groupId> <artifactId> spring-boot-demo </artifactId> <versión > 1.0-SNAPSHOT </version> </parent> <groupId> com.example </groupId> <artifactId> spring-boot-demo-mybatis-plus </ artifactId> <version> 0.0.1-SNAPSHOT </version> <name> spring-boot-demo-mybatis-plus </name> <description> Proyecto de demostración para Spring Boot </description> <properties> <java.version> 1.8 </java.version> </properties> <dependencies> <dependency> <groupId> com.baomidou </groupId> <artifactId> mybatis-plus-boot-starter </artifactId> <version> 3.3.1.tmp </version> </dependency> <dependency> <groupId> org .springframework.boot </groupId> <artifactId> spring-boot-starter-test </artifactId> <scope>prueba </scope> </dependency> <dependency> <groupId> mysql </groupId> <artifactId> mysql-connector-java </artifactId> </dependency> <dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-web </artifactId> </dependency> <dependency> <groupId > org.springframework.boot </groupId> <artifactId> spring-boot-starter-test </artifactId> <scope> prueba </scope> <exclusions> <exclusion> <groupId> org.junit.vintage </groupId> <artifactId> motor-antiguo-junit </artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-maven-plugin </artifactId> </plugin> </plugins> </build> </ proyecto> #yml spring: datasource: url: jdbc: mysql: // localhost: 3306 / spring_boot_test? useUnicode = true & characterEncoding = UTF-8 & useSSL = false & autoReconnect = true & failOverReadOnly = false & serverTimezone = GMT% 2B8 nombre de usuario raíz de la clase de controlador: : com.mysql.jdbc.Tipo de controlador : com.zaxxer.hikari.Modo de inicialización de HikariDataSource : siempre continue-on-error: true verdadero hikari: mínimo-inactivo: 5 connection-test-query: SELECT 1 FROM DUAL máximo-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: SpringBootDemoHikariCP max-life: 60000 conexión -timeout: 30000 logging: level: com.juejueguai: debug com..juejueguai.springbootdemomybatisplus.mapper: trace mybatis-plus: mapper-locations: classpath: mappers / *. xml # Escaneo de entidades , varios paquetes usan comas o punto y coma Tipo separadoAliasesPackage : com.juejueguai.springbootdemomybatisplus.entity global-config: # Configuración relacionada con la base de datos db-config: # Tipo de clave principal AUTO: "ID de base de datos autoactivada", INPUT: "el usuario ingresa ID", ID_WORKER: "ID único global (ID único numérico)", UUID: "ID único global el UUID"; tipo de ID: Auto # Estrategia de campo IGNORADA: "ignorar juicio", NOT_NULL: "juicio no NULO"), NOT_EMPTY: "juicio no vacío" campo-estrategia: not_empty #Camel case subrayado tabla de conversión -subrayado: verdadero # ya sea para habilitar la asignación de nombres en mayúsculas , no habilitado de forma predeterminada # modo capital: verdadero # configuración de eliminación lógica # valor de eliminación lógica: 1 # valor lógico no eliminación: 0 tipo db: mysql #refresh mapper depuración de artefactos actualización: verdadero # Configuración de configuración nativa : map-underscore-to-camel -case: true cache-enabled: true server: port:9004 # archivo sql / * Navicat MySQL Data Transfer Servidor de origen: 本 机 数据库 Versión del servidor de origen: 50549 Host de origen: localhost: 3306 Base de datos de origen: spring_boot_test Tipo de servidor de destino: MYSQL Versión del servidor de destino: 50549 Codificación de archivo: 65001 Fecha: 2020-07-17 16:16: 48 * / SET FOREIGN_KEY_CHECKS = 0; - ---------------------------- - Estructura de tabla para orm_role - ------------ ---------------- DROP TABLE SI EXISTE `orm_role`; CREATE TABLE `orm_role` ( ` id` int (11) NOT NULL AUTO_INCREMENT COMMENT '主 键', `name` varchar (32) NOT NULL COMMENT '角色 名', PRIMARY KEY (` id`), CLAVE ÚNICA` name` (`name`) ) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8 COMMENT = 'Tabla de ejemplo de la serie Spring Boot Demo Orm'; - ------------------------- - - - Registros de orm_role - ---------------------------- INSERT INTO `orm_role` VALUES ('2', 'Usuario ordinario' ); INSERT INTO `orm_role` VALUES ('1', 'Administrador'); / * Navicat MySQL Data Transfer Servidor de origen: Base de datos local Versión del servidor de origen: 50549 Host de origen: localhost: 3306 Base de datos de origen: spring_boot_test Tipo de servidor de destino: MYSQL Target Versión del servidor: 50549 Codificación de archivo: 65001 Fecha: 2020-07-17 16:17:23 * / SET FOREIGN_KEY_CHECKS = 0; - ---------------------------- - Estructura de la tabla para orm_user - ------------ --- ------------- DROP TABLE IF EXISTS `orm_user`; CREATE TABLE` orm_user` ( `id` int (11) NOT NULL AUTO_INCREMENT COMMENT'primary key ', ` name` varchar (32) COMENTARIO NO NULO 'Nombre de usuario', `contraseña` varchar (32) COMENTARIO NO NULO 'Contraseña cifrada ', ` salt` varchar (32) COMENTARIO NO NULO ' Sal utilizado para cifrado', `email` varchar (32) COMENTARIO NO NULO ' buzón ', `phone_number` varchar (15) NOT NULL COMMENT'phone number', ` status` int (2) NOT NULL DEFAULT '1' COMMENT'status, -1: borrado lógico, 0: desactivado, 1: activado ', `create_time` datetime DEFAULT NULL COMMENT'create time ', ` last_login_time` datetime DEFAULT NULL COMMENT'Hora del último inicio de sesión ', `last_update_time` datetime COMENTARIO NULO POR DEFECTO '上次 更新 PRIM', CLAVE PRIMARIA (` id`), CLAVE ÚNICA `nombre` (` nombre`), CLAVE ÚNICA `email` (` email`), CLAVE ÚNICA `número_de_teléfono` ( `phone_number`) ) ENGINE = InnoDB AUTO_INCREMENT = 36 DEFAULT CHARSET = utf8 COMMENT = 'Spring Boot Demo Orm 系列 示例 表'; - ---------------------------- - Registros de orm_user - ------------- --------------- INSERT INTO `orm_user` VALUES ('2', 'user_2', '6c6bf02c8d5d3d128f34b1700cb1e32c', 'fcbdd0e8a9404a5585ea4e01d0e4d7a0', '[email protected]', '1', nulo, nulo, nulo); INSERT INTO `orm_user` VALUES ('3', 'MybatisPlus 修改 名字', '123456456', '456', '[email protected]', '17300000003', '1', '2020-07-17 14:52 : 15 ',' 2020-07-17 14:52:15 ',' 2020-07-17 15:05:46 '); INSERT INTO `orm_user` VALUES ('4', 'testSave4', '123456456', '456', '[email protected]', '17300000004', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('5', 'testSave5', '123456456', '456', '[email protected]', '17300000005', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('7', 'testSave7', '123456456', '456', '[email protected]', '17300000007', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('9', 'testSave9', '123456456', '456', '[email protected]', '17300000009', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('10', 'testSave10', '123456456', '456', '[email protected]', '173000000010', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('12', 'testSave12', '123456456', '456', '[email protected]', '173000000012', '1', '2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 ',' 2020-07-17 14:52:51 '); INSERT INTO `orm_user` VALUES ('24', 'testSave14', '123456456', '456', '[email protected]', '173000000014', '1', '2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 '); INSERT INTO `orm_user` VALUES ('25', 'testSave15', '123456456', '456', '[email protected]', '173000000015', '1', '2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 '); INSERT INTO `orm_user` VALUES ('27', 'testSave17', '123456456', '456', '[email protected]', '173000000017', '1', '2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 '); INSERT INTO `orm_user` VALUES ('29', 'testSave19', '123456456', '456', '[email protected]', '173000000019', '1', '2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 ',' 2020-07-17 15:16:00 '); # config 文件 @ Slf4j @Component public class CommonFieldHandler implementa MetaObjectHandler { @Override public void insertFill (MetaObject metaObject) { log.info ("iniciar insertar relleno ...."); this.setFieldValByName ("lastUpdateTime", nueva fecha (), metaObject); } @Override public void updateFill (MetaObject metaObject) { log.info ("iniciar actualización de llenado ...."); esta. } } @Configuration @MapperScan (basePackages = {"com.juejueguai.springbootdemomybatisplus.mapper"}) @EnableTransactionManagement public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor () { return new PaginationInterceptor (); } } # entidad @Data @NoArgsConstructor @AllArgsConstructor @Builder @TableName ("orm_user") clase pública El usuario implementa Serializable { private static final long serialVersionUID = -1840831686851699943L; / ** * 主 键 * / private Long id; / ** * 用户 名 * / Private String name; / ** * Contraseña cifrada * / Private String contraseña; / ** * Salt utilizado para el cifrado * / Private String salt; / ** * Correo electrónico * / Private String email; / ** * Número de teléfono móvil * / private String phoneNumber; / ** * Estado, -1: lógico eliminación, 0: deshabilitar, 1: habilitar * / private Integer status; / ** * Hora de creación * / @TableField (fill = INSERT) private Date createTime; / ** * Última hora de inicio de sesión * / private Date lastLoginTime; / ** * 上次 更新 时间 * / @TableField (llenar = INSERT_UPDATE) fecha privada lastUpdateTime; } # mapper @Component interfaz pública UserMapper extiende BaseMapper <User> { } # service interfaz pública UserService extiende IService <User> { } @Service clase pública UserServiceImpl extiende ServiceImpl <UserMapper, User> implementa UserService { } # prueba @RunWith (SpringRunner. class) @SpringBootTest public class SpringBootDemoMybatisPlusApplicationTests { @Test public void contextLoads () { } } @ Slf4j UserServiceTest de clase pública extiende SpringBootDemoMybatisPlusApplicationTests { @Autowired private UserService userService; / ** * 测试 Mybatis-Plus 新增 * / @Test public void testSave () { String salt = "456"; Usuario testSave3 = User.builder (). Name ("testSave"). Contraseña ("123456" + salt) .salt (salt) .email ("[email protected]"). PhoneNumber ("17300000003"). Status ( 1) .lastLoginTime (nueva fecha ()). Build (); boolean save = userService.save (testSave3); Assert.assertTrue (guardar); log.debug ("【测试 id 回 显 # testSave3.getId ()】 = {}", testSave3.getId ()); } / ** * 测试 Mybatis-Plus 批量 新增 * / @Test public void testSaveList () { List <User> userList = Lists.newArrayList (); para (int i = 14; i <20; i ++) { String salt = "456"; Usuario usuario = User.builder (). Name ("testSave" + i) .password ("123456" + salt) .salt (salt) .email ("testSave" + i + "@ xkcoding.com"). PhoneNumber ( "1730000000" + i) .status (1) .lastLoginTime (nueva Fecha ()). Build (); userList.add (usuario); } lote booleano = userService.saveBatch (userList); Afirmar. List <Long> ids = userList.stream (). Map (User :: getId) .collect (Collectors.toList ()); log.debug ("【userList # ids】 = {}", ids); } / ** * 测试 Mybatis-Plus 删除 * / @Test public void testDelete () { boolean remove = userService.removeById (1L); User byId = userService.getById (1L); Assert.assertNull (byId); } / ** * Prueba la modificación de Mybatis-Plus * / @Test public void testUpdate () { Usuario usuario = userService.getById (3L); user.setName ("MybatisPlus modificar nombre"); booleano b = userService.updateById (usuario); Assert.assertTrue (b); Actualización de usuario = userService.getById (3L); Assert.assertEquals ("MybatisPlus modificar nombre", update.getName () ); log.debug ("[update] = {}", update); } / ** * Prueba Mybatis-Plus consulta única * / @Test public void testQueryOne () { User user = userService.getOne (Wrappers. <User> lambdaQuery (). Eq (false, User :: getId, 3L) .orderByDesc (User :: getId) .last ("límite 1")); Assert.assertNotNull (usuario); log.debug ("【usuario】 = {}", usuario); } / ** * 测试 Mybatis-Plus 查询 全部 * / @Test public void testQueryAll () { List <User> list = userService.list (new QueryWrapper <> ()); Assert.assertTrue (! CollectionUtils.isEmpty (lista)); log.debug ("【lista】 = {}", lista); } / ** * 测试 Mybatis-Plus 分页 排序 查询 * / @Test public void testQueryByPageAndSort () { * / @Test public void testQueryByCondition () { initData (); int count = userService.count (nuevo QueryWrapper < Página <User> userPage = nueva página <> (1, 5); userPage.setDesc ("id"); IPage <User> page = userService.page (userPage, new QueryWrapper <> ()); Assert.assertEquals (5, page.getSize ()); Assert.assertEquals (recuento, page.getTotal ()); log.debug ("【page.getRecords ()】 = {}", page.getRecords ()); } / ** * 测试 Mybatis-Plus 自 定义 查询 QueryWrapper <User> wrapper = new QueryWrapper <> (); wrapper.like ("nombre", "Guardar1"). o (). eq ("número_teléfono", "17300000001"). orderByDesc ("id"); userService.getOne (envoltorio); int count = userService.count (envoltorio); Página <User> userPage = nueva página <> (1, 3); IPage <User> page = userService.page (userPage, contenedor); Assert.assertEquals (3, page.getSize ()); Assert.assertEquals (recuento, page.getTotal ()); log.debug ("【page.getRecords ()】 = {}", page.getRecords ()); https://github.com/juejuedog/SpringBootDemo.git