一 导入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); }
乐观锁
乐观锁认为自己不会出现问题,总是不上锁,如果出现了问题就去更新值测试.
悲观锁认为总是会出现问题,无论干什么都会上锁操作.