Spring 框架

Spring 为简化企业级开发而生,使用 Spring 开发可以将 Bean 对象,Dao 组件对象,Service 组件对象等交给 Spring 容器来管理,这样使得很多复杂的代码在 Spring 中开发却变得非常的优雅和简洁,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。

Spring 通常与 Mybtais 等数据操作层框架结合使用,本示例是 Spring+Mybatis 框架整合使用。

开发环境搭建

软件 版本
DM 数据库 DM 8.0 及以上版本
JDK JDK 8
Eclipse 2018-12 (4.10.0)
Spring 4.2

安装 DM 数据库

请参考 DM 数据库快速上手指南

数据库安装过程中,请勾选创建 BOOKSHOPDMHR 示例库,作为数据库模拟环境,如下图所示:

DMHR 示例库

安装 Java 开发工具包--JDK

双击安装包进行安装,安装步骤简单,点击【下一步】安装即可。以安装目录 D:\java\jdk1.8.0_111 为例,安装完成如下图所示:

安装成功

安装成功后需要配置 JDK 环境变量,即将 JDK 安装路径的 bin 路径复制到环境变量 path 里,如下图所示:

环境变量配置

环境变量配置成功后,可使用 win+R 打开命令提示符,输入 java -version 命令,可以正常出现 JDK 版本号,即环境变量配置成功,如下图所示:

JDK 版本号

注意

JDK 安装完成后还需配置环境变量,环境变量配置不正确会导致项目启动报错。

因环境变量配置错误导致的常见错误代码如下:

Unable to find a javac compiler;
Perhaps JAVA_HOME does not point to the JDK;

安装集成开发环境 eclipse

正确配置 Java 环境变量后,eclipse 可正常打开。

开发示例

Spring 的引入

mybatis-plus 依托于 mybatis,两者相辅相成,MyBatis-Plus 增强工具的引入不会对 mybatis 框架造成影响。

  1. 准备项目所需 jar 包
注意

mybatis-plus 3.0 之后的版本才支持 DM 数据库,在选择使用 mybatisplus-jar 包版本时注意选择。

若选择错误的 mybatis-plus 会报错,如下图所示:

运行后控制台截图

  1. 新建项目 Java_Mybatis_Plus,并导入项目所需 jar 包,如下图所示:
注意

复制 jar 包到 lib 文件夹后,要选择所有 jar 包,鼠标右键,Build path-->Add to Build path。

导入 jar 包到项目里

  1. 在 src 源码目录下创建如下包名,完整项目目录结构如下图所示:

项目完整目录包结构

  1. 书写 Spring 的核心配置文件:spring-dao.xml,存放在 src 目录下。此处将原本 mybatis 的相关配置全部集中到 spring 配置文件中,可以省略 mybatis 配置文件。

spring-dao.xml.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 配置整合 mybatis-plus 过程-->
    <!-- 1、配置数据库相关参数 properties 的属性:${url}-->
    <context:property-placeholder location="classpath:jdbc.properties" />
    <!-- 2、配置数据库连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- mybatis 的 sqlsessionFactorybean:org.mybatis.spring.SqlSessionFactoryBean-->
    <!-- 3、配置 mybatis-plus 的 sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.pojo"/>
    </bean>
    <!-- 4、DAO 接口所在包名,Spring 会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>
  1. 添加 jdbc.properties 配置文件,(主要配置 driver、url、username、password 等)。

修改数据库连接信息,只修改 jdbc.properties 里的字段即可。jdbc.properties 文件如下所示:

    jdbc.driver=dm.jdbc.driver.DmDriver
    jdbc.url=jdbc:dm://localhost:5236
    jdbc.username=SYSDBA
    jdbc.password=SYSDBA

基本绑定变量操作示例

基本操作使用的数据表为示例库中 Product 的 PRODUCT_CATEGORY 表,对应于数据库表添加实体类 PRODUCT_CATEGORY,其位置放于 com.pojo 下。

操作数据库对应的实体类

PRODUCT_CATEGORY.java 文件如下所示:

package com.pojo;
public class PRODUCT_CATEGORY {
    private int PRODUCT_CATEGORYID;
    private String NAME;
    public int getPRODUCT_CATEGORYID() {
        return PRODUCT_CATEGORYID;
    }
    public void setPRODUCT_CATEGORYID(int pRODUCT_CATEGORYID) {
        PRODUCT_CATEGORYID = pRODUCT_CATEGORYID;
    }
    public String getNAME() {
        return NAME;
    }
    public void setNAME(String nAME) {
        NAME = nAME;
    }
    public PRODUCT_CATEGORY(int pRODUCT_CATEGORYID, String nAME) {
        super();
        PRODUCT_CATEGORYID = pRODUCT_CATEGORYID;
        NAME = nAME;
    }
    public PRODUCT_CATEGORY() {
        super();
    }
}

数据访问层接口

此处使用 mybatisplus 工具,接口继承 BaseMapper 规定泛型为 ProductCategory,无需自己手动添加增删改查接口。

ProductCategoryMapper.java 文件如下所示:

package com.dao;

import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pojo.ProductCategory;

@Mapper
public interface ProductCategoryMapper extends BaseMapper<ProductCategory>{

}

测试类

TestProduct.java 文件如下所示:

package com.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.dao.ProductCategoryMapper;
import com.pojo.ProductCategory;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-dao.xml"})
public class TestProduct {
    @Autowired
    ProductCategoryMapper productCategoryMapper = null;
    //测试插入信息
    @Test
    public void testInstert(){
        productCategoryMapper.insert((new ProductCategory(null, "语文")));
    }
    //测试修改信息
    @Test
    public void testUpdate(){
        ProductCategory productCategory = productCategoryMapper.selectById(4);
        productCategory.setName("英语");
        productCategoryMapper.updateById(productCategory);
    }
    //测试根据 id 查询指定人信息
    @Test
    public void testSelectPersonById(){
        ProductCategory productCategory = productCategoryMapper.selectById(1);
        System.out.println(productCategory);
    }
    //测试全查
    @Test
    public void testSelectAll(){
        List<ProductCategory> selectList = productCategoryMapper.selectList(null);
        for(ProductCategory p: selectList){
            System.out.println(p);
        }
    }
    //测试删除
    @Test
    public  void testDelete(){
        productCategoryMapper.deleteById(5);
    }
}

运行后控制台截图如下所示:

运行后控制台截图

运行后数据库表截图如下所示:

运行后数据库表截

大字段操作示例

  1. 创建需要操作的含大字段类型的数据表。
CREATE TABLE "PRODUCTION"."BIG_DATA"
(
"ID" INT IDENTITY(1, 1) NOT NULL,
"PHOTO" IMAGE,
"DESCRIBE" BLOB,
"TXT" CLOB,
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;
  1. 在 D 盘根目录下,创建 DM8 特点.jpg达梦产品简介.txt 两个文件,作为大字段存储,如下图所示:

准备大字段存储文件

操作数据库对应的实体类

BigData.java 文件如下所示:

package com.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName(value="PRODUCTION.TEST_BIG_DATA")
public class BigData {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    private byte[] photo; //mybatis 将 Image 和 Blob 映射成 byte[]
    private byte[] describe;
    private String txt; //mybatis 将 Clob 映射成 String
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public byte[] getPhoto() {
        return photo;
    }
    public void setPhoto(byte[] photo) {
        this.photo = photo;
    }
    public byte[] getDescribe() {
        return describe;
    }
    public void setDescribe(byte[] describe) {
        this.describe = describe;
    }
    public String getTxt() {
        return txt;
    }
    public void setTxt(String txt) {
        this.txt = txt;
    }
    @Override
    public String toString() {
        return "TestBigData [id=" + id + ", txt=" + txt + "]";
    }
    public BigData(Long id, byte[] photo, byte[] describe, String txt) {
        super();
        this.id = id;
        this.photo = photo;
        this.describe = describe;
        this.txt = txt;
    }
    public BigData() {
        super();
    }
}

数据访问层接口

TestBigDataMapper.java 文件如下所示:

package com.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pojo.BigData;
public interface BigDataMapper extends BaseMapper<BigData>{
}

测试类

TestBigData.java 文件如下所示

package com.test;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.dao.BigDataMapper;
import com.pojo.BigData;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-dao.xml"})
public class TestBigData {
    @Autowired
    BigDataMapper bigDataMapper= null;
    //测试插入大字段表
    @Test
    public void testInsert() {
        try {
        String filePath = "D:\\DM8特点.jpg";
        File file = new File(filePath);
        String filePath2 = "D:\\达梦产品简介.txt";
        File file2 = new File(filePath2);
        InputStream in;
        in = new BufferedInputStream(new FileInputStream(file));
        byte[] bytes1 = new byte[102400];
        byte[] bytes2 = new byte[102400];
        in.read(bytes1);
        InputStream in2 = new BufferedInputStream(new FileInputStream(file));
        in2.read(bytes2);
        BufferedReader reader = new BufferedReader(new InputStreamReader
                (new FileInputStream(file2),"UTF-8"));
        StringBuffer stringBuffer = new StringBuffer("");
        String str = null;
        while((str = reader.readLine())!=null) {
            stringBuffer.append(str);
            stringBuffer.append("\n");
        }
        BigData bigData = new BigData(null,bytes1,bytes2,stringBuffer.toString());
  
        bigDataMapper.insert(bigData);
        in.close();
        in2.close();
        reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //测试查询大字段表
    @Test
    public void testSelect() {
        List<BigData> list = bigDataMapper.selectList(null);
        try {
            for(BigData big:list) {
                //打印出 id
                System.out.println("id = "+big.getId());
                //将 photo 列信息输出到指定路径
                FileOutputStream fos = new FileOutputStream("D:/"+big.getId()+"_DM8特点.jpg");
                fos.write(big.getPhoto());
                //将 describe 列信息输出到指定路径
                FileOutputStream fos2 = new FileOutputStream("D:/"+big.getId()+"_Blob_DM8特点.jpg");
                fos2.write(big.getDescribe());
                //将 photo 列信息输出到控制台
                System.out.println("txt="+big.getTxt());
                fos.close();
                fos2.close();
        }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果截图

运行前如下图所示:

运行前

运行后控制台输出 Clob 里保存的大字段文本信息,如下图所示:

输出 Clob 里保存的大字段文本信息

运行后读取处理 Image 大字段和 Blob 大字段后的信息,如下图所示:

读取处理 Image 大字段和 Blob 大字段后的信息

运行后数据库数据信息如下图所示:

Image 类型字段数据库保存的是图片信息

Blob 类型字段数据库保存的是文本信息

示例代码下载

请下载示例代码

微信扫码
分享文档
扫一扫
联系客服