以下內容純屬個人扯淡,僅供參考
目錄
前提條件:
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集成
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的關係
簡單來說,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。參考
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