筆記
1.創建數據庫
create table jpa_user ( id bigint not null comment '主鍵ID' primary key, name varchar(30) comment '姓名', age int comment '年齡', email varchar(50) comment '郵箱', created_time datetime, last_modified_time datetime, version bigint default 1 , is_deleted bigint default 0 );
create table plus_user
(
id bigint not null comment '主鍵ID' primary key, name varchar(30) comment '姓名', age int comment '年齡', email varchar(50) comment '郵箱', created_time datetime, last_modified_time datetime, version bigint default 1 , is_deleted bigint default 0 );
--添加數據--
2.創建spring-boot項目導入依賴
2-1 mybatis-plus

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
2-2 jpa

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.配置文件application.properties
3-1 mybatis-plus
# 配置數據源 spring.datasource.url=jdbc:mysql://localhost/orm_test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 配置mybatis-plus mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3-2 jpa
# 配置數據源 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost/orm_test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 # 配置jpa(hibernate) # 默認false,在日志里顯示執行的sql語句 spring.jpa.show-sql=true spring.jpa.database=mysql # 指定為update,每次啟動項目檢測表結構有變化的時候會新增字段, # 表不存在時會新建,如果指定create,則每次啟動項目都會清空數據並刪除表,再新建 spring.jpa.hibernate.ddl-auto=update # 配置方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.properties.hibernate.form_sql=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect # 指定jpa的自動表生成策略,駝峰自動映射為下划線格式 spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl logging.level.org.hibernate.SQL=debug logging.level.org.hibernate.engine.QueryParameters=debug logging.level.org.hibernate.engine.query.HQLQueryPlan=debug logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace
4.編寫實體類映射數據庫表和字段
4-1 mybatis-plus
@Data @ToString @NoArgsConstructor @TableName(value = "plus_user") @Accessors(chain = true) public class User { @TableId(type = IdType.ID_WORKER) private Long id; @TableField("name") private String name; @TableField("age") private int age; @TableField("email") private String email; @TableField(value = "created_time",fill = FieldFill.INSERT) private Date createdTime; @TableField(value = "last_modified_time",fill = FieldFill.INSERT_UPDATE) private Date lastModifiedTime; @TableField(value = "version") @Version private Long version; @TableField(value = "is_deleted") @TableLogic(value = "0",delval = "1") private Long isDeleted; }
4-2 jpa
@Data @ToString @NoArgsConstructor @Table(name = "jpa_user") @Accessors(chain = true) @Entity @EntityListeners(AuditingEntityListener.class) // 自動填充 @SQLDelete(sql = "update jpa_user set is_deleted = 1 where id = ?") // 邏輯刪除 @Where(clause = "is_deleted = 0") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "name") private String name; @Column(name = "age") private int age; @Column(name = "email") private String email; @CreatedDate @Column(name = "created_time") private Date createdTime; @LastModifiedDate @Column(name = "last_modified_time") private Date lastModifiedTime; @Version @Column(name = "version") private Long version; @Column(name = "is_deleted") private Long isDeleted; }
5.dao層
5-1 mybatis-plus
@Mapper public interface UserMapper extends BaseMapper<User> { }
5-2 jpa
@Repository public interface UserRepository extends JpaRepository<User,Long>, JpaSpecificationExecutor<User> { }
6.其他需要不同的配置
6-1 mybatis-plus
配置插件
@Configuration public class MybatisPlusConfig { // 樂觀鎖插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } // sql注入插件 @Bean public ISqlInjector sqlInjector(){ return new DefaultSqlInjector(); } // 分頁插件 @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
配置時間自動填充
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { setFieldValByName("createdTime", new Date(),metaObject); setFieldValByName("lastModifiedTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { setFieldValByName("lastModifiedTime",new Date(),metaObject); } }
6-2 jpa
jpa的自動填充需要在主類上添加注解@EnableJpaAuditing,在實體類上添加@EntityListeners(AuditingEntityListener.class)
@SpringBootApplication @EnableJpaAuditing public class JpaTestApplication { public static void main(String[] args) { SpringApplication.run(JpaTestApplication.class, args); } }
jpa的邏輯刪除需要在實體類上添加兩個注解描述(關於這個我沒有成功,查資料顯示是這么實現的,有解決的童鞋麻煩評論留個方案)
@SQLDelete(sql = "update jpa_user set is_deleted = 1 where id = ?") // 邏輯刪除 @Where(clause = "is_deleted = 0") public class User {
7.測試
7-1 mybati-plus

@SpringBootTest class MybatisPlusTestApplicationTests { @Autowired UserMapper userMapper; /** * mybatis-plus */ @Test void selectList() { List<User> list = userMapper.selectList(null); list.forEach(System.out::println); } @Test void add(){ /* * @Accessors(chain = true) * public class User { * */ userMapper.insert(new User().setAge(20).setEmail("xxx")); } @Test void selectById(){ User user = userMapper.selectById(2L); System.out.println(user); } @Test void update(){ User user = userMapper.selectById(1L); user.setName("用戶1").setAge(21).setEmail("yy"); userMapper.updateById(user); } @Test void delete(){ userMapper.deleteById(4L); } @Test void OptTest(){ User user = userMapper.selectById(1L); user.setEmail("111"); User user1 = userMapper.selectById(1L); userMapper.update(user1,null); userMapper.update(user,null); } @Test void pageSelect(){ Page<User> page = new Page<>(1,3); IPage<User> userIPage = userMapper.selectPage(page, null); List<User> list = userIPage.getRecords(); list.forEach(System.out::println); } }
7-2 jpa

@SpringBootTest class JpaTestApplicationTests { @Autowired UserRepository userRepository; @Test void selectList() { List<User> list = userRepository.findAll(); list.forEach(System.out::println); } @Test @Transactional @Rollback(value = false) void add(){ /* * @Accessors(chain = true) * public class User { * */ userRepository.save(new User().setName("lb").setAge(20).setEmail("xxx")); } @Test @Transactional void selectById(){ User user = userRepository.getOne(2L); System.out.println(user); } @Test @Transactional @Rollback(value = false) void update(){ User user = userRepository.getOne(4L); user.setName("用戶4").setAge(21).setEmail("yy"); userRepository.save(user); } @Test @Transactional @Modifying @Query @Rollback(value = false) void delete(){ User user = userRepository.getOne(13L); userRepository.delete(user); // userRepository.deleteById(13L); } /** * 測試樂觀鎖失敗 */ @Test @Transactional @Rollback(value = false) void OptUpdate(){ User user1 = userRepository.getOne(12L); user1.setName("用戶1").setAge(21).setEmail("yy"); User user2 = userRepository.getOne(12L); user2.setName("用戶2").setAge(21).setEmail("yy"); userRepository.save(user2); userRepository.save(user1); } }