You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. # spring-boot-demo-orm-mybatis-plus
  2. > 此 demo 演示了 Spring Boot 如何集成 mybatis-plus,简化Mybatis开发,带给你难以置信的开发体验。
  3. >
  4. > - 2019-09-14 新增:ActiveRecord 模式操作
  5. ## pom.xml
  6. ```xml
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>spring-boot-demo-orm-mybatis-plus</artifactId>
  12. <version>1.0.0-SNAPSHOT</version>
  13. <packaging>jar</packaging>
  14. <name>spring-boot-demo-orm-mybatis-plus</name>
  15. <description>Demo project for Spring Boot</description>
  16. <parent>
  17. <groupId>com.xkcoding</groupId>
  18. <artifactId>spring-boot-demo</artifactId>
  19. <version>1.0.0-SNAPSHOT</version>
  20. </parent>
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. <mybatis.plus.version>3.0.5</mybatis.plus.version>
  26. </properties>
  27. <dependencies>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>com.baomidou</groupId>
  34. <artifactId>mybatis-plus-boot-starter</artifactId>
  35. <version>${mybatis.plus.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-test</artifactId>
  40. <scope>test</scope>
  41. </dependency>
  42. <dependency>
  43. <groupId>mysql</groupId>
  44. <artifactId>mysql-connector-java</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>cn.hutool</groupId>
  48. <artifactId>hutool-all</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>com.google.guava</groupId>
  52. <artifactId>guava</artifactId>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.projectlombok</groupId>
  56. <artifactId>lombok</artifactId>
  57. <optional>true</optional>
  58. </dependency>
  59. </dependencies>
  60. <build>
  61. <finalName>spring-boot-demo-orm-mybatis-plus</finalName>
  62. <plugins>
  63. <plugin>
  64. <groupId>org.springframework.boot</groupId>
  65. <artifactId>spring-boot-maven-plugin</artifactId>
  66. </plugin>
  67. </plugins>
  68. </build>
  69. </project>
  70. ```
  71. ## MybatisPlusConfig.java
  72. ```java
  73. /**
  74. * <p>
  75. * mybatis-plus 配置
  76. * </p>
  77. *
  78. * @package: com.xkcoding.orm.mybatis.plus.config
  79. * @description: mybatis-plus 配置
  80. * @author: yangkai.shen
  81. * @date: Created in 2018/11/8 17:29
  82. * @copyright: Copyright (c) 2018
  83. * @version: V1.0
  84. * @modified: yangkai.shen
  85. */
  86. @Configuration
  87. @MapperScan(basePackages = {"com.xkcoding.orm.mybatis.plus.mapper"})
  88. @EnableTransactionManagement
  89. public class MybatisPlusConfig {
  90. /**
  91. * 性能分析拦截器,不建议生产使用
  92. */
  93. @Bean
  94. public PerformanceInterceptor performanceInterceptor(){
  95. return new PerformanceInterceptor();
  96. }
  97. /**
  98. * 分页插件
  99. */
  100. @Bean
  101. public PaginationInterceptor paginationInterceptor() {
  102. return new PaginationInterceptor();
  103. }
  104. }
  105. ```
  106. ## CommonFieldHandler.java
  107. ```java
  108. package com.xkcoding.orm.mybatis.plus.config;
  109. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  110. import lombok.extern.slf4j.Slf4j;
  111. import org.apache.ibatis.reflection.MetaObject;
  112. import org.springframework.stereotype.Component;
  113. import java.util.Date;
  114. /**
  115. * <p>
  116. * 通用字段填充
  117. * </p>
  118. *
  119. * @package: com.xkcoding.orm.mybatis.plus.config
  120. * @description: 通用字段填充
  121. * @author: yangkai.shen
  122. * @date: Created in 2018/11/8 17:40
  123. * @copyright: Copyright (c) 2018
  124. * @version: V1.0
  125. * @modified: yangkai.shen
  126. */
  127. @Slf4j
  128. @Component
  129. public class CommonFieldHandler implements MetaObjectHandler {
  130. @Override
  131. public void insertFill(MetaObject metaObject) {
  132. log.info("start insert fill ....");
  133. this.setFieldValByName("createTime", new Date(), metaObject);
  134. this.setFieldValByName("lastUpdateTime", new Date(), metaObject);
  135. }
  136. @Override
  137. public void updateFill(MetaObject metaObject) {
  138. log.info("start update fill ....");
  139. this.setFieldValByName("lastUpdateTime", new Date(), metaObject);
  140. }
  141. }
  142. ```
  143. ## application.yml
  144. ```yaml
  145. spring:
  146. datasource:
  147. url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
  148. username: root
  149. password: root
  150. driver-class-name: com.mysql.cj.jdbc.Driver
  151. type: com.zaxxer.hikari.HikariDataSource
  152. initialization-mode: always
  153. continue-on-error: true
  154. schema:
  155. - "classpath:db/schema.sql"
  156. data:
  157. - "classpath:db/data.sql"
  158. hikari:
  159. minimum-idle: 5
  160. connection-test-query: SELECT 1 FROM DUAL
  161. maximum-pool-size: 20
  162. auto-commit: true
  163. idle-timeout: 30000
  164. pool-name: SpringBootDemoHikariCP
  165. max-lifetime: 60000
  166. connection-timeout: 30000
  167. logging:
  168. level:
  169. com.xkcoding: debug
  170. com.xkcoding.orm.mybatis.plus.mapper: trace
  171. mybatis-plus:
  172. mapper-locations: classpath:mappers/*.xml
  173. #实体扫描,多个package用逗号或者分号分隔
  174. typeAliasesPackage: com.xkcoding.orm.mybatis.plus.entity
  175. global-config:
  176. # 数据库相关配置
  177. db-config:
  178. #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
  179. id-type: auto
  180. #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
  181. field-strategy: not_empty
  182. #驼峰下划线转换
  183. table-underline: true
  184. #是否开启大写命名,默认不开启
  185. #capital-mode: true
  186. #逻辑删除配置
  187. #logic-delete-value: 1
  188. #logic-not-delete-value: 0
  189. db-type: mysql
  190. #刷新mapper 调试神器
  191. refresh: true
  192. # 原生配置
  193. configuration:
  194. map-underscore-to-camel-case: true
  195. cache-enabled: true
  196. ```
  197. ## UserMapper.java
  198. ```java
  199. /**
  200. * <p>
  201. * UserMapper
  202. * </p>
  203. *
  204. * @package: com.xkcoding.orm.mybatis.plus.mapper
  205. * @description: UserMapper
  206. * @author: yangkai.shen
  207. * @date: Created in 2018/11/8 16:57
  208. * @copyright: Copyright (c) 2018
  209. * @version: V1.0
  210. * @modified: yangkai.shen
  211. */
  212. @Component
  213. public interface UserMapper extends BaseMapper<User> {
  214. }
  215. ```
  216. ## UserService.java
  217. ```java
  218. /**
  219. * <p>
  220. * User Service
  221. * </p>
  222. *
  223. * @package: com.xkcoding.orm.mybatis.plus.service
  224. * @description: User Service
  225. * @author: yangkai.shen
  226. * @date: Created in 2018/11/8 18:10
  227. * @copyright: Copyright (c) 2018
  228. * @version: V1.0
  229. * @modified: yangkai.shen
  230. */
  231. public interface UserService extends IService<User> {
  232. }
  233. ```
  234. ## UserServiceImpl.java
  235. ```java
  236. /**
  237. * <p>
  238. * User Service
  239. * </p>
  240. *
  241. * @package: com.xkcoding.orm.mybatis.plus.service.impl
  242. * @description: User Service
  243. * @author: yangkai.shen
  244. * @date: Created in 2018/11/8 18:10
  245. * @copyright: Copyright (c) 2018
  246. * @version: V1.0
  247. * @modified: yangkai.shen
  248. */
  249. @Service
  250. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  251. }
  252. ```
  253. ## UserServiceTest.java
  254. ```java
  255. /**
  256. * <p>
  257. * User Service 测试
  258. * </p>
  259. *
  260. * @package: com.xkcoding.orm.mybatis.plus.service
  261. * @description: User Service 测试
  262. * @author: yangkai.shen
  263. * @date: Created in 2018/11/8 18:13
  264. * @copyright: Copyright (c) 2018
  265. * @version: V1.0
  266. * @modified: yangkai.shen
  267. */
  268. @Slf4j
  269. public class UserServiceTest extends SpringBootDemoOrmMybatisPlusApplicationTests {
  270. @Autowired
  271. private UserService userService;
  272. /**
  273. * 测试Mybatis-Plus 新增
  274. */
  275. @Test
  276. public void testSave() {
  277. String salt = IdUtil.fastSimpleUUID();
  278. User testSave3 = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).build();
  279. boolean save = userService.save(testSave3);
  280. Assert.assertTrue(save);
  281. log.debug("【测试id回显#testSave3.getId()】= {}", testSave3.getId());
  282. }
  283. /**
  284. * 测试Mybatis-Plus 批量新增
  285. */
  286. @Test
  287. public void testSaveList() {
  288. List<User> userList = Lists.newArrayList();
  289. for (int i = 4; i < 14; i++) {
  290. String salt = IdUtil.fastSimpleUUID();
  291. User user = User.builder().name("testSave" + i).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + i + "@xkcoding.com").phoneNumber("1730000000" + i).status(1).lastLoginTime(new DateTime()).build();
  292. userList.add(user);
  293. }
  294. boolean batch = userService.saveBatch(userList);
  295. Assert.assertTrue(batch);
  296. List<Long> ids = userList.stream().map(User::getId).collect(Collectors.toList());
  297. log.debug("【userList#ids】= {}", ids);
  298. }
  299. /**
  300. * 测试Mybatis-Plus 删除
  301. */
  302. @Test
  303. public void testDelete() {
  304. boolean remove = userService.removeById(1L);
  305. Assert.assertTrue(remove);
  306. User byId = userService.getById(1L);
  307. Assert.assertNull(byId);
  308. }
  309. /**
  310. * 测试Mybatis-Plus 修改
  311. */
  312. @Test
  313. public void testUpdate() {
  314. User user = userService.getById(1L);
  315. Assert.assertNotNull(user);
  316. user.setName("MybatisPlus修改名字");
  317. boolean b = userService.updateById(user);
  318. Assert.assertTrue(b);
  319. User update = userService.getById(1L);
  320. Assert.assertEquals("MybatisPlus修改名字", update.getName());
  321. log.debug("【update】= {}", update);
  322. }
  323. /**
  324. * 测试Mybatis-Plus 查询单个
  325. */
  326. @Test
  327. public void testQueryOne() {
  328. User user = userService.getById(1L);
  329. Assert.assertNotNull(user);
  330. log.debug("【user】= {}", user);
  331. }
  332. /**
  333. * 测试Mybatis-Plus 查询全部
  334. */
  335. @Test
  336. public void testQueryAll() {
  337. List<User> list = userService.list(new QueryWrapper<>());
  338. Assert.assertTrue(CollUtil.isNotEmpty(list));
  339. log.debug("【list】= {}", list);
  340. }
  341. /**
  342. * 测试Mybatis-Plus 分页排序查询
  343. */
  344. @Test
  345. public void testQueryByPageAndSort() {
  346. initData();
  347. int count = userService.count(new QueryWrapper<>());
  348. Page<User> userPage = new Page<>(1, 5);
  349. userPage.setDesc("id");
  350. IPage<User> page = userService.page(userPage, new QueryWrapper<>());
  351. Assert.assertEquals(5, page.getSize());
  352. Assert.assertEquals(count, page.getTotal());
  353. log.debug("【page.getRecords()】= {}", page.getRecords());
  354. }
  355. /**
  356. * 测试Mybatis-Plus 自定义查询
  357. */
  358. @Test
  359. public void testQueryByCondition() {
  360. initData();
  361. QueryWrapper<User> wrapper = new QueryWrapper<>();
  362. wrapper.like("name", "Save1").or().eq("phone_number", "17300000001").orderByDesc("id");
  363. int count = userService.count(wrapper);
  364. Page<User> userPage = new Page<>(1, 3);
  365. IPage<User> page = userService.page(userPage, wrapper);
  366. Assert.assertEquals(3, page.getSize());
  367. Assert.assertEquals(count, page.getTotal());
  368. log.debug("【page.getRecords()】= {}", page.getRecords());
  369. }
  370. /**
  371. * 初始化数据
  372. */
  373. private void initData() {
  374. testSaveList();
  375. }
  376. }
  377. ```
  378. ## 2019-09-14新增
  379. ### ActiveRecord 模式
  380. - Role.java
  381. ```java
  382. /**
  383. * <p>
  384. * 角色实体类
  385. * </p>
  386. *
  387. * @author yangkai.shen
  388. * @date Created in 2019/9/16 14:04
  389. */
  390. @Data
  391. @TableName("orm_role")
  392. @Accessors(chain = true)
  393. @EqualsAndHashCode(callSuper = true)
  394. public class Role extends Model<Role> {
  395. /**
  396. * 主键
  397. */
  398. private Long id;
  399. /**
  400. * 角色名
  401. */
  402. private String name;
  403. /**
  404. * 主键值,ActiveRecord 模式这个必须有,否则 xxById 的方法都将失效!
  405. * 即使使用 ActiveRecord 不会用到 RoleMapper,RoleMapper 这个接口也必须创建
  406. */
  407. @Override
  408. protected Serializable pkVal() {
  409. return this.id;
  410. }
  411. }
  412. ```
  413. - RoleMapper.java
  414. ```java
  415. /**
  416. * <p>
  417. * RoleMapper
  418. * </p>
  419. *
  420. * @author yangkai.shen
  421. * @date Created in 2019/9/16 14:06
  422. */
  423. public interface RoleMapper extends BaseMapper<Role> {
  424. }
  425. ```
  426. - ActiveRecordTest.java
  427. ```java
  428. /**
  429. * <p>
  430. * Role
  431. * </p>
  432. *
  433. * @author yangkai.shen
  434. * @date Created in 2019/9/16 14:19
  435. */
  436. @Slf4j
  437. public class ActiveRecordTest extends SpringBootDemoOrmMybatisPlusApplicationTests {
  438. /**
  439. * 测试 ActiveRecord 插入数据
  440. */
  441. @Test
  442. public void testActiveRecordInsert() {
  443. Role role = new Role();
  444. role.setName("VIP");
  445. Assert.assertTrue(role.insert());
  446. // 成功直接拿会写的 ID
  447. log.debug("【role】= {}", role);
  448. }
  449. /**
  450. * 测试 ActiveRecord 更新数据
  451. */
  452. @Test
  453. public void testActiveRecordUpdate() {
  454. Assert.assertTrue(new Role().setId(1L).setName("管理员-1").updateById());
  455. Assert.assertTrue(new Role().update(new UpdateWrapper<Role>().lambda().set(Role::getName, "普通用户-1").eq(Role::getId, 2)));
  456. }
  457. /**
  458. * 测试 ActiveRecord 查询数据
  459. */
  460. @Test
  461. public void testActiveRecordSelect() {
  462. Assert.assertEquals("管理员", new Role().setId(1L).selectById().getName());
  463. Role role = new Role().selectOne(new QueryWrapper<Role>().lambda().eq(Role::getId, 2));
  464. Assert.assertEquals("普通用户", role.getName());
  465. List<Role> roles = new Role().selectAll();
  466. Assert.assertTrue(roles.size() > 0);
  467. log.debug("【roles】= {}", roles);
  468. }
  469. /**
  470. * 测试 ActiveRecord 删除数据
  471. */
  472. @Test
  473. public void testActiveRecordDelete() {
  474. Assert.assertTrue(new Role().setId(1L).deleteById());
  475. Assert.assertTrue(new Role().delete(new QueryWrapper<Role>().lambda().eq(Role::getName, "普通用户")));
  476. }
  477. }
  478. ```
  479. ## 参考
  480. - mybatis-plus官方文档:http://mp.baomidou.com/

一个用来深度学习并实战 spring boot 的项目,目前总共包含 66 个集成demo,已经完成 55 个。