mybati-plus与jpa


笔记

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>
View Code

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>
View Code

 

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);
    }


}
View Code

 

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);
    }

}
View Code

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM