Mybatis-plus

欲买桂花同载酒,终不似,少年游。

添加mybatis-plu依赖

<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

执行测试:
在这里插入图片描述

CRUD

插入

@Test
void insrtUser(){
    User user = new User();
    user.setAge(3);
    user.setName("李克勤");
    user.setEmail("9243435666@qq.com");
    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("9243435666@qq.com");
    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;

(3)编写处理器处理注解

在这里插入图片描述

乐观锁

乐观锁:认为不会出问题,不去上锁,如果出了问题,再次更新值测试
悲观锁:认为一定会出问题,一定要上锁

在这里插入图片描述
在这里插入图片描述

加注解

@Version //乐观锁注解
private Integer version; 

配置乐观锁

在这里插入图片描述

测试乐观锁测试成功:

@Test
public void testOptimisticLocke(){
    //1、查询用户信息
    User user = userMapper.selectById(8L);
    //2、修改用户信息
    user.setName("大哥哥啊");
    user.setAge(35);
    user.setEmail("986211@qq.com");
    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 为删除

新增字段deleted
在这里插入图片描述

代码新增字段:

@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语句以及执行时间

查询构造器QueryWrapper

// 条件查询
@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在值1020之间
queryWrapper.notBetweeen(“age”,10,20)——age不在值1020之间
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();
    }

生成:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值