Mybatis-plus 基本⽤法
1.简介
官⽹:
MyBatis-Plus(简称 MP)是⼀个 MyBatis 的增强⼯具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提⾼效率⽽⽣。
2.⼊门
源码:github/zhongyushi-git/mybatis-plus-demo.git
2.1数据库准备
使⽤mysql数据库创建数据,执⾏脚本在根⽬录下的sql ⽬录下
2.2环境搭建
1)新建⼀个SpringBoot的项⽬,导⼊需要的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
2)yml 配置
#数据源配置
spring:
datasource:
#使⽤阿⾥巴巴的druid
type: com.alibaba.druid.pool.DruidDataSource
#配置数据库的路径和⽤户名密码
url: jdbc:mysql://127.0.0.1:3306/mybatisplus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true    username: root
password: zys 123456
2.3引⼊mybatis-plus开发
1)导⼊依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
2)创建实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
3)创建dao继承BaseMapper
s.mybatisplusdemo.dao;
import apper.BaseMapper;
ity.User;
public interface UserDao extends BaseMapper<User> {
}
4)在启动类上加mapper扫描
@SpringBootApplication
@MapperScan("batisplusdemo.dao")
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
}
5)创建controller
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserDao userDao;
@GetMapping("/list")
public List<User> userList(){
List<User> users = userDao.selectList(null);
return  users;
}
}
为了演⽰⽅便,这⾥省略了service的部分⽽直接调⽤了dao层,具体见源码。
如果添加了l,那么需要配置xml的位置,否则会出现⽆法绑定。
mybatis-plus.mapperLocations=classpath*:mapper /*.xml
6)测试
启动项⽬,访问即可看到所有的数据。
3.常⽤注解
3.1@TableName
其⽤来将实体对象与数据库表名进⾏对应。当实体名与数据库表名不⼀致时使⽤。
3.2@TableId
其是主键注解,指明是主键,默认把id作为主键。属性type⽤来指定类型:
1)IdType.AUTO是⾃动增长;
2)IdType.ASSIGN_UUID是String类型的uuid
3)IdType.INPUT 是根据⽤户的输⼊作为主键
3.3@TableField
其是表的其他字段注解。属性exist⽤来指明是否是数据库的字段,值为false 时不映射数据库表字段。详细的介绍见后续章节,这⾥的说明已供使⽤。
3.4注解开发
1)⾸先将数据库中表名改为t_user,然后实体User加上注解@TableName
@Data
@TableName(value = "t_user")
public class User {
......
}
启动项⽬,访问可以正常返回数据。
2)将数据库中表t_user的字段id改为t_id,然后修改实体User的属性id 并设置⾃动增长
@Data
@TableName(value = "t_user")
public class User {
/
/指定⾃动增长
@TableId(value = "t_id",type = IdType.AUTO)
private Long id;
3)将数据表t_user 的字段name 改为t_name ,然后修改实体User 的属性name
4)在实体User 上添加⼀个属性,设置不作为数据库的字段
启动项⽬,同上进⾏访问,数据正常返回。在实际开发过程中,可根据需求使⽤注解。
4.条件构造器
⽅法说明⽰例
eq 等于
allEq({id:1,name:"⽼王",age:null})--->id = 1 and name = '⽼王' and age is null allEq 全等于eq("name", "⽼王")--->name = '⽼王'ne 不等于ne("name", "⽼王")--->name <> '⽼王'
gt ⼤于gt("age", 18)--->age > 18ge ⼤于等于ge("age", 18)--->age >= 18lt ⼩于lt("age", 18)--->age < 18le ⼩于等于
le("age", 18)--->age <= 18
between BETWEEN 值1 AND 值2between("age", 18, 30)--->age between 18 and 30notBetween
NOT BETWEEN 值1 AND 值2
notBetween("age", 18, 30)--->age not between 18 and 30
like LIKE '%值%'like("name", "王")--->name like '%王%'notLike NOT LIKE '%值%'
notLike("name", "王")--->name not like '%王%'likeLeft LIKE '%值'likeLeft("name", "王")--->name like '%王'likeRight LIKE '值%'likeRight("name", "王")--->name like '王%'
isNull 字段为null isNull("name")--->name is null isNotNull
字段不为null isNotNull("name")--->name is not null in 同数据库in in("age",{1,2,3})--->age in (1,2,3)notIn
同数据库not in
notIn("age",{1,2,3})--->age not in (1,2,3)inSql 相当于⼦查询和in inSql("id", "select id from table where id < 3")--->
id in (select id from table where id < 3)
notInSql 相当于⼦查询和not in
notInSql("id", "select id from table where id < 3")--->
id not in (select id from table where id < 3)groupBy
同数据库group by
groupBy("id", "name")--->group by id,name
orderBy/orderByDesc
同数据库order by 字段/order by  字段 desc
orderBy("id")--->order by id ASC
having 同数据库having having("sum(age) > 10")--->having sum(age) > 10
or/and 同数据库or/and
netsted
正常嵌套 不带 AND 或者 OR
nested(i -> i.eq("name", "李⽩").ne("status", "活着"))--->(name = '李⽩' and status <> '活着')
apply 字符串拼接apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->
date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
last
拼接在最后,谨慎使⽤
last("limit 1")---> limit 1
exists/notExists
拼接sql
exists("select id from table where age = 1")--->exists (select id from table where age = 1)
select 指定要查询的字段
select("id", "name", "age")--->只查询这三个字段的内容set
全局修改
set("name", "")--->数据库字段值变为空字符串
5.CRUD 操作
只进⾏简单的介绍,具体需求请⾃⾏开发,都是在这个基础上进⾏的。需要说明的是,下⾯的增加和修改操作,只会根据对象中存在不为null 的属性来操作数据,当数据为null 时不会改变数据库中的数据。
5.1添加insert
5.2删除delete
根据主键删除
......}
@TableField(value = "t_name") private  String name;
//不映射数据库表字段
@TableField(exist = false)    private  String aaa;
@PostMapping("/")
public  String save(User user){
int  count = userDao.insert(user);        if (count!=0){
return  "添加成功";        }else {
return  "添加失败";        }    }
@DeleteMapping("/{id}")
public String delete(@PathVariable("id")long id){
int count = userDao.deleteById(id);
if(count!=0){
return"删除成功";
}else{
return"删除失败";
}
}
5.3修改update
根据id 进⾏修改
@PutMapping("/")
public String update(User user){
int count = userDao.updateById(user);
if(count!=0){
return"修改成功";
}else{
return"修改失败";
}
}
5.4简单查询
5.4.1selectList
在⼊门时,controller中设置的查询条件是null,实际上⾥⾯需要传递⼀个QueryWrapper<T>类型的对象,调⽤dao的selectList(),此对象中才有上⾯的那些⽅法。1)查询年龄⼤于等于24的信息
@GetMapping("/list")
public List<User> userList(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//设置查询条件
<("age",24);//查询年龄⼤于等于24的信息
List<User> users = userDao.selectList(queryWrapper);
return  users;
}
2)查询名字中含有‘o’的信息
queryWrapper.like("name","o");
5.4.2selectById
根据主键查询
@GetMapping("/{id}")
public User selectById(@PathVariable("id")long id){
return userDao.selectById(id);
}
5.4.3selectCount
查询符合条件的条数,⼀般和selectList 结合使⽤。
@GetMapping("/list")
public Map<String,Object> userList(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
/
/设置查询条件
queryWrapper.like("name","o");
List<User> users = userDao.selectList(queryWrapper);
Integer integer = userDao.selectCount(queryWrapper);
Map<String,Object> map=new HashMap<>();
map.put("data",users);
map.put("total",integer);
return  map;
}
5.5分页查询
5.5.1分页插件配置
新建⼀个类配置其分页
5.5.2单表分页查询
5.5.3单表⾃定义分页查询
有时使⽤默认的分页查询⽆法实现需要的功能时,可以⾃定义分页查询。先分析⼀下其⾃带的分页的⽅法,打开源码,看到接⼝中的selectPage ⽅法:
那么⾃定义也就是模仿其写法,步骤如下:1)在dao 的接⼝中定义⽅法
对第⼆个参数queryWrapper 使⽤了@Param 注解起别名,其名称使⽤的是常量的值(实际值是ew
isnull的用法
),常量的定义也是由官⽅定义好的,截图如下:
2)在xml 中编写sql
那么后⾯的条件就直接使⽤"${ew.customSqlSegment}"进⾏代替了,它会根据设置的条件去查询。5.5.4多表⾃定义分页查询
fig;
import sion.plugins.PaginationInterceptor;
import sion.plugins.pagination.optimize.JsqlParserCountOptimize;batis.spring.annotation.MapperScan;import t.annotation.Bean;
import t.annotation.Configuration;
import ansaction.annotation.EnableTransactionManagement;/**
* @Aauthor yushizhong  * @Date 2020/5/17 16:19 * @Dec MybatisPlus 分页配置 */
@EnableTransactionManagement @Configuration
@MapperScan("batisplusdemo.dao")public  class  MybatisPlusConfig {
@Bean
public  PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new  PaginationInterceptor();        return  paginationInterceptor;    }}
@GetMapping("/list")
public  IPage<User> userList(Integer curr,Integer limit){
QueryWrapper<User> queryWrapper = new  QueryWrapper<>();        //设置分页,默认值是1,10
IPage<User> page=new  Page<>(curr,limit);
IPage<User> user = userDao.selectPage(page, queryWrapper);        return  user;    }
<E extends adata.IPage<T>> E selectPage(E page,
@org.apache.ibatis.annotations.Param("ew") ditions.Wrapper<T> queryWrapper);
IPage<User> selectPageList(IPage<User> page, @Param(Constants.WRAPPER) QueryWrapper<User> queryWrapper);
<select  id="selectPageList" resultType="ity.User">        select  * from  user ${ew.customSqlSegment}    </select >

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。