MyBatis-Plus 无需编写SQL,但是一些复杂的SQL还需要我们手动编写。
基于SpringBoot下的测试。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>8source>
<target>8target>
configuration>
plugin>
plugins>
build>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.5.RELEASEversion>
<relativePath/>
parent>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.16version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.16version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.0.5version>
dependency>
dependencies>
# 配置数据库连接
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/question_bank?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
@TableId(type = IdType.AUTO) //指定主键生成策略
//主键生成方式有:uuid、自增id、雪花算法、redis、zookeeper
private Integer id;
private String username;
private String password;
private String email;
private String gender;
private Integer role;
// public enum IdType{
// AUTO(0), 自增ID,使用较多,数据库必须也是 auto increment
// NONE(1), 数据库不使用主键,一般不会
// INPUT(2), 手动输入,必须手动输入id,否则不能获取自增列,
// (虽然数据库端设置auto increment也会添加成功,但是后台无法获取自增id)
// ID_WORKER(30), 局唯一ID,默认type,会由雪花算法生成155464464646好多位数
// UUID(4), 全局唯一 UUID
// ID_Woeker_STR(5); 字符串表示法
// }
}
@Repository //代表持久层,将bean的创建交给Ioc管理
public interface UserMapper extends BaseMapper<User> {
}
实现BaseMapper接口便能自动替我们完成一些简单的CRUD操作
import com.lg.dto.User;
import com.lg.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
/**
* Author:LiuGang
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisTest {
@Autowired
private UserMapper userMapper;
//1、测试查询
@Test
public void contextLoad(){
//(1)查询所有----------------------------------------------
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
//(2)根据id查询单个----------------------------------------
//User user=userMapper.selectById(1);
//(3)查询多个----------------------------------------------
//List u = userMapper.selectBatchIds(Arrarys.asList(1,2,3));
//(4)自定义条件 Map 查询------------------------------------
//Map map=new HashMap();
//构建查询条件
//map.put("username","kobe");
//map.put("password","123456");
//List u =userMapper.selectByMap(map);
//MyBatis-Plus在执行该方法时会自动创建动态SQL,where username='kobe' and password='123456' ;
}
//2、测试添加
@Test
public void addUser(){
User user=new User(null, "wang", "123456", "[email protected]", "男", 2);
//添加成功会自动获取自增主键,自增主键默认由雪花算法生成,一般不用,可在实体类上方加@TableId注解定义主键生成策略
int row = userMapper.insert(user);
System.out.println("自动生成的主键:"+user.getId());
}
//3、测试删除
@Test
public void deleteUser(){
//(1)根据主键ID删除
//int row = userMapper.deleteById(15);
//(2)批量删除
List<Integer> list=new ArrayList<Integer>(2);
list.add(15);
list.add(16);
int row = userMapper.deleteBatchIds(list);
String ret=row>=1?"成功":"失败";
System.out.println("删除结果:"+ret);
}
//4、测试修改
@Test
public void updateUser(){
int row = userMapper.updateById(new User(16, "wang", "8888888", "[email protected]", "男", 2));
String ret=row>=1?"成功":"失败";
System.out.println("修改结果:"+ret);
}
/**
* 雪花算法:
* snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
* 其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit是机器的ID),
* 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID)
* 最后还有一个符号位,永远是0。可以保证几乎全球唯一
*/
}
对于单表下的相对复杂的条件查询,MyBatis-Plus 中也封装好了相对应的方法,这些方法便是来源于核心类——QueryWrapper。其本质也是此框架在执行过程中为你动态拼接好了SQL而已。如何使用?都封装了哪些方法?以下为你演示!
1、isNotNull()——非空
2、ge()——great then or equal to 大于等于
/**
* 1、查询 role 是非空的,version >=2;
*/
@Test
public void m1() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.isNotNull("role")
.ge("version", 2); // ge=>great then or equal to (大于等于)
//查询
List<User> list = userMapper.selectList(wrapper);
//遍历结果
list.forEach(System.out::println);
}
分析查询结果:
3、selectOne(Wrapper wrapper)——查询一条记录
4、eq()——等于
/**
* 查询一条记录,名字等于 wang
*/
@Test
public void m2() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("username", "wang");
//查询并获取结果
User user= userMapper.selectOne(wrapper);
}
5、selectCount( Wrapper wrapper ) —— 获取wrapper条件下的总记录行数,Integer 类型
6、between()—— 在…之间的
/**
* 2、查询 version 在 3 和 7 之间的记录有几行(等到行数 Integer)
*/
@Test
public void m3() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.between("version", 3, 7);
//查询
Integer num= userMapper.selectCount(wrapper);
//打印结果
System.out.println("一共有"+num+"条记录的version在3~7之间");
}
7、like()——包含
8、notLike()——不包含
9、likeLeft()——左匹配
10、likeRight()——右匹配
11、selectMaps(Wrapper wrapper)——查出数据不以对象形式存储,以map形式
{password=1213131, deleted=0, gender=女, id=30, version=1, [email protected], username=ssss}
/**
* 4、模糊查询
*/
@Test
public void m4() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.notLike("username", "g") // AND username NOT LIKE '%g%'
.likeRight("password", "12"); // AND password LIKE '12%'
//查询
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
//打印结果
maps.forEach(System.out::println);
}
12、inSql()——自定义一个子查询作为查询条件
/**
* 5、自定义查询条件(使用子查询)
*/
@Test
public void m5() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.inSql("id", "select id from user where gender ='女'");
//查询
List<Object> list = userMapper.selectObjs(wrapper);
//打印结果
list.forEach(System.out::println);
}
13、orderByAsc()——升序排序
14、orderByDesc()——降序排序
/**
* 6、排序查询
*/
@Test
public void m6() {
//(查询包装)构建查询条件
QueryWrapper<User> wrapper=new QueryWrapper<>();
//wrapper.orderByAsc("version");
wrapper.orderByDesc("version");
//查询
//selectMaps --{password=1213131, deleted=0, gender=女, id=30, version=1, [email protected], username=ssss}
List<User> list = userMapper.selectList(wrapper);
//打印结果
list.forEach(System.out::println);
}
15、其他方法请查询 API