阅读 229

SpringBoot 读取本地txt文件并写入数据库

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

前言

今天我们就记录一下如何建一个 SpringBoot 项目,通过它读取本地的一个 txt 文件,并把内容写入数据库。重点来捋一捋这其中的逻辑。

一.建SpringBoot项目

  • 选择 Spring Initializr ,如下图:

11.PNG

  • 之后就点击 next

22.PNG

  • Java version 选一下对应的版本,点击 next

33.PNG

  • 选择 Web -> Spring Web ,点击 next ,之后起一下项目名,点击 finish 即可。
  • 依据 SpringMVC 的思想,构建如下文件,目录结构如下:

44.PNG

二.逻辑

2.1 分析需求

简单理一理就是需要写一个实体类,接受读出的内容,然后写sql语句把内容插入数据库中! 本地文件如下:

书名               ISBN                   作者                             出版社
原则;            9787508684031;  瑞·达利欧;                 中信出版社
阿米巴经营; 9787111502197;   森田直行;                  机械工业出版社 
追风筝的人; 9787208061644;  卡勒德·胡赛尼;          上海人民出版社
OKR工作法; 9787508679099;  克里斯蒂娜·沃特克;  中信出版社
解忧杂货店;  9787544298995; 东野圭吾;                  南海出版公司
复制代码

数据库可以先在可视化工具中建好表和字段;具体的sql语句就是:

create table db_test.testBook (name varchar(300),ISBN varchar(300),writer varchar(300),cbs varchar(300));
复制代码

2.2 读文件

这个地方涉及到IO操作,我做的处理比较简单,就是用 File 的 一些 FileInputStream ,InputStreamReader,BufferedReader 读取。因为txt文件中的数据格式不规范,所以读出之后要进行一些处理,比如去除每一行的空格,然后把每一行用 “;” 分割后写入一个数组,之后把数组加入一个list里。
这部分代码如下:对照着理解会更容易一些。


File file=new File("D:/books.txt");//txt文件路径
String tempString=null;
List<Book> books=new ArrayList<Book>();//声明一个list存放数据
int line=-1;
try{
    BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));//注意编码格式UTF-8,这里就是读出内容;
    while ((tempString=reader.readLine())!=null){
        line++;
        if(line>=1){//第一行是表头,数据库里不需要了
            String s=tempString.replaceAll("\s*", "");//去除行内所有空格
            String [] ary=s.split(";");//把每行字符串分割
            Book book=new Book();//声明实体类对象
            book.setName(ary[0]);//取对应的值
            book.setISBN(ary[1]);
            book.setWriter(ary[2]);
            book.setCbs(ary[3]);
            books.add(book);//添加到list里
        }
    }
    reader.close();//注意关闭读写流
}catch (FileNotFoundException e){
    e.printStackTrace();
}catch (IOException e){
    e.printStackTrace();
}//处理异常
复制代码

2.3 写入数据库

在BookMapper.xml文件里写sql语句,因为文件有很多行,所以插入数据库的时候有很多条记录,这里采用一个foreach方法循环插入,可以完美地解决!注意: insert 语句结尾不要加符号!foreach里的separator 是“,” ,不是分号!当数据库里有多个模式的时候,要加上模式名!

<insert id="insertBook" parameterType="com.example.homework0804.model.Book">
    insert into db_test.testBook values
    <foreach collection='list' item='item' index='index' separator=','>
        (#{item.name},#{item.ISBN},#{item.writer},#{item.cbs})
    </foreach>
</insert>
复制代码

三.调试

3.1 步骤:

运行项目,在浏览器地址栏输入:localhost:项目端口号/swagger-ui.html

55.PNG

点进去就有我们写的这个 POST 方法,再点进去 POST 方法就是下面这样:

66.PNG

点击 Try it out 运行,成功的话会在 Response 里返回200!在 Description 里会有一个数字,表示插入数据库几条记录!然后我们打开数据库查询就能看到对应的数据!

3.2 经验

在运行的时候页面如下:

77.PNG

明明我们写了POST接口,但是页面上没有内容!IDEA 也不报错!检查浏览器控制台发现:

Failed to load resource: the server responded with a status of 404 ()

88.PNG

这是因为 Swagger2Config里扫描接口的包包名有误!

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket getUserDocket(){
        ApiInfo apiInfo=new ApiInfoBuilder()
                .title("Springboot基础")//api标题
                .description("Springboot基础文档")//api描述
                .version("1.0.0")//版本号
                .contact("张三")//本API负责人的联系信息
                .build();
        return new Docket(DocumentationType.SWAGGER_2)//文档类型(swagger2)
                .apiInfo(apiInfo)//设置包含在json ResourceListing响应中的api元信息
                .select()//启动用于api选择的构建器
   .apis(RequestHandlerSelectors.basePackage("com.example.homework0804.controller"))//扫描接口的包 正确            //.apis(RequestHandlerSelectors.basePackage("com.example.homework.controller"))//扫描接口的包  错误
                .paths(PathSelectors.any())//路径过滤器(扫描所有路径)
                .build();
    }
}
复制代码

这也是我的一个经验教训,在这里记录并分享给大家!

文章分类
后端
文章标签