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 12 kB

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

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

Contributors (1)