使用 Mybatis-plus 进行 crud 操作
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 配置步骤说明
- 搭建环境(创建项目、导入包)
- 配置Mybaits-Plus(基于Spring实现)
- 编写测试代码
2.3 配置步骤
2.3.1 第一步:搭建环境
2.3.1.1 数据库准备
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
)
2.3.1.2 说明
- Mybatis-Plus并没有提供单独的jar包,而是通过Maven(或者gradle)来管理jar依赖。
- Mybatis-Plus是基于Spring框架实现的,因此使用Mybatis-Plus,必须导入Spring相关依赖。
2.3.1.3 添加依赖
编写 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.oza.mybatisplus</groupId>
<artifactId>mybatisplus-demo-start</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.2</version>
</dependency>
<!--spring 基础依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!--spring jdbc 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!--spring test-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
2.3.2 第二步:创建User实体类
使用Mybatis-Plus可以不使用xml文件,而是基于一组注解来解决实体类和数据库表的映射问题。以下注解作用于实体类的字段声明上:
| 注解 | 含义 |
|---|---|
| @TableName(value="tb_user") | 指定对应的表,表名和类名一致时,可以省略value属性。 |
| @TableId | 指定表的主键。Value属性指定表的主键字段,和属性名一致时,可以省略。Type指定主键的增长策略。 |
| @TableField | 指定类的属性映射的表字段,名称一致时可以省略该注解。 |
源码如下:
package org.oza.mybatisplus.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("tb_user")
public class User {
@TableId(value = "u_id", type = IdType.AUTO)
private Long id;
@TableField("u_name")
private String name;
@TableField("u_age")
private Integer age;
@TableField("u_email")
private String email;
}
2.3.3 第三步:创建UserMapper接口
只需要继承BaseMapper公共接口即可。
package org.oza.mybatisplus.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.oza.mybatisplus.pojo.User;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义方法,展示所有用户的用户名
* @return 用户名集合
*/
@Select("select u_name from tb_user")
List<String> listAllUsername();
/**
* 自定义方法,搜索所有用户的邮箱,并封装进 user 对象里
* @return
*/
@Select("select u_email from tb_user")
@Results(
@Result(column = "u_email", property = "email")
)
List<User> listAllEmail();
}
2.3.4 第四步:配置 spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启 spring 组件扫描-->
<context:component-scan base-package="org.oza.mybatisplus"/>
<!--1. 数据源-->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="maxActive" value="10"/>
<property name="minIdle" value="5"/>
</bean>
<!--2. mybatis-plus 整合 spring-->
<bean name="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<!--加载数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置插件-->
<property name="plugins">
<array>
<!--物理分页支持-->
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
<!--SQL语句输出-->
<bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor"/>
</array>
</property>
</bean>
<!--3. 配置 mybatis-plus 动态代理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<property name="basePackage" value="org.oza.mybatisplus.mapper"/>
</bean>
<!--4. 配置事务管理器-->
<bean name="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--5. 开启事务注解支持,指定事务管理器-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
2.3.5 第五步:编写测试代码
package org.oza.mybatisplus;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.session.RowBounds;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.oza.mybatisplus.mapper.UserMapper;
import org.oza.mybatisplus.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.sql.SQLOutput;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-mybatisplus.xml")
public class CrudTest {
@Autowired
private UserMapper userMapper;
/**
* 插入一条数据
*/
@Test
public void insert() {
User user = new User(null, "张无忌", 18, "zwj@qq.com");
int insert = userMapper.insert(user);
System.out.println("Affected rows: " + insert);
}
/**
* 根据 ID 删除
*/
@Test
public void deleteById(){
int delete = userMapper.deleteById(1);
System.out.println("Affected rows: " + delete);
}
/**
* 根据 ID 查询
*/
@Test
public void selectById() {
User user = userMapper.selectById(1);
System.out.println(user);
}
/**
* 根据条件删除, 删除名字含 张 字的
*/
@Test
public void deleteByCondition(){
QueryWrapper<User> userWrapper = new QueryWrapper<>();
userWrapper.like("u_name", "张");
int delete = userMapper.delete(userWrapper);
System.out.println("Affected rows: " + delete);
}
/**
* 根据 Id 进行修改,只修改不为空的数据
*/
@Test
public void update() {
User user = new User(4L, null, 25, null);
int update = userMapper.updateById(user);
System.out.println("Affected rows: " + update);
}
/**
* 批量修改,将所有名字含有 张 的都修改
*/
@Test
public void updateByCondition() {
User user = new User(null, null, 25, null);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.like("u_name", "张");
int update = userMapper.update(user, updateWrapper);
System.out.println("Affected rows: " + update);
}
/**
* 根据条件查询,将所有名字带 张 的查出来
*/
@Test
public void selectByCondition() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("u_name", "张");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(user -> System.out.println(user));
}
/**
* 分页查询,selectPage 可以传入两个参数
* 参数 1:Page 对象,包含了分页信息,其构造方法参数
* 参数 1:当前页,从 1 开始
* 参数 2:页面容量
* 参数 2:QueryWrapper 对象,设置搜索的条件
* 结果:IPage 抽象类的子类对象,包含了一下信息:
* 1. 当前页
* 2. 总页数
* 3. 总记录数
* 4. 页面容量
* 5. 当前页的记录
*/
@Test
public void selectByPage() {
IPage iPage = userMapper.selectPage(new Page(1L, 2), null);
System.out.println("current page: " + iPage.getCurrent());
System.out.println("total pages: " + iPage.getPages());
System.out.println("total records: " + iPage.getTotal());
System.out.println("page size: " + iPage.getSize());
System.out.println("records: " + iPage.getRecords());
}
/**
* 自定义方法测试
*/
@Test
public void listAllUsername() {
List<String> usernames = userMapper.listAllUsername();
System.out.println(usernames);
List<User> users = userMapper.listAllEmail();
users.forEach(user -> System.out.println(user.getEmail()));
}
}
2.3.6 第六步:编写 Service 层
mybatis-plus 还提供了 Service 层的快速实现。同样不需要写任何实现方法,即可轻松构建 Service 层。
需要注意的是,service 层方法名和 dao 层的方法名有些许不同
编写 UserService 接口
package org.oza.mybatisplus.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.oza.mybatisplus.pojo.User;
/**
* 继承 IService,泛型中写入 pojo 类
*/
public interface UserService extends IService<User> {
}
编写 UserServiceImpl 实现类
package org.oza.mybatisplus.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.oza.mybatisplus.mapper.UserMapper;
import org.oza.mybatisplus.pojo.User;
import org.oza.mybatisplus.service.UserService;
import org.springframework.stereotype.Service;
/**
* 继承 ServiceImpl,实现 UserService 接口
* ServiceImpl:该类实现了 IService 接口,需要两个泛型参数
* 参数1:对应的 Mapper 类
* 参数2:对应的 Pojo 类
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
测试代码
/**
* 使用 service 层执行分页查询
*/
@Test
public void serviceTest() {
IPage iPage = userService.page(new Page(1L, 2), null);
System.out.println("current page: " + iPage.getCurrent());
System.out.println("total pages: " + iPage.getPages());
System.out.println("total records: " + iPage.getTotal());
System.out.println("page size: " + iPage.getSize());
System.out.println("records: " + iPage.getRecords());
}
使用 Mybatis-plus 进行 crud 操作的更多相关文章
- 使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作--基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- mybatis(二)执行CRUD操作的两种方式配置和注解
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...
- MyBatis学习总结_02_使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- 【转】MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
[转]MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作 上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据, ...
- Mybatis的学习总结二:使用Mybatis对表进行CRUD操作【参考】
一.使用Mybatis对表进行CRUD操作------基于XML的实现 1.定义SQL的映射文件 2.在conf.xml中进行注册. 2.创建测试类 [具体过程参考:Mybatis的学习总结一] 二. ...
- 【Mybatis】MyBatis对表执行CRUD操作(三)
本例在[Mybatis]MyBatis配置文件的使用(二)基础上继续学习对表执行CRUD操作 使用MyBatis对表执行CRUD操作 1.定义sql映射xml文件(EmployeeMapper.xml ...
随机推荐
- python-selenium视频教程分享
1.python电子书 2.课件 3.前段调试工具 4.文档资料 5.python-selenium课程列表 6.sele01-sele22 百度网盘连接:链接: https://pan.baidu. ...
- elasticsearch shield在java中的应用
官方文档:https://www.elastic.co/guide/en/shield/current/_using_elasticsearch_java_clients_with_shield.ht ...
- Apache Flink - 分布式运行环境
1.任务和操作链 下面的数据流图有5个子任务执行,因此有五个并行线程. 2.Job Managers, Task Managers, Clients Job Managers:协调分布式运行,他们安排 ...
- pwn学习日记Day17 《程序员的自我修养》读书笔记
静态链接章小结 本章首先学习了静态链接的第一步骤,即目标文件在被链接成最终可执行文件时,输入目标文件中的各段是如何被合并到输出文件中的,链接器如何为它们分配在输出文件中的空间和地址.一旦输入段中的最终 ...
- 一个U盘制作多个系统
写在前面:一个U盘可以装多个ghost系统,但不能装多个原版ISO系统. 一.一个U盘装多个ghost系统 下载老毛桃或电脑店U盘制作工具,点击一键制作U盘启动盘.然后将gho文件拷贝复制到U盘的GH ...
- Flutter用dio封装http网络请求,设置统一的请求地址、headers及处理返回内容
封装http请求是项目中经常需要做的,常用于设置通用请求地址.请求headers以及处理返回结果,例如在项目中开发地址.测试地址.上线地址是不一样的,当在封装的请求设置好默认地址之后只需要改一个地址而 ...
- 以太坊Geth通过私钥导入新地址到钱包步骤
Open TextEdit Paste key into TextEdit without any extra characters or quotations Save the file as pk ...
- XML解析思想
获取文档中的数据: 反序列化[巧记:反读] 把内存中的数据存储到文档中: 序列化[巧记:序写] XML解析思想 DOM: 就是将文档中的数据全部加载到内存,在内存中形成DOM树,然后对数据进行增删改查 ...
- numpy中flatten学习笔记
ndarray.flatten() 用法 用于返回一个折叠成一维的数组.该函数只能适用于numpy对象,即array或者mat,普通的list列表是不行的. 例子 # coding=utf-8 fro ...
- oracle赋予一个用户具有查询另一个用户所有表数据
一 以需要被查询的用户登录oracle(假如为A) B为要查询A用户下的表的用户 二 执行查询语句: select 'grant select on A.'|| tname ||' to B ...