MybatisPlus学习

        创建一个 Springboot项目

            导入数据库驱动  MybatisPlus驱动  lombok  驱动

        
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

注意导入mybatisplus 就不要导入mybatis驱动 有可能会出现jar包冲突

    springboot 配置文件配置数据库参数

# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=root

Mysql 8 必须配置配置时区  

驱动为  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

传统Mybatis 

创建Mapper接口 创建mapper.xml文件 

mybatisplus

继承 BaseMapper<User>  里面传要返回的泛型   

 

 

注意  @MapperScan("com.huxin.mapper")主类添加这个注解扫描

配置日志查看底层sql的执行

 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

控制台输出

实现增删改查

INSERT

  User user = new User();
        user.setAge(21);
        user.setEmail("1111164@qq.com");
        user.setName("周杰伦");
        int insert = userMapper.insert(user);
        System.out.println(insert);
        System.out.println(user);

发现一个问题  我们并没有设置用户的id属性 但是还是吧这个用户插入进去  查看发现 mybatisplus帮我们自动添加了  id

主键生成策略(雪花算法)

https://zhuanlan.zhihu.com/p/85837641

如果要使用主键自增的话 使用在实体类的主键上注解@TableId(type = IdType.AUTO)

数据必须要设置主键自增

UPDATE

        User user = new User();
        user.setId(6l);
        user.setAge(22);
        user.setEmail("1111164@qq.com");
        user.setName("21");
       userMapper.updateById(user);
        System.out.println(user);

 updateById(user) 传入User对象    会自动拼接Sql 

自动填充处理

数据库添加二个字段

 实体类中也相应的添加二个属性

private Date createTime;
private Date updateTime;

在需要填充的属性上添加二个注解

@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT_UPDATE)

 创建一个配置类实现MetaObjectHandler接口 重写

insertFill() updateFill()二个方法

注意别忘记在类上添加注释@Component 吧类放入ioc容器中

乐观锁

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量。

首先在数据库中添加字段

 实体类中添加相对应的属性和注解 注意导包是导的mybatisplus的包

 注册组件 新建一个类

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
    //注册乐观锁插件
    @Bean
   public OptimisticLockerInterceptor optimisticLockerInterceptor(){
       return new OptimisticLockerInterceptor();
   }

}

测试

 void  testOptimisticLockerEeor(){
        User user = userMapper.selectById(1);
        user.setName("胡鑫修改2");
        user.setAge(22);
        new Thread(new Runnable() {
            @Override
            public void run() {
                User user2 = userMapper.selectById(1);
                user2.setName("胡鑫新线程");
                user2.setAge(21);
                userMapper.updateById(user2);
            }
        }).start();

        userMapper.updateById(user);

    }

新建一个线程修改  发现

修改的数据还是新线程里面执行并没有被覆盖

select 查询

查询一个用户 

   selectById() 传入id 根据id查找一个用户 返回一个实体类

     User user = userMapper.selectById(1);

批量查询用户

          传入一个数组返回一个泛型实体类的list集合

List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));

条件查询

  HashMap<String, Object> map = new HashMap<>();
        //自定义要查询的条件
        map.put("name","周杰伦");
        map.put("id","1425279305811439617");
        List<User> users = userMapper.selectByMap(map);

map里传入想要查询的条件放进selectByMa()里返回一个泛型为User的一个集合

分页

        配置类里配置

@Bean
 public PaginationInterceptor paginationInterceptor(){
     return new PaginationInterceptor();
}
/参数 1:当前页
//参数 2:页面大小
Page<User> page = new Page<>(1,2);
Page<User> userPage = userMapper.selectPage(page, null);
page.getTotal()查询一共多少条数据

Delete 删除

userMapper.deleteById(1425279305811439618l);根据id删除
userMapper.deleteBatchIds(Arrays.asList(1,2,3));批量删除
HashMap<String, Object> map = new HashMap<>();
//删除的条件
map.put("name","周杰伦");
userMapper.deleteByMap(map);  根据map传参删除

  

逻辑删除  (伪删除)

现在数据库表中增加字段deletede 

实体类中添加属性添加注解即可 不需要在配置类中配置

在配置文件中

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

 查看了一下sql执行记录 发现走的是update语句 只是修改了字段

 但我们执行查询这条语句并不能查询到

 因为查询的时候后面给我们拼接了一个字符串

条件构造器 wrapper

查询某个字段不为空并且age大于21

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
        .isNotNull("email")
        .isNotNull("name")//该字段不为空的的
        .ge("age",21);//年龄大于20

userMapper.selectList(wrapper).forEach(System.out::println);
查询 name =胡鑫的单条数据
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","胡鑫");
System.out.println(userMapper.selectOne(wrapper));
查询年龄在20-30岁之间的数
 QueryWrapper<User> wrapper = new QueryWrapper<>();
 wrapper.between("age",20,30);
 System.out.println(userMapper.selectCount(wrapper));
模糊查询
 QueryWrapper<User> wrapper = new QueryWrapper<>();
 wrapper.notLike("name","周");
 List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
 maps.forEach(System.out::println);
//子查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id","select id from user where id<3")
;
List<Object> objects = userMapper.selectObjs(wrapper);
for (Object object : objects) {
    System.out.println(object);
}
//通过id排序查询
  QueryWrapper<User> wrapper = new QueryWrapper<>();
  //wrapper.orderByDesc("id");//降序
  wrapper.orderByAsc("id");//升序
userMapper.selectList(wrapper).forEach(System.out::println);

代码生成器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值