<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
1、建pojo
2、建mapper 继承BaseMapper
3、加扫描
@MapperScan("com.pfj.mybatisplustest.mapper")
@SpringBootApplication
public class MybatisplusTestApplication {
…
}
4、测试代码
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
插入
@Test
void insrtUser(){
User user = new User();
user.setAge(3);
user.setName("李克勤");
user.setEmail("[email protected]");
int id = userMapper.insert(user); //返回受影响的行数
}
id是雪花算法生成的
雪花算法:开源分布式ID生成算法。结果是long型ID, 全球唯一
主键自增,配置主键:
1、字段添加TableId
2、数据库字段设置自增
@TableId(type = IdType.INPUT)
private Long id ;
枚举:
AUTO(0), //数据库自增
NONE(1), // 未设置主键
INPUT(2), //手动输入id,不写会写成null
ASSIGN_ID(3), //
ASSIGN_UUID(4), //UUID
修改
@Test
void updateUser(){
User user = new User();
user.setId(1L);
user.setAge(30);
user.setName("谢霆锋");
user.setEmail("[email protected]");
userMapper.updateById(user);
}
删除
@Test
void deleteUser(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("id",5);
int id = userMapper.delete(wrapper);
System.out.println(id);
}
自动填充:
创建时间、修改时间等
1、数据库级别(不建议)
create_time、update_time

2、代码级别
(1)删除数据库的默认值,和自动更新
(2)加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
乐观锁:认为不会出问题,不去上锁,如果出了问题,再次更新值测试
悲观锁:认为一定会出问题,一定要上锁
加注解
@Version //乐观锁注解
private Integer version;
配置乐观锁
测试乐观锁测试成功:
@Test
public void testOptimisticLocke(){
//1、查询用户信息
User user = userMapper.selectById(8L);
//2、修改用户信息
user.setName("大哥哥啊");
user.setAge(35);
user.setEmail("[email protected]");
userMapper.updateById(user);
}
// 查询
@Test
public void testSelectBybatchId(){
//批量查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
users.forEach(System.out::println);
}
//条件查询
@Test
public void testSelecMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","刘德华");// A
map.put("age",12);//and B
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
//分页查询
//配置分页拦截器
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
// 分页查询
@Test
public void testPage(){
Page<User> page = new Page<>(2, 5);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
物理删除:从数据库删掉
逻辑删除:通过变量控制 deleted = 1 为删除
代码新增字段:
@TableLogic //逻辑删除 1删除0不删
private Integer deleted;
配置:
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
MP性能分析插件,输出每个sql语句以及执行时间
// 条件查询
@Test
public void query1(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.isNotNull("email")
.ge("age",60); //>=60
userMapper.selectList(wrapper);
}
// 查一条数据selectOne
@Test
public void query2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age",40);
// 查询一条数据
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
// 区间查询between
@Test
public void queryCount(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",40,60);// [40,60]
// 查询有多少数据
Integer count = userMapper.selectCount(wrapper);
System.out.println(count);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
// 模糊查询like
@Test
public void queryLike(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.likeRight("name","jack"); // like jack%
wrapper.likeLeft("name","jack"); // like %jack
wrapper.notLike("email","163.com"); //not like %jack%
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
// sql查询
@Test
public void querySql() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// id in (select id from user where id > 5) => id属于
wrapper.inSql("id", "select id from user where id > 5");
//SELECT id,name,age,email,create_time,update_time,version,deleted FROM user
// WHERE deleted=0 AND (id IN (select id from user where id > 5))
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
// orderby
@Test
public void queryOrder() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 先按照update_time倒序,再按照create_time倒序
wrapper.orderByDesc("update_time","create_time");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
QueryWrapper常用方法:
queryWrapper.lt()——小于
queryWrapper.le()——小于等于
queryWrapper.gt()——大于
queryWrapper.ge()——大于等于
queryWrapper.eq()——等于
queryWrapper.ne()——不等于
queryWrapper.betweeen(“age”,10,20)——age在值10到20之间
queryWrapper.notBetweeen(“age”,10,20)——age不在值10到20之间
queryWrapper.like(“属性”,“值”)——模糊查询匹配值‘%值%’
queryWrapper.notLike(“属性”,“值”)——模糊查询不匹配值‘%值%’
queryWrapper.likeLeft(“属性”,“值”)——模糊查询匹配最后一位值‘%值’
queryWrapper.likeRight(“属性”,“值”)——模糊查询匹配第一位值‘值%’
queryWrapper.isNull()——值为空或null
queryWrapper.isNotNull()——值不为空或null
queryWrapper.in(“属性”,条件,条件 )——符合多个条件的值
queryWrapper.notIn(“属性”,条件,条件 )——不符合多个条件的值
queryWrapper.or()——或者
queryWrapper.and()——和
queryWrapper.orderByAsc(“属性”)——根据属性升序排序
queryWrapper.orderByDesc(“属性”)——根据属性降序排序
queryWrapper.inSql(“sql语句”)——符合sql语句的值
queryWrapper.notSql(“sql语句”)——不符合SQL语句的值
queryWrapper.esists(“SQL语句”)——查询符合SQL语句的值
queryWrapper.notEsists(“SQL语句”)——查询不符合SQL语句的值
https://baomidou.com/pages/779a6e/ 官网地址
添加依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1</version>
</dependency>
// 代码:
public static void main(String[] args) {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
//import com.baomidou.mybatisplus.generator.config.GlobalConfig;
gc.setOutputDir(projectPath + "/src/main/java");
// System.out.println(projectPath + "/src/main/java");
gc.setAuthor("peifangjun");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(false); //重新生成时文件是否覆盖
gc.setServiceName("%sService"); //去掉Service接口的首字母I 默认service接口名IXXXService 自定义指定之后就不会用I开头了
gc.setIdType(IdType.ID_WORKER); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
// gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&charcterEncoding=utf-8&serverTimezone=GMT%2B8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 3、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("blog");// 模块名
pc.setParent("com.pfj");
pc.setEntity("pojo");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
// 设置包
mpg.setPackageInfo(pc);
// 4、设置策略
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user","books");
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true); //自动lombok
strategy.setLogicDeleteFieldName("deleted");
//自动填充策略
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill createUpdate = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> list = new ArrayList<>();
list.add(createTime);
list.add(createUpdate);
strategy.setTableFillList(list); // 自动填充
strategy.setVersionFieldName("version");// 乐观锁
strategy.setRestControllerStyle(true);//驼峰明明
strategy.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2
// 设置策略
mpg.setStrategy(strategy);
// 执行
mpg.execute();
}