以下内容纯属个人扯淡,仅供参考
目录
前提条件:
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