经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
使用 Mybatis-plus 进行 crud 操作
来源:cnblogs  作者:Carlos_Ouyang  时间:2019/8/16 9:44:19  对本文有异议

1 Mybatis-Plus简介

1.1 什么是Mybatis-Plus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.2 为什么要学习Mybatis-Plus

我们已经学习过Mybatis这个框架,我们只需要在dao层定义抽象接口,基于Mybatis零实现的特性,就可以实现对数据库的crud操作。在业务类型比较多的时候,我们需要重复的定义一堆功能类似的接口方法。

使用Mybatis-plus工具,我们只需要将我们定义的抽象接口,继承一个公用的 BaseMapper<T> 接口,就可以获得一组通用的crud方法,来操作数据库。使用Mybatis-plus时,甚至都不需要任何的xml映射文件或者接口方法注解,真正的dao层零实现。

2 入门示例

2.1 需求

使用Mybatis-Plus实现对用户的crud操作。

2.2 配置步骤说明

  1. 搭建环境(创建项目、导入包)
  2. 配置Mybaits-Plus(基于Spring实现)
  3. 编写测试代码

2.3 配置步骤

2.3.1 第一步:搭建环境

2.3.1.1 数据库准备

  1. CREATE TABLE `tb_user` (
  2. `id` bigint(20) NOT NULL COMMENT '主键ID',
  3. `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  4. `age` int(11) DEFAULT NULL COMMENT '年龄',
  5. `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  6. PRIMARY KEY (`id`)
  7. )

2.3.1.2 说明

  1. Mybatis-Plus并没有提供单独的jar包,而是通过Maven(或者gradle)来管理jar依赖。
  2. Mybatis-Plus是基于Spring框架实现的,因此使用Mybatis-Plus,必须导入Spring相关依赖。

2.3.1.3 添加依赖

编写 pom 配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.oza.mybatisplus</groupId>
  7. <artifactId>mybatisplus-demo-start</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <!--mybatis-plus-->
  11. <dependency>
  12. <groupId>com.baomidou</groupId>
  13. <artifactId>mybatis-plus</artifactId>
  14. <version>3.1.2</version>
  15. </dependency>
  16. <!--spring 基础依赖-->
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-context</artifactId>
  20. <version>4.3.2.RELEASE</version>
  21. </dependency>
  22. <!--spring jdbc 依赖-->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-jdbc</artifactId>
  26. <version>4.3.2.RELEASE</version>
  27. </dependency>
  28. <!--spring test-->
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-test</artifactId>
  32. <version>4.3.2.RELEASE</version>
  33. </dependency>
  34. <!--mysql 驱动-->
  35. <dependency>
  36. <groupId>mysql</groupId>
  37. <artifactId>mysql-connector-java</artifactId>
  38. <version>8.0.16</version>
  39. </dependency>
  40. <!--连接池-->
  41. <dependency>
  42. <groupId>com.alibaba</groupId>
  43. <artifactId>druid</artifactId>
  44. <version>1.1.9</version>
  45. </dependency>
  46. <!--junit-->
  47. <dependency>
  48. <groupId>junit</groupId>
  49. <artifactId>junit</artifactId>
  50. <version>4.12</version>
  51. </dependency>
  52. </dependencies>
  53. </project>

2.3.2 第二步:创建User实体类

使用Mybatis-Plus可以不使用xml文件,而是基于一组注解来解决实体类和数据库表的映射问题。以下注解作用于实体类的字段声明上:

注解 含义
@TableName(value="tb_user") 指定对应的表,表名和类名一致时,可以省略value属性。
@TableId 指定表的主键。Value属性指定表的主键字段,和属性名一致时,可以省略。Type指定主键的增长策略。
@TableField 指定类的属性映射的表字段,名称一致时可以省略该注解。

源码如下:

  1. package org.oza.mybatisplus.pojo;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. @TableName("tb_user")
  7. public class User {
  8. @TableId(value = "u_id", type = IdType.AUTO)
  9. private Long id;
  10. @TableField("u_name")
  11. private String name;
  12. @TableField("u_age")
  13. private Integer age;
  14. @TableField("u_email")
  15. private String email;
  16. }

2.3.3 第三步:创建UserMapper接口

只需要继承BaseMapper公共接口即可。

  1. package org.oza.mybatisplus.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import org.apache.ibatis.annotations.Result;
  4. import org.apache.ibatis.annotations.Results;
  5. import org.apache.ibatis.annotations.Select;
  6. import org.oza.mybatisplus.pojo.User;
  7. import java.util.List;
  8. public interface UserMapper extends BaseMapper<User> {
  9. /**
  10. * 自定义方法,展示所有用户的用户名
  11. * @return 用户名集合
  12. */
  13. @Select("select u_name from tb_user")
  14. List<String> listAllUsername();
  15. /**
  16. * 自定义方法,搜索所有用户的邮箱,并封装进 user 对象里
  17. * @return
  18. */
  19. @Select("select u_email from tb_user")
  20. @Results(
  21. @Result(column = "u_email", property = "email")
  22. )
  23. List<User> listAllEmail();
  24. }

2.3.4 第四步:配置 spring 配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx.xsd">
  12. <!--开启 spring 组件扫描-->
  13. <context:component-scan base-package="org.oza.mybatisplus"/>
  14. <!--1. 数据源-->
  15. <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  16. <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
  17. <property name="url" value="jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
  18. <property name="username" value="root"/>
  19. <property name="password" value="password"/>
  20. <property name="maxActive" value="10"/>
  21. <property name="minIdle" value="5"/>
  22. </bean>
  23. <!--2. mybatis-plus 整合 spring-->
  24. <bean name="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
  25. <!--加载数据源-->
  26. <property name="dataSource" ref="dataSource"/>
  27. <!--配置插件-->
  28. <property name="plugins">
  29. <array>
  30. <!--物理分页支持-->
  31. <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
  32. <!--SQL语句输出-->
  33. <bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor"/>
  34. </array>
  35. </property>
  36. </bean>
  37. <!--3. 配置 mybatis-plus 动态代理-->
  38. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  39. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
  40. <property name="basePackage" value="org.oza.mybatisplus.mapper"/>
  41. </bean>
  42. <!--4. 配置事务管理器-->
  43. <bean name="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  44. <property name="dataSource" ref="dataSource"/>
  45. </bean>
  46. <!--5. 开启事务注解支持,指定事务管理器-->
  47. <tx:annotation-driven transaction-manager="txManager"/>
  48. </beans>

2.3.5 第五步:编写测试代码

  1. package org.oza.mybatisplus;
  2. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import org.apache.ibatis.session.RowBounds;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.oza.mybatisplus.mapper.UserMapper;
  11. import org.oza.mybatisplus.pojo.User;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.test.context.ContextConfiguration;
  14. import org.springframework.test.context.TestExecutionListeners;
  15. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  16. import java.sql.SQLOutput;
  17. import java.util.List;
  18. @RunWith(SpringJUnit4ClassRunner.class)
  19. @ContextConfiguration("classpath:spring-mybatisplus.xml")
  20. public class CrudTest {
  21. @Autowired
  22. private UserMapper userMapper;
  23. /**
  24. * 插入一条数据
  25. */
  26. @Test
  27. public void insert() {
  28. User user = new User(null, "张无忌", 18, "zwj@qq.com");
  29. int insert = userMapper.insert(user);
  30. System.out.println("Affected rows: " + insert);
  31. }
  32. /**
  33. * 根据 ID 删除
  34. */
  35. @Test
  36. public void deleteById(){
  37. int delete = userMapper.deleteById(1);
  38. System.out.println("Affected rows: " + delete);
  39. }
  40. /**
  41. * 根据 ID 查询
  42. */
  43. @Test
  44. public void selectById() {
  45. User user = userMapper.selectById(1);
  46. System.out.println(user);
  47. }
  48. /**
  49. * 根据条件删除, 删除名字含 张 字的
  50. */
  51. @Test
  52. public void deleteByCondition(){
  53. QueryWrapper<User> userWrapper = new QueryWrapper<>();
  54. userWrapper.like("u_name", "张");
  55. int delete = userMapper.delete(userWrapper);
  56. System.out.println("Affected rows: " + delete);
  57. }
  58. /**
  59. * 根据 Id 进行修改,只修改不为空的数据
  60. */
  61. @Test
  62. public void update() {
  63. User user = new User(4L, null, 25, null);
  64. int update = userMapper.updateById(user);
  65. System.out.println("Affected rows: " + update);
  66. }
  67. /**
  68. * 批量修改,将所有名字含有 张 的都修改
  69. */
  70. @Test
  71. public void updateByCondition() {
  72. User user = new User(null, null, 25, null);
  73. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  74. updateWrapper.like("u_name", "张");
  75. int update = userMapper.update(user, updateWrapper);
  76. System.out.println("Affected rows: " + update);
  77. }
  78. /**
  79. * 根据条件查询,将所有名字带 张 的查出来
  80. */
  81. @Test
  82. public void selectByCondition() {
  83. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  84. queryWrapper.like("u_name", "张");
  85. List<User> users = userMapper.selectList(queryWrapper);
  86. users.forEach(user -> System.out.println(user));
  87. }
  88. /**
  89. * 分页查询,selectPage 可以传入两个参数
  90. * 参数 1:Page 对象,包含了分页信息,其构造方法参数
  91. * 参数 1:当前页,从 1 开始
  92. * 参数 2:页面容量
  93. * 参数 2:QueryWrapper 对象,设置搜索的条件
  94. * 结果:IPage 抽象类的子类对象,包含了一下信息:
  95. * 1. 当前页
  96. * 2. 总页数
  97. * 3. 总记录数
  98. * 4. 页面容量
  99. * 5. 当前页的记录
  100. */
  101. @Test
  102. public void selectByPage() {
  103. IPage iPage = userMapper.selectPage(new Page(1L, 2), null);
  104. System.out.println("current page: " + iPage.getCurrent());
  105. System.out.println("total pages: " + iPage.getPages());
  106. System.out.println("total records: " + iPage.getTotal());
  107. System.out.println("page size: " + iPage.getSize());
  108. System.out.println("records: " + iPage.getRecords());
  109. }
  110. /**
  111. * 自定义方法测试
  112. */
  113. @Test
  114. public void listAllUsername() {
  115. List<String> usernames = userMapper.listAllUsername();
  116. System.out.println(usernames);
  117. List<User> users = userMapper.listAllEmail();
  118. users.forEach(user -> System.out.println(user.getEmail()));
  119. }
  120. }

2.3.6 第六步:编写 Service 层

mybatis-plus 还提供了 Service 层的快速实现。同样不需要写任何实现方法,即可轻松构建 Service 层。

需要注意的是,service 层方法名和 dao 层的方法名有些许不同

编写 UserService 接口

  1. package org.oza.mybatisplus.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import org.oza.mybatisplus.pojo.User;
  4. /**
  5. * 继承 IService,泛型中写入 pojo 类
  6. */
  7. public interface UserService extends IService<User> {
  8. }

编写 UserServiceImpl 实现类

  1. package org.oza.mybatisplus.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import org.oza.mybatisplus.mapper.UserMapper;
  4. import org.oza.mybatisplus.pojo.User;
  5. import org.oza.mybatisplus.service.UserService;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * 继承 ServiceImpl,实现 UserService 接口
  9. * ServiceImpl:该类实现了 IService 接口,需要两个泛型参数
  10. * 参数1:对应的 Mapper 类
  11. * 参数2:对应的 Pojo 类
  12. */
  13. @Service
  14. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  15. }

测试代码

  1. /**
  2. * 使用 service 层执行分页查询
  3. */
  4. @Test
  5. public void serviceTest() {
  6. IPage iPage = userService.page(new Page(1L, 2), null);
  7. System.out.println("current page: " + iPage.getCurrent());
  8. System.out.println("total pages: " + iPage.getPages());
  9. System.out.println("total records: " + iPage.getTotal());
  10. System.out.println("page size: " + iPage.getSize());
  11. System.out.println("records: " + iPage.getRecords());
  12. }

原文链接:http://www.cnblogs.com/carlosouyang/p/11361882.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号