SpringBoot 构建ORM框架

目前常用的ORM框架有 Mybatis(batis)、MybatisPlus,Hibernate、Jpa等几个框架,今天就简单介绍一下搭建Mybatisplus框架的流程。

1.增加依赖


        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.1
        
        
        
            mysql
            mysql-connector-java
            8.0.28
        
        
        
            com.alibaba
            druid-spring-boot-starter
            1.2.8
        
    

2.数据库实体模型

主要使用@TableName和@TableField,配置属性类和数据库表的对应关系

@TableName("userinfo")
@Data
public class UserInfo {

    @TableId(type = IdType.AUTO)
    private Integer id;

    @TableField
    private String name;

    private String usernum;

    private int sex;

    private Date createtime;

    private Date updatetime;
}

3.增加Mapper

方式1:BaseMapper

直接使用继承BaseMapper,然后使用注入的Mapper对象实例即可。

public interface IUserInfoMapper extends BaseMapper {

}
 @Autowired
    IUserInfoMapper iUserInfoMapper;

    @Test
    public void queryTest() {
        LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper();
        lambdaQueryWrapper.eq(UserInfo::getId,1);
        List list = iUserInfoMapper.selectList(lambdaQueryWrapper);
        System.out.println(list);
    }

 方式2:IService

使用IService实现类,新建IUserInfoService 接口

public interface IUserInfoService extends IService {

    void queryList();
}

实现IUserInfoServiceb 接口 ,并继承ServiceImpl

@Service
public class UserInfoServiceImpl extends ServiceImpl implements IUserInfoService {

    public void queryList() {
        LambdaQueryChainWrapper userWarpper = this.lambdaQuery();
        userWarpper.like(UserInfo::getName, "li");
        System.out.println(userWarpper.list());
    }

    public void queryListPage() {
        LambdaQueryChainWrapper userWarpper = this.lambdaQuery();
        Page page = new Page<>(1, 2);
        IPage userInfoIPage = userWarpper.page(page);


        System.out.println("total=" + userInfoIPage.getTotal());
        System.out.println("page=" + userInfoIPage.getPages());
    }
}

如果需要需要开始分页查询或者动态表名,需要开启

@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //分页拦截器
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);


        //动态表名拦截器
        DynamicTableNameInnerInterceptor dynamicTableNameInner = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInner.setTableNameHandler(((sql, tableName) -> "userinfo"));

        interceptor.addInnerInterceptor(dynamicTableNameInner);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

}

开始查询数据

@SpringBootTest(classes = MybatisPlusProgram.class)
public class IUserInfoServiceImplTest {

    @Autowired
    IUserInfoService iUserInfoService;

    @Test
    public void queryTest() {
        iUserInfoService.queryList();
    }
}

总结:

BaseMapper 接口中封装了一系列 CRUD 常用操作

IService 内部进一步封装了 BaseMapper 接口的方法(当然也提供了更详细的方法),使用IService需要继承ServiceImpl。

 4.wapper介绍 

Wrapper : 条件构造抽象类,最顶端父类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

QueryWrapper : Entity 对象封装操作类,不是用lambda语法

UpdateWrapper : Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper : Lambda 更新封装Wrapper

SpringBoot 构建ORM框架_第1张图片
 

5.LambdaQueryWrapper常用的方法

SpringBoot 构建ORM框架_第2张图片

方法图片来源: https://www.cnblogs.com/javagg/p/12654305.html 

6.@Mapper或者@MapperScan

使用@Mapper或者@MapperScan,将Mapper的接口类编译成实现类,才能注入。

@MapperScan:在启动项类上增加@MapperScan,指定扫描的包。指定了变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类

@Mapper:在接口上增加@Mapper,在编译之后会生成相应的接口实现类。

@SpringBootApplication
@MapperScan("com.lx.mybatisplus.mappers")
public class MybatisPlusProgram {

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

7.配置连接

默认数据库配置连接

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
    username: root
    password: root

durid连接池配置连接:

#druid数据库链接池配置
spring:
  datasource:
    #1.JDBC
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
    druid:
      #2.连接池配置
      initial-size: 5       #初始化连接池的连接数量 大小,最小,最大
      min-idle: 5
      max-active: 20
      max-wait: 60000    #配置获取连接等待超时的时间
      time-between-eviction-runs-millis: 60000    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      min-evictable-idle-time-millis: 30000  # 配置一个连接在池中最小生存的时间,单位是毫秒
      validation-query: SELECT 1 FROM DUAL  # 检查数据库
      validation-query-timeout: 20000    #设置检查数据库SQL查询超时时间
      test-while-idle: true       #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-on-borrow: false       #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      test-on-return: false      #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      pool-prepared-statements: true  # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
      max-pool-prepared-statement-per-connection-size: 20
      filter:   # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      #3.基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        #设置不统计哪些URL
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin  #设置监控页面的登录名和密码 ,监控页访问:http://localhost:端口号/项目名称/druid/login.html
        login-password: admin
        allow: 127.0.0.1
        #deny: 192.168.1.100

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

logging:
  level:
    root: info

SpringBoot 构建ORM框架_第3张图片

8.LambdaQueryWrapper和LambdaQueryChainWrapper区别

LambdaQueryWrapper和LambdaQueryChainWrapper都支持lamdba的写法,用法基本相同。LambdaQueryChainWrapper是在LambdaQueryWrapper的基础上封装的。
        LambdaQueryWrapper userWarpper = new QueryWrapper().lambda()
                .like(UserInfo::getName, "li");
        iUserInfoService.list(userWarpper);
        iUserInfoService.getOne(userWarpper);


        LambdaQueryChainWrapper userWarpperChain = iUserInfoService.lambdaQuery()
                .like(UserInfo::getName, "li");
        userWarpperChain.list();  //等于iUserInfoService.list(userWarpperChain.getWrapper());
        userWarpperChain.one();  //等于iUserInfoService.getOne(userWarpperChain.getWrapper())

9.开启打印SQL日志

1.第一种方法:使用mybatis配置      

  #打印sql,但是不出现在log中

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

 2.第二种方法:使用Logback日志配置       

 #打印sql,出现在log中

 logging.level.com.lx.mybatisplus=debug

参考:

Springboot配置Druid或Hikari连接池(并开启MyBatisPlus事务)_繁华尽头满是殇的博客-CSDN博客

你可能感兴趣的:(ORM,spring,boot,java,spring)