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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值