一 导入jar包

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
 </dependency>
 <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.3.2</version>
  </dependency>
             

 

 

二  创建数据库连接

application.propertion

#使用com.mysql.cj.jdbc.Driver,这是高版本使用可以覆盖低版本,所以也可以用
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#此处添加  serverTimezone=UTC  否则报错
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=ture&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

 

三 创建实体类,不用get set方法 添加注解

package cn.lgy.springboot.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data//使用这个注解,
// 就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,
// 注解后在编译时会自动加进去。
@AllArgsConstructor//使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor//使用后创建一个无参构造函数
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

 

四  创建mpper 继承BaseMapper类重写方法,添加@Mapper或@Repository注解添加到容器中

package cn.lgy.springboot.mapper;

import cn.lgy.springboot.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

//@Repository//将对象注入到ioc容器中
@Mapper
public interface UserMapper extends BaseMapper<User> {

    //可以自己定义一些方法  用于特殊情况
}

 

五 在启动类上添加@MapperSean("cn.lgy.springboot.mapper")注解

package cn.lgy.springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//扫描mapper包
@MapperScan("cn.lgy.springboot.mapper")
@SpringBootApplication
public class SpringbootMybatispuleDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatispuleDemoApplication.class, args);
    }

}

  

在测试类测试

package cn.lgy.springboot;

import cn.lgy.springboot.domain.User;
import cn.lgy.springboot.mapper.UserMapper;
import org.junit.Assert;
import org.junit.jupiter.api.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.List;
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootMybatispuleDemoApplicationTests {

    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {
        List<User> users = userMapper.selectList(null);
        Assert.assertEquals(5, users.size());
        users.forEach(System.out::println);
    }

}

 

配置日志:

  通过配置日志来看控制台的SQL打印 在application.propertion文件中配置一下配置

#只是控制台输出的意思org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 

 插入数据时 mybatisplus会生成主键ID值

主键ID生成策略

一在实体类上的主键id属性上添加注解@TableId(type = IdType.AUTO )配置自增主键,同时数据库要设置主键自增

package cn.lgy.springboot.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data//使用这个注解,
// 就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,
// 注解后在编译时会自动加进去。
@AllArgsConstructor//使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor//使用后创建一个无参构造函数
public class User {
    //配置自增主键
    @TableId(type = IdType.AUTO )
    private Long id;
    private String name;
    private Integer age;
    private String email;

}

 此时测试插入操作就可以成功了  在测试类中添加测试代码

 @Test
    void  testInsert(){
        User user=new User();
        user.setName("刘阳");
        user.setAge(18);
        user.setEmail("1234@qq.com");
        int insert = userMapper.insert(user);
        System.out.println(insert);
        System.out.println(user);



    }

 

更新测试:

  还有一个方法叫update(),这个方法不是通过ID修改

 @Test
    public void testUpadte(){
        User user = new User();
        user.setId(5L);
        user.setName("张三");
        //通过ID更新数据库,传入对象参数
        userMapper.updateById(user);
    }

 

自动填充

  创建时间,修改时间这些操作都是自动化完成的,我们不希望手动更新

  阿里巴巴开发手册规范:所有的数据库表gmt_create,gmt_modified几乎所有的表都要配置上,而且需要自动化.

方式一:数据库级别

  在表中添加字段gmt_create,gmt_modified设置默认值为当前时间.   不建议使用

 

方式二 :代码级别

  1 在实体类对应字段添加注解@TableField(FieldFill.INSERT)  @TableField(FieldFill.INSERT_UPDATE)

  

package cn.lgy.springboot.domain;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data//使用这个注解,
// 就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,
// 注解后在编译时会自动加进去。
@AllArgsConstructor//使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor//使用后创建一个无参构造函数
public class User {
//    AUTO(0),配置自增主键
//    NONE(1),未设置主键
//    INPUT(2),手动输入,需要传入ID值,
//    ID_WORKER(3),默认全局唯一ID.
//    ID_WORKER_STR(3),ID_WORKER(3)的字符串表示
//    UUID(4);全局唯一ID,UUID
    @TableId(type = IdType.AUTO )
    private Long id;
    private String name;
    private Integer age;
    private String email;
    //获取插入时间
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;
    //获取修改时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;

}

 

  2.编写处理器处理注解.创建handler包 在这个包下编写MyMetaObjectHandler处理器

package cn.lgy.springboot.handle;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component//放进容器
@Slf4j//日志打印
public class MyMetaObjectHandle implements MetaObjectHandler {
//    插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("state insert fill....");
        //自动填充创建时间
        this.setFieldValByName("gmtCreate",new Date(),metaObject);
        //自动填充修改时间
        this.setFieldValByName("gmtModified",new Date(),metaObject);
    }


//    更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("state update fill....");
  //自动填充修改时间  
    this.setFieldValByName("gmtModified",new Date(),metaObject); } }

测试:

  @Test
    void  testInsert(){
        User user=new User();
        user.setName("刘YANG阳");
        user.setAge(18);
        user.setEmail("1234@qq.com");
        user.setGmtCreate(new Date());
        user.setGmtModified(new Date());
        int insert = userMapper.insert(user);
        System.out.println(insert);
        System.out.println(user);
    }

    @Test
    public void testUpadte(){
        User user = new User();
        user.setId(1295358685740044291l);
        user.setName("aaaaaaa");
        //通过ID更新数据库,传入对象参数
        userMapper.updateById(user);
    }

 乐观锁

  乐观锁认为自己不会出现问题,总是不上锁,如果出现了问题就去更新值测试.

  悲观锁认为总是会出现问题,无论干什么都会上锁操作.

 

posted on 2020-08-17 20:26  ¥简竹¥  阅读(133)  评论(0编辑  收藏  举报