Mybatis+Oracle12c+Springboot 2019.03

概述

Lz之前在项目使用的是hibernate+springMVC+mysql。现在的公司计划使用的mybatisPlus+oracle+springboot.虽然这些官网上的api挺多挺详细的,但自己在学习的过程中还是遇到一些坑。所以想整理一下项目,加深记忆,方便以后查阅。文笔有限,多多包涵。

工具

  安装oracle 12c
  jdk1.8
  IntelliJ IDEA 

代码

主要实现:
1、generator 自动生成代码:contorller、entiy、servcie、*mapper.xml等文件
2、oracle数据库的自增 序列、触发器
3、利用Postman实现简单的CRUD

ps:省略oracle等工具的安装
闲话少讲,干活:
1、首先在IDEA中创建springboot项目

1.png

2.png

3.png

最后Finshed即可。
项目的pom.xml,所有工具依赖的包都是201903最新的,直接去maven仓库搜索加上的
附上Maven仓库依赖查询的地址:https://mvnrepository.com/

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dv</groupId>
    <artifactId>mpdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mpdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7_g</artifactId>
            <version>12.1.0.1.0</version>
        </dependency>

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

        <!-- velocity 模板引擎, 默认 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <!-- freemarker 模板引擎 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>


        <!-- beetl 模板引擎 -->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>2.9.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--fork:如果没有该项配置,整个devtools不会起作用-->
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

微信截图_20190329153618.png

其中oracle的版本是12c,需要把oracle驱动手动加载到本地Maven仓库中
(1)到oracle安装目录找到相应jdk的驱动:

image.png

(2)把驱动放到本地maven仓库,注意这是我的安装路径和版本,读者只需相应的替换对应的文件即可

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc7_g -Dversion=12.1.0.1.0
-Dfile=E:\app\teemo\product\12.1.0\dbhome_1\jdbc\lib\ojdbc7_g.jar -Dpackaging=jar -DgeneratePom=true

ps:关于maven本地仓库的配置,请自行百度。IDEA中点击file->setting->Maven 设置你对应的路径即可


4.png

application.properties文件

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=c##ly_dv
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#这是更改tomcat默认端口
server.port=8989

mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
mybatis-plus.type-aliases-package = com.dv.mpdemo.mapper

2、代码自动生成器generator 这部分mybatisplus官网api讲的详细的,读者可自行查看mybatisplus官网

这是我结合根据自己项目的路径运用的MysqlGenerator ,以及一些注释

package com.dv.mpdemo;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * <p>
 * mysql 代码生成器演示例子
 * </p>
 *
 * @author dv
 * @since 2019-03-28
 */
public class MysqlGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    /**
     * RUN THIS
     */
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("dv");
        gc.setOpen(false);  //生成文件后是否打开目录
        gc.setBaseResultMap(true);  // XML ResultMap
        gc.setFileOverride(true);// 是否覆盖文件
        gc.setActiveRecord(true);// 开启 activeRecord 模式
        gc.setEnableCache(false);// XML 二级缓存

        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
        // dsc.setSchemaName("public");
        dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
        dsc.setUsername("c##ly_dv");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.dv.mpdemo");
        mpg.setPackageInfo(pc);

        // 如果模板引擎是 freemarker
//        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
         String templatePath = "/templates/mapper.xml.vm";

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
        strategy.setEntityLombokModel(true);
//        strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
        strategy.setInclude(scanner("表名"));
        strategy.setSuperEntityColumns("id");
//        strategy.set
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new VelocityTemplateEngine());  //对应的模板引擎 80
        mpg.execute();
    }

}

首先在oracle中创建一张表:t_test

create table t_test(  
  id number(10)   primary key,  
  name varchar2(20) not null
); 

创建序列和触发器 实现插入数据的时候id的自增:

--序列
CREATE SEQUENCE  "C##LY_DV"."SEQ_TTEST_DI"  
MINVALUE 1 
MAXVALUE 333 
INCREMENT BY 1 
START WITH 1 
CACHE 20 ORDER  NOCYCLE  NOPARTITION ;

--触发器
create or replace 
trigger TIR_TTEST_ID 
BEFORE INSERT ON T_TEST 
FOR EACH ROW 
BEGIN
 SELECT "SEQ_TTEST_DI".nextval INTO :new.ID FROM dual;
END;

运行MysqlGenerator:手动输入表名回车即可


8.png

最后生成的项目目录


7.png

直接上TTestContonller.java
package com.dv.mpdemo.controller;


import com.dv.mpdemo.entity.TTest;
import com.dv.mpdemo.mapper.TCouseMapper;
import com.dv.mpdemo.mapper.TTestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author dv
 * @since 2019-03-28
 */
@Controller
@RequestMapping("/t-test")
public class TTestController {

    @Autowired
    private TTestMapper tTestMapper;

    @Autowired
    private TCouseMapper tCouseMapper;

    @ResponseBody
    @RequestMapping(value="/getTtestById")
    public TTest getTtestById(HttpServletRequest request, HttpServletResponse response){
        List<TTest> ls = new ArrayList<TTest>();
        String id = request.getParameter("id");
        TTest tt = tTestMapper.getTtestById(Long.parseLong(id));
        System.out.println("你好getTtestById");
        return tt;
    }

    @ResponseBody
    @RequestMapping(value="/getAlls")
    public List<TTest> getAlls(HttpServletRequest request, HttpServletResponse response){
        List<TTest> ls = new ArrayList<TTest>();
        ls = tTestMapper.getAlls();
//        System.out.println("你好getAlls");
        return ls;
    }


    @ResponseBody
    @RequestMapping(value="/insertT")
    public boolean insertT(HttpServletRequest request, HttpServletResponse response){
        List<TTest> ls = new ArrayList<TTest>();

        String id = request.getParameter("id");
        String name = request.getParameter("name");
        boolean flag = false;
        try{
            tTestMapper.insertT(Long.parseLong(id),name);
            flag = true;
        }catch (Exception e ){
            e.printStackTrace();
        }
//        System.out.println("你好insertT");
        return flag;
    }

    @ResponseBody
    @RequestMapping(value="/insertTNotId")
    public boolean insertTNotId(HttpServletRequest request, HttpServletResponse response){
        List<TTest> ls = new ArrayList<TTest>();

//      String id = request.getParameter("id");
        String name = request.getParameter("name");
        boolean flag = false;
        try{
            tTestMapper.insertTNotId(name);
            flag = true;
        }catch (Exception e ){
            e.printStackTrace();
        }
//        System.out.println("你好insertT");
        return flag;
    }

    @ResponseBody
    @RequestMapping(value="/deleteById")
    public boolean deleteById(HttpServletRequest request, HttpServletResponse response){
        List<TTest> ls = new ArrayList<TTest>();

        String id = request.getParameter("id");
//        String name = request.getParameter("name");
        boolean flag = false;
        try{
            tTestMapper.deleteById_T(Long.parseLong(id));
            flag = true;
        }catch (Exception e ){
            e.printStackTrace();
        }
//        System.out.println("你好delete");
        return flag;
    }

    @ResponseBody
    @RequestMapping(value="/updateById_T")
    public boolean updateById_T(HttpServletRequest request, HttpServletResponse response){
//        List<TTest> ls = new ArrayList<TTest>();

        String id = request.getParameter("id");
        String name = request.getParameter("name");
        boolean flag = false;
        try{
            tTestMapper.updateById_T(Long.parseLong(id),name);
            flag = true;
        }catch (Exception e ){

            e.printStackTrace();
        }
//        System.out.println("你好delete");
        return flag;
    }

}

TTestMapper.java

package com.dv.mpdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dv.mpdemo.entity.TTest;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author dv
 * @since 2019-03-28
 */
public interface TTestMapper extends BaseMapper<TTest> {

    public List<TTest> getAlls();

    public TTest getTtestById(Long id);

    public void insertT(@Param("id") Long id , @Param("name") String name);

    public void insertTNotId(@Param("name") String name);

    public void deleteById_T(@Param("id") Long id);

    public void updateById_T(@Param("id") Long id,@Param("name") String name);

    @Select("select * from T_TEST")   //注解的方式
    public List<TTest> getAllByZhuJie();

}

Entity:TTest.java

package com.dv.mpdemo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 
 * </p>
 *
 * @author dv
 * @since 2019-03-28
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("T_TEST")
public class TTest implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId("ID")
    private Long id;

    @TableField("NAME")
    private String name;


}

TTestMapper.xml

<?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.dv.mpdemo.mapper.TTestMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.dv.mpdemo.entity.TTest">
        <id column="ID" property="id" />
        <result column="NAME" property="name" />
    </resultMap>

    <select id="getTtestById" resultType="com.dv.mpdemo.entity.TTest" parameterType="Long">
        select * from T_TEST where ID = #{0}
    </select>


    <select id="getAlls" resultMap="BaseResultMap">
        select * from T_TEST
    </select>

    <insert id="insertT" >
        insert into T_TEST(ID,NAME) values(#{id},#{name})
    </insert>

    <insert id="insertTNotId" >
        insert into T_TEST(NAME) values(#{name})
    </insert>

    <delete id="deleteById_T" parameterType="Long">
        delete from T_TEST where id = #{id}
     </delete>

    <update id="updateById_T">

        update T_TEST SET NAME=#{name} where ID=#{id}
    </update>
</mapper>

运行MpdemoApplication.java 注意加上注解@MapperScan("com.dv.mpdemo.mapper")
自动扫面mapper文件

package com.dv.mpdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.dv.mpdemo.mapper")
public class MpdemoApplication {

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

}

运用Postman 发送请求结果:


10.png

12.png

ps:这里只贴出了其中的一个查询和插入,有兴趣的读者可以根据自己具体的项目去测试CRUD
LZ自己是都测试过了,就不把所有贴出来,已经算是很详细了,哈哈。

补充两点:1、IDEA需要安装lombok插件 ,实体才能正常使用set get方法
File->setting->Plugins 搜索lombox install即可


11.png

2、oracle自增应用实体插入的方式 问题:以下方式每次id自增都是+2,
我自己实现的时候:可以删除oracle里面对应的触发器,实现id+1
有张表T_COUSE test:
实体中:
加入注解@KeySequence("SEQ_T_COUSE")里面是对应的序列名
id->type=IdType.INPUT
贴出部分代码

        TCouse tc = new TCouse();
        tc.setCousename("数学");
        tc.setCousetype("1");
        tCouseMapper.insert(tc);
/**
 * @author dv
 * @since 2019-03-29
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("T_COUSE")
@KeySequence("SEQ_T_COUSE")
public class TCouse extends Model<TCouse> {


    @TableId(value = "COUSEID" ,type = IdType.INPUT)
    private Long couseid;

     ...
}

至此整个项目完成
第一次在简书中写文章,写的不好,请多包涵
有兴趣的朋友可以一起交流
ly_dv,一个小菜鸟。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341