Comparé aux mybatis couramment utilisés, mybatisPlus peut nous aider à nous concentrer davantage sur le développement commercial et à réduire le codage des fichiers SQL. Utilisez maintenant SpringBoot + mybatisPlus pour créer un projet. 1. Résumé des problèmes rencontrés pendant le processus de construction
(1) Rapport d'erreur de démarrage
Ajouter une dépendance
<dependency> <groupId> com.baomidou </groupId> <artifactId> mybatis-plus-boot-starter </artifactId> <version> 3.3.1.tmp </version> </dependency>
En raison de la relation de référence, il est obligatoire de mettre à niveau le numéro de version de mybatis-spring-boot-starter vers 2.0.0 ou supérieur.
<dependency> <groupId> org.mybatis.spring.boot </groupId> <artifactId> mybatis-spring-boot-starter </artifactId> <version> 2.0.1 </version> </dependency>
(2) Le service peut avoir une méthode d'exploitation de la base de données en héritant de IService <T>
Façons de réaliser la requête 1,
userService.getOne (Wrappers. <User> lambdaQuery (). eq (false, User :: getId, 3L) .orderByDesc (User :: getId) .last ("limit 1"));
Façons de réaliser la requête 2,
QueryWrapper <User> wrapper = new QueryWrapper <> (); wrapper.eq ("nom", "Save1"). ou (). eq ("phone_number", "17300000001"). orderByDesc ("id");
(3) Il existe de nombreux pièges dans la méthode mybatisPlus. Par exemple, la méthode getOne renvoie un seul modèle, mais sql n'ajoute pas de limite 1
Il doit donc être épelé dans le back.last ("limit 1"));
Par conséquent, il peut y avoir de nombreux problèmes d'utilisation, il est recommandé de regarder d'abord l'implémentation de la méthode d'IService
## spring-boot-demo-mybatis-plus #pom <? xml version = "1.0" encoding = "UTF-8"?> <project 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> <version > 1.0-INSTANTANÉ </version> </parent> <groupId> com.example </groupId> <artifactId> spring-boot-demo-mybatis-plus </ artifactId> / artifactId> <version> 0.0.1-INSTANTANÉ </version> <nom> spring-boot-demo-mybatis-plus </name> <description> Projet de démonstration pour 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>test </scope> </dependency> <dependency> <groupId> mysql </groupId> </exclusions> <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> test </scope> <exclusions> <exclusion> <groupId> org.junit.vintage </groupId> <artifactId> junit-vintage-engine </artifactId> </exclusion> </dependency> </dependencies> <build> <plugins> <plugin> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-maven-plugin </artifactId> </plugin> </plugins> </build> </project> #yml printemps: dataSource url: jdbc: mysql: // localhost: 3306 / spring_boot_test useUnicode = true & CharacterEncoding = UTF-8 & usessl = false & autoreconnect = true & failOverReadOnly = false & serverTimezone = GMT% 2B8? nom d' utilisateur: root Mot de passe: root pilote-class-name: com.mysql .jdbc.Type de pilote : com.zaxxer.hikari.HikariDataSourcevrai hikari: Mode d'initialisation HikariDataSource : toujours continue-on-error: true minimum-idle: 5 connection-test-query: SELECT 1 FROM DUAL maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: SpringBootDemoHikariCP durée de vie maximale: 60000 connexion -timeout: 30000 journalisation: niveau: com.juejueguai: debug com..juejueguai.springbootdemomybatisplus.mapper: trace mybatis-plus: mapper-locations: classpath: mappers / *. xml #Entity scan, plusieurs packages utilisent des virgules ou des points-virgules Type séparéAliasesPackage : com.juejueguai.springbootdemomybatisplus.entity global-config: # Configuration relative à la base de données db-config: # Type de clé primaire AUTO: "ID de base de données auto-alimenté", INPUT: "l'utilisateur entre l'ID", ID_WORKER: "ID unique global (ID unique numérique)", UUID: "ID unique global de l'UUID"; type d'ID: Stratégie de champ automatique # IGNORÉ: "ignorer le jugement", NOT_NULL: "jugement non-NULL"), NOT_EMPTY: "jugement non vide" stratégie de champ: not_empty #Camel case underline conversion table-underline: true # si pour activer la dénomination en majuscules , non activé par défaut # capital- mode: true #logic delete configuration # logic-delete-value: 1 # logic-not-delete-value: 0 db-type: mysql #refresh mapper debug artifact refresh: true # configuration de configuration native : map-underscore-to-camel -case: true cache-enabled: true serveur: port:9004 # fichier sql / * Navicat MySQL Data Transfer Source Server: 本 机 数据库 Source Server Version: 50549 Source Host: localhost: 3306 Source Database: spring_boot_test Type de serveur cible: MYSQL Target Server Version: 50549 File Encoding: 65001 Date: 2020-07-17 16:16: 48 * / SET FOREIGN_KEY_CHECKS = 0; - ---------------------------- - Structure de la table pour orm_role - ------------ ---------------- DROP TABLE IF EXISTS `orm_role`; CREATE TABLE `orm_role` ( ` id` int (11) NOT NULL AUTO_INCREMENT COMMENT '主 键', `name` varchar (32) NOT NULL COMMENT '角色 名', PRIMARY KEY (` id`), UNIQUE (`name`) ) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8 COMMENT = 'Spring Boot Demo Orm series example table'; - --------------- - ------------ - Enregistrements de orm_role - ---------------------------- INSERT INTO `orm_role` VALUES ('2', 'Normal user'); INSERT INTO `orm_role` VALUES ('1', 'Administrator'); / * Navicat MySQL Data Transfer Source Server: Base de données locale Version du serveur source: 50549 Hôte source: localhost: 3306 Base de données source: spring_boot_test Type de serveur cible: MYSQL Version du serveur cible: 50549 Codage du fichier: 65001 Date: 2020-07-17 16:17:23 * / SET FOREIGN_KEY_CHECKS = 0; - ---------------------------- - Structure de la table pour 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) NOT NULL COMMENT'Username ', `password` varchar (32) NOT NULL COMMENT'Encrypted password', ` salt` varchar (32) NOT NULL COMMENT'Salt utilisé pour le chiffrement ', `email` varchar (32) NOT NULL COMMENT' mailbox ', `phone_number` varchar (15) NOT NULL COMMENT'phone number', ` status` int (2) NOT NULL DEFAULT '1' COMMENT'status, -1: suppression logique, 0: désactivé, 1: activé ', `create_time` datetime DEFAULT NULL COMMENT'create time ', ` last_login_time` datetime DEFAULT NULL COMMENT'Heure de la dernière connexion ', `last_update_time` datetime DEFAULT NULL COMMENT'Last time update ', PRIMARY KEY (` id`), UNIQUE KEY `name` (` name`), UNIQUE KEY `email` (` email`), UNIQUE KEY `phone_number` (` phone_number`) ) ENGINE = InnoDB AUTO_INCREMENT = 36 DEFAULT CHARSET = utf8 COMMENT = 'Spring Boot Demo Orm series example table'; - --------------------- - ----- - Enregistrements de orm_user - ---------------------------- INSÉRER DANS LES VALEURS `orm_user` ('2', 'user_2', '6c6bf02c8d5d3d128f34b1700cb1e32c', 'fcbdd0e8a9404a5585ea4e01d0e4d7a0', '[email protected]', '[email protected]', '17300000002' '1', nul, nul, nul); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 '); INSÉRER DANS LES VALEURS `orm_user` ('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 classe publique CommonFieldHandler implémente MetaObjectHandler { @Override public void insertFill (MetaObject metaObject) { log.info ("start insert fill ...."); ce. setFieldValByName ("lastUpdateTime", nouvelle date (), metaObject); } this.setFieldValByName ("lastUpdateTime", nouvelle date (), metaObject); } @Override public void updateFill (MetaObject metaObject) { log.info ("start update fill ...."); @TableName ("orm_user") } @Configuration @MapperScan (basePackages = {"com.juejueguai.springbootdemomybatisplus.mapper"}) @EnableTransactionManagement public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor () { return new Pagination ; Interceptor () { return new Pagination ;Interceptor () } } # entity @Data @NoArgsConstructor @AllArgsConstructor @Builder public class User implements Serializable { private static final long serialVersionUID = -1840831686851699943L; / ** * Clé primaire * / private Long id; / ** * Nom d'utilisateur * / Private String name; / ** * Mot de passe crypté * / Mot de passe de chaîne privé ; / ** * Le sel utilisé pour le chiffrement * / private String salt; / ** * Email * / private String email; / ** * Numéro de téléphone portable * / private String phoneNumber; / ** * Status, -1: logique suppression, 0: désactiver, 1: activer * / statut d'entier privé; / ** * 创建 时间 * / @TableField (fill = INSERT) private Date createTime; / ** * 上次 登录 时间 * / private Date lastLoginTime; / ** * 上次 更新 时间 * / @TableField (fill = INSERT_UPDATE) privé Date lastUpdateTime; } # mapper @Component public interface UserMapper étend BaseMapper <User> { } # service public interface UserService étend IService <User> { } @Service public class UserServiceImpl étend ServiceImpl <UserMapper, User> implémente UserService { } # test @RunWith (SpringRunner.class) @SpringBootTest classe publique SpringBootDemoMybatisPlusApplicationTests { @Test public void contextLoads () { } } User testSave3 = User.builder (). Name ("testSave"). Password ("123456" + salt) .salt (salt) .email ("[email protected]"). PhoneNumber ("17300000003"). Status ( 1) .lastLoginTime (nouvelle date ()). Build (); @ Slf4j la classe publique UserServiceTest étend SpringBootDemoMybatisPlusApplicationTests { @Autowired private UserService userService; / ** * 测试 Mybatis-Plus 新增 * / @Test public void testSave () { String salt = "456"; List <User> userList = Lists.newArrayList (); pour (int i = 14; i <20; i ++) { boolean save = userService.save (testSave3); Assert.assertTrue (enregistrer); log.debug ("【测试 id 回 显 # testSave3.getId ()】 = {}", testSave3.getId ()); } / ** * 测试 Mybatis-Plus 批量 新增 * / @Test public void testSaveList () { String salt = "456"; User user = User.builder (). Name ("testSave" + i) .password ("123456" + salt) .salt (salt) .email ("testSave" + i + "@ xkcoding.com"). PhoneNumber ( "1730000000" + i) .status (1) .lastLoginTime (nouvelle Date ()). Build (); userList.add (utilisateur); } booléen batch = userService.saveBatch (userList); Affirmer. List <Long> ids = userList.stream (). Map (User :: getId) .collect (Collectors.toList ()); log.debug ("【userList # ids】 = {}", ids); } / ** * 测试 Mybatis-Plus 删除 * / @Test public void testDelete () { booléen remove = userService.removeById (1L); User byId = userService.getById (1L); Assert.assertNull (byId); } / ** * 测试 Mybatis-Plus 修改 * / @Test public void testUpdate () { User user = userService.getById (3L); user.setName ("MybatisPlus 修改 名字"); booléen b = userService.updateById (utilisateur); Assert.assertTrue (b); Mise à jour de l'utilisateur = userService.getById (3L); Assert.assertEquals ("MybatisPlus 修改 名字", update.getName ()); log.debug ("【mise à jour】 = {}", mise à jour); } / ** * 测试 Mybatis-Plus 查询 单个 * / Assert.assertTrue (! CollectionUtils.isEmpty (liste)); @Test public void testQueryOne () { User user = userService.getOne (Wrappers. <User> lambdaQuery (). Eq (false, User :: getId, 3L) .orderByDesc (User :: getId) .last ("limit 1")); Assert.assertNotNull (utilisateur); log.debug ("【utilisateur】 = {}", utilisateur); } / ** * 测试 Mybatis-Plus 查询 全部 * / @Test public void testQueryAll () { List <User> list = userService.list (new QueryWrapper <> ()); log.debug ("【liste】 = {}", liste); } / ** * 测试 Mybatis-Plus 分页 排序 查询 * / @Test public void testQueryByPageAndSort () { initData (); int count = userService.count (nouveau QueryWrapper < Page <User> userPage = nouvelle page <> (1, 5); userPage.setDesc ("id"); IPage <User> page = userService.page (userPage, nouveau QueryWrapper <> ()); Assert.assertEquals (5, page.getSize ()); Assert.assertEquals (nombre, page.getTotal ()); log.debug ("【page.getRecords ()】 = {}", page.getRecords ()); } / ** * 测试 Mybatis-Plus 自 定义 查询 * / @Test public void testQueryByCondition () { QueryWrapper <User> wrapper = new QueryWrapper <> (); wrapper.like ("nom", "Save1"). ou (). eq ("phone_number", "17300000001"). orderByDesc ("id"); userService.getOne (wrapper); int count = userService.count (wrapper); IPage <User> page = userService.page (userPage, wrapper); Assert.assertEquals (3, page.getSize ()); Assert.assertEquals (nombre, page.getTotal ()); log.debug ("【page.getRecords ()】 = {}", page.getRecords ()); } / ** * 初始化 数据 * / private void initData () { testSaveList (); } https://github.com/juejuedog/SpringBootDemo.git