With Dao層 And Oracle

以下內容純屬個人扯淡,僅供參考

目錄

ORM集成

Mybatis集成

MybatisPlus集成

Mybatis+Jpa集成

業務使用:Mybatis

VO

typeHandler

兼容Mysql與Oracle

業務使用:MybatisPlus

分頁

業務使用:SpringDataJpa


 

前提條件

1)Oracle服務器版本=Oracle Database 11g Enterprise Edition Release 11.2.0.4.0。建表語句如下

-- Create table
create table PCT_CHART
(
  id           NUMBER(20) not null,
  title        VARCHAR2(50) default '' not null,
  unit         VARCHAR2(20) default '' not null,
  status       NUMBER(20) default 1 not null,
  type_en      NUMBER(20) default 0 not null,
  source_en    NUMBER(20) default 0 not null,
  remark       VARCHAR2(200) default '',
  operator     VARCHAR2(20) default '',
  operate_time TIMESTAMP(6) default SYSDATE
)
tablespace TBS_DEVDB
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    next 1
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns
comment on column PCT_CHART.title
  is '圖表標題';
comment on column PCT_CHART.unit
  is '縱座標單位';
comment on column PCT_CHART.status
  is '1=啓用 2=禁用 3=刪除';
comment on column PCT_CHART.type_en
  is '圖表類型枚舉值';
comment on column PCT_CHART.source_en
  is '數據源類型枚舉';


--------------------------
--指定表空間
--塊保留10%的空間留給更新該塊數據使用
--初始化事務槽的個數
--最大事務槽的個數
--存儲參數
----區段(extent)一次擴展64k
----最小區段數
----最大區段數
-------------------------
-- Create/Recreate primary, unique and foreign key constraints
alter table PCT_CHART
  add primary key (ID)
  using index
  tablespace TBS_DEVDB
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

2)爲該表添加了序列和觸發器

----創建序列
create sequence SEQ_PCT_CHART minvalue 1 maxvalue 999999999
         increment by 1
         start with 1;

----創建觸發器
create or replace trigger TRI_PCT_CHART
before insert on PCT_CHART
for each row
when(NEW.ID is NULL)
begin
select  SEQ_PCT_CHART.Nextval into :NEW.ID from dual;
end;

3)Oracle驅動

這裏注意座標是Oracle官方的,而不是github開源的,二次封裝的

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
    <scope>runtime</scope>
</dependency>

 

ORM集成

Mybatis集成

參考:SpringBoot整合Mybatis完整詳細版

1、概述

mybatis是一個半ORM框架,通過Mapper.xml文件將SQL與程序分離,可以很方便的進行SQL語句優化,而JPA、Hibernate等ORM框架SQL是框架運行時生成的,雖然也支持註解等形式的自定義,但並不具備像mybatis一樣使用xml文件分離SQL。另外一點選擇mybatis的原因是:它的結果集映射非常的強大並且易用,這樣可以實現從數據庫映射到DTO、VO,而不用像JPA那樣:查出DO,再利用領域模型轉換將DO轉換爲DTO、VO

2、整合步驟

(1)依賴

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

(2)實體類

package com.yihuacomputer.yhcloud.dao.pojo.admin;

/**
 * @description
 * @date 14:35 2020/3/5
 * @author 
 **/
public class PctChart implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    /**圖表標題**/
    private String title;

    /**縱座標單位**/
    private String unit;

    /**狀態(1.啓用;2.禁用;3.刪除)**/
    private Integer status;

    /**圖表類型(1單柱狀圖;2單餅圖)**/
    private Integer typeEn;

    /**數據源類型(0.Excel;1.API)**/
    private Integer sourceEn;

    /**備註信息**/
    private String remark;

    /**操作者用戶名**/
    private String operator;

    /**操作時間**/
    private Date operateTime;
}

(3)Dao層

Mapper接口

package com.yihuacomputer.yhcloud.dao.mapper.admin;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yihuacomputer.yhcloud.dao.pojo.admin.PctChart;

import java.util.List;

/**
 * @Description
 * @Date 17:38 2020/3/19
 * @Author 
 **/
public interface PctChartMapper extends BaseMapper<PctChart> {
    int count();
}

Mapper映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yihuacomputer.yhcloud.dao.mapper.admin.PctChartMapper">
    
    <select id="count" resultType="integer">
        SELECT COUNT(1) FROM PCT_CHART
    </select>

</mapper>

(4)Service層

package com.yihuacomputer.yhcloud.service.admin;

public interface PctChartService {

   int count();
}

實現

package com.yihuacomputer.yhcloud.service.admin;

public interface PctChartServiceImpl implements PctChartService{

    @Autowired
    private PctChartMapper pctChartMapper;

    @Override
    public int count() {

        return pctChartMapper.count();
    }
}

(5)application.yml

mybatis:
  mapper-locations: classpath:mapper/admin/*Mapper.xml
  type-aliases-package: com.yihuacomputer.yhcloud.dao.pojo

 

MybatisPlus集成

1、概述

在mybatis的基礎上只做增強而不做改變,本項目中,多表操作使用Mapper.xml來完成,而單表的CRUD則使用MP提供的方法

2、整合步驟

(1)依賴

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>

(2)實體類

package com.yihuacomputer.yhcloud.dao.pojo.admin;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @description
 * @date 14:35 2020/3/5
 * @author 
 **/
@Data
@TableName("pct_chart")
public class PctChart implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id",type= IdType.AUTO)
    private Long id;

    /**圖表標題**/
    private String title;

    /**縱座標單位**/
    private String unit;

    /**狀態(1.啓用;2.禁用;3.刪除)**/
    private Integer status;

    /**圖表類型(1單柱狀圖;2單餅圖)**/
    private Integer typeEn;

    /**數據源類型(0.Excel;1.API)**/
    private Integer sourceEn;

    /**備註信息**/
    private String remark;

    /**操作者用戶名**/
    private String operator;

    /**操作時間**/
    private Date operateTime;
}

(3)Dao層

package com.yihuacomputer.yhcloud.dao.mapper.admin;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yihuacomputer.yhcloud.dao.pojo.admin.PctChart;

import java.util.List;
/**
 * 用戶
 *
 * @date 10:09 2020/5/6
 * @author 
 **/
public interface PctChartMapper extends BaseMapper<PctChart> {

}

(4)Service層

接口

package com.yihuacomputer.yhcloud.service.admin;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yihuacomputer.yhcloud.dao.pojo.admin.PctChart;

/**
 * @description
 * @date 16:00 2020/2/23
 * @author 
 **/
public interface PctChartService extends IService<PctChart> {

}

實現

package com.yihuacomputer.yhcloud.service.admin;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yihuacomputer.yhcloud.dao.mapper.admin.PctUserMapper;
import com.yihuacomputer.yhcloud.dao.pojo.admin.PctUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 *
 * @date 17:19 2020/4/30
 * @author 
 **/
@Service("pctChartService")
@Slf4j
public class PctChartServiceImpl extends ServiceImpl<PctChartMapper, PctChart> implements PctChartService {

}

注意:MP提供的ServiceImpl中有一個成員變量BaseMapper,通過它可以同樣引用PctChartMapper中定義的方法,而不是像之前只使用mybatis時,需要在PctChartServiceImpl中使用@Autowired來注入pctChartMapper對象

疑問:MP不僅爲Mapper層提供了方法,也爲Service層提供了方法,那麼使用時如何選擇呢

(5)application.yml

mybatis-plus:
  type-aliases-package: com.yihuacomputer.yhcloud.dao.pojo
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    map-underscore-to-camel-case: true    #駝峯命名規則映射
    call-setters-on-nulls: true    #當查詢出的數據爲null時,不隱藏字段
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl    #打印sql語句
    jdbc-type-for-null: 'null'

 

Mybatis+Jpa集成

1、概述

1。SpringDataJpa、JPA、Hibernate的關係

參考:簡單瞭解下spring data jpa

簡單來說,JPA是Java持久化API規範,可通過註解或xml描述對象-表之間的映射關係,並將實體對象持久化到數據庫中,它主要是爲了簡化持久層開發以及整合ORM技術,結束Hibernate、TopLink、JDO等ORM框架各自爲營的現象。而SpringDataJpa是對JPA的封裝,在其之上添加的另一層抽象,能極大簡化持久層開發一級ORM框架切換的成本(Mybatis是半ORM框架)

2。爲什麼要使用它

項目最開始使用的是最原始的mybatis。(不過,個人認爲使用只使用mybatis最好了,雖然編寫代碼效率會慢,但可以更大化自實現SQL,從而最大化sql語句優化,而Hibernate等ORM框架是sql自動生成並執行的)

然後:替換爲MybatisPlus,它本身建立於mybatis之上,因此已經寫過的Mapper.xml文件是兼容支持的,同時MP提供基本的CURD,因此在項目中:涉及多表操作或需要自己實現的SQL就使用Mapper.xml映射,如果是單表的簡單CURD,則直接使用MP提供的service層方法實現

但是出現了一系列的問題:在上述ojdbc6版jar包下,當插入記錄字段設置超過8個時會拋出數組越界的異常,但數據又是插入成功的;MP的批量插入savePatch方法是失敗的

最後,集成SpringDataJpa,用它來代替MP的對單表的簡單CURD,相當於沒有使用MP了,項目中目前同時存在的是MP和SpringDataJpa,實際使用的只是mybatis。

另外一點:SpringDataJpa和MP對Dao層的代碼都是有傾入性的,它強制要求Dao接口繼承JpaRepository、BaseMapper

2、整合步驟

(1)依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

(2)實體類

package com.yihuacomputer.yhcloud.dao.pojo.admin;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Data //爲實體類提供getter、setter、有參構造、toString、euqals、hashCode方法
//@TableName("pct_chart") //這是MP的註解,可以和Jpa共存
@Table(name = "PCT_CHART")
@Entity
public class PctChart implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="generator")
    @SequenceGenerator(name="generator",allocationSize = 1, initialValue = 1,sequenceName="SEQ_PCT_CHART") //注意:這裏對序列的支持
    @TableId(value = "id",type= IdType.AUTO) //MP註解。可以共存
    private Long id;

    /**圖表標題**/
    private String title;

    /**縱座標單位**/
    private String unit;

    /**狀態(1.啓用;2.禁用;3.刪除)**/
    private Integer status;

    /**圖表類型(1單柱狀圖;2單餅圖)**/
    private Integer typeEn;

    /**數據源類型(0.Excel;1.API)**/
    private Integer sourceEn;

    /**備註信息**/
    private String remark;

    /**操作者用戶名**/
    private String operator;

    /**操作時間**/
    private Date operateTime;

    //public PctChart(){}  //有些博客說強制要求一個空構造器,但我這沒設置
}

(3)Dao層

public interface PctChartJpa extends JpaRepository<PctChart, Long> {

}

注意:這裏命名是以Jpa爲結尾的而不是Repository、Mapper等,由於項目中使用了mybatis,而SpingBoot提供的自動配置中,提供了默認的MapperScan,它也將掃描到Repository結尾的類作爲Mapper。因此這裏命名是以Jpa是爲了避免被MapperScan再次掃描而出現WARN:該Mapper已被掃描並注入到IOC容器中了

擴展知識:SpringBoot爲SpringDataJpa提供了自動配置類,JpaRepositoriesAutoConfiguration

路徑=spring-boot-autoconfigure-2.2.2.RELEASE.jar/org.springframework.boot.autoconfigure.data.jpa

參考:Spring Boot 自動配置 : JpaRepositoriesAutoConfiguration

(4)application.yml

spring:
  jpa:
    #若不配置會有警告
    open-in-view: false
    show-sql: true
    #可以不用配置,默認=自動推斷
    database: oracle
    properties:
      hibernate:
        #數據庫方言
        dialect: org.hibernate.dialect.Oracle10gDialect
        hbm2ddl:
          auto: none

注意:open-in-view默認爲true,表示在事務外也可以訪問懶加載的數據,它將導致在Service數據源切換失效。參考:OpenEntityManagerInViewInterceptor與spring.jpa.open-in-view

(5)測試使用

@Test
public void test1() {
    System.out.println(pctChartJpa.count());
        
    //PctChart pctChart = new PctChart();
    //pctChart.setUnit("jpa");
    //pctChart.setTypeEn(1);
    //pctChart.setTitle("jpa");
    //pctChart.setOperateTime(new Date());
    //pctChart.setOperator("jpa");
    //pctChart.setRemark("jpa");
    //pctChart.setSourceEn(1);
    //pctChart.setStatus(1);
    //pctChartJpa.save(pctChart);
}

 

業務使用:Mybatis

自動配置

1。參考

從SpringBoot整合Mybatis分析自動配置

 

 

VO

1、概述

2、使用示例

typeHandler

 

兼容Mysql與Oracle

業務使用:MybatisPlus

自動配置

在mybatis-plus-boot-starter.jar/META-INF/spring.factories中

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

 

 

分頁

業務使用:SpringDataJpa

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章