首页 > 数据库 >Java用本地字典数据库实现英语单词翻译

Java用本地字典数据库实现英语单词翻译

时间:2024-12-26 11:09:53浏览次数:6  
标签:英语单词 String word dictionaryDto wordModel spring Java append 字典

Java用本地字典数据库实现英语单词翻译

依赖的准备

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>ExtractWord</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ExtractWord</name>
    <description>ExtractWord</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.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-starter-test</artifactId>
            <scope>test</scope>
            <version>${spring-boot.version}</version> <!-- 统一版本 -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

持久层

现在我们开始构建持久层数据库的部分。我们先从网上找了一个数据库文件,这个网上很好找的。

image-20241226090011087

package com.example.extractword.entity.model;


import lombok.Data;

@Data
public class WordModel {

    private String id;
    private String word;
    private String enPronunciation;
    private String usPronunciation;
    private String description;
}

把数据库建好之后的下一步就是要去编写对应的接口类了。

package com.example.extractword.mapper;

import com.example.extractword.entity.model.WordModel;


public interface WordMapper {


    WordModel findByWord( String word);


    Integer insert(WordModel wordModel);

}

我们目前就设置了两个方法,一个是插入,一个是查询。按理来说我们已经有了字典数据库了,还需要插入什么吗?不过有些时候在一些自动程序里,指不定不要查一些什么词,某个词的衍生词或者词性变换等可能字典里可就没有,那这时候就需要借助别的手段来获取信息然后插入进去。

现在开始写对应的mapper.xml文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性:用于指定当前的映射文件和哪个接口进行映射,需要指定
接口的文件路径,完整的路径接口-->
<mapper namespace="com.example.extractword.mapper.WordMapper">
    <resultMap id="WordModelMap" type="com.example.extractword.entity.model.WordModel">
        <id column="id" property="id"></id>
        <result column="en_pronunciation" property="enPronunciation"></result>
        <result column="us_pronunciation" property="usPronunciation"></result>


    </resultMap>

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO tb_words(word,en_pronunciation,us_pronunciation,description) VALUES (#{word},#{enPronunciation},#{usPronunciation},#{description})
    </insert>

    <select id="findByWord" resultMap="WordModelMap">
        SELECT * FROM tb_words WHERE word = #{word}
    </select>
</mapper>

这个写法可以参照我的另一篇文章用一个项目把控制层、业务层、持久层说明白了,每一句话都讲的很清楚 - ivanlee717 - 博客园来对着写。

具体用到插入的时候我们再细讲。

然后在application.properties文件里设置好相关的数据库信息

#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mapper/*.xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.example.extractword.entity.model
# 应用服务 WEB 访问端口
server.port=8081

spring.datasource.url=jdbc:mysql://localhost:3306/YOUR_DATABASE?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=*****

业务层

    public String fetchDataFromDictionary(String word){

        try {
            WordModel wordModel = new WordModel();
            wordModel = wordMapper.findByWord(word);
            if (wordModel == null) {
                wordModel = fetchWordFromNet(word);
            }

            DictionaryDto dictionaryDto = new DictionaryDto();
            dictionaryDto.setWord(word);
            dictionaryDto.setEnPronunciation(wordModel.getEnPronunciation());
            dictionaryDto.setUsPronunciation(wordModel.getUsPronunciation());
            dictionaryDto.setDescription(wordModel.getDescription());

            // Check if pronunciation is available
            if ((dictionaryDto.getEnPronunciation() == null || dictionaryDto.getEnPronunciation().isEmpty()) &&
                    (dictionaryDto.getUsPronunciation() == null || dictionaryDto.getUsPronunciation().isEmpty())) {
                return "单词: " + word + ", 发音未找到, 翻译: " + dictionaryDto.getDescription();
            }

            return dictionaryDto.DToConvertToString();
        } catch (Exception e) {
            return "单词: " + word + ", 异常: " + e.getMessage();
        }
    }

主要的逻辑就在这个方法里面。不过这之前要设定好service接口和这个impl实现方法。这里我们引入了dto规范,因为字段比较少,所以他和数据库的内容是完全一样的,但是如果没有返回数据,则说明数据库里没有这个单词,我们就需要借助网络来翻译。这个方法我也已经在Java实现单词的翻译(详解爬虫操作) - ivanlee717 - 博客园这里面说清楚了

package com.example.extractword.entity.dto;

import lombok.Data;

@Data
public class DictionaryDto {

    private String word;
    private String enPronunciation;
    private String usPronunciation;
    private String description;


    public String DToConvertToString(){
        StringBuilder sb = new StringBuilder();
        sb.append(word).append(": ");
        if (enPronunciation != null && !enPronunciation.isEmpty()) {
            sb.append("英式发音: ").append(enPronunciation).append(", ");
        }
        if (usPronunciation != null && !usPronunciation.isEmpty()) {
            sb.append("美式发音: ").append(usPronunciation).append(", ");
        }
        sb.append("翻译: ").append(description);
        return sb.toString();
    }
}

这样的话我们就通过find方法找到了单词。

现在再说一下insert方法

WordModel wordModel = new WordModel();
wordModel.setWord(word);
wordModel.setEnPronunciation(En_phoneticElements.first().text().toString());
wordModel.setUsPronunciation(US_phoneticElements.first().text().toString());
for (Map<String, String> result : results) {
    String pos = result.get("pos");
    String translation = result.get("translation");
    combinedResult.append(pos).append(translation).append(" ");
}

wordModel.setDescription(combinedResult.toString().replace("'", "''"));
Integer res = wordMapper.insert(wordModel);

我们把对应的爬取信息存到一个对象里面,按照字段依次插入进去就可以了。

标签:英语单词,String,word,dictionaryDto,wordModel,spring,Java,append,字典
From: https://www.cnblogs.com/ivanlee717/p/18632289

相关文章

  • 【Java】Java中的常见日期对象
    类名说明java.util.Date这是Java早期版本中的主要日期类,尽管现在已经被java.time包中的类所取代,但在一些旧代码库中仍然可以看到它的身影java.util.Calendar这是一个抽象类,提供了操作日历字段如年、月、日、时、分、秒的方法。Calendar类本身不能直接实例化,而是通过调......
  • Java面试要点99 - Java线程池的关闭过程
    文章目录引言一、线程池的关闭方式1.1shutdown方法1.2shutdownNow方法二、关闭过程中的状态转换2.1线程池状态监控2.2优雅关闭的实现三、任务处理与异常处理3.1关闭时的任务处理3.2关闭过程中的异常处理总结引言线程池的关闭是Java并发编程中的重要环节,......
  • Java面试要点98 - Java中线程池的任务提交过程
    文章目录引言一、任务提交方式1.1execute方法1.2submit方法二、任务执行流程2.1核心流程分析2.2任务状态转换三、任务队列处理3.1队列类型选择3.2队列满时的处理四、异常处理4.1提交时异常处理4.2执行时异常处理总结引言在Java并发编程中,了解线程池的......
  • Java面试要点97 - Java中ThreadPoolExecutor源码解析
    文章目录引言一、核心属性1.1状态与线程数量的原子控制1.2任务队列与工作线程组二、Worker线程包装类2.1Worker类的设计三、任务提交源码分析3.1execute方法实现3.2addWorker核心方法四、任务执行源码分析4.1runWorker方法实现4.2getTask方法分析五、线程池......
  • 【最新原创毕设】基于PPH的花涧订购系统+00332(免费领源码)可做计算机毕业设计JAVA、PHP
    摘 要近年来,电子商务的快速发展引起了行业和学术界的高度关注。花涧订购系统旨在为用户提供一个简单、高效、便捷的花卉购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融合,从而提升系统的可操作性。因此,我们需要深入研究信息内容,并利用......
  • JavaScript中的数组和函数在内存分别是如何存储的?
    在JavaScript中,数组和函数在内存中的存储方式涉及到JavaScript的内存管理机制,特别是堆(Heap)和栈(Stack)的使用。虽然这些概念在底层实现上可能因JavaScript引擎(如V8,SpiderMonkey等)的不同而有所差异,但我们可以从一个高层次的视角来理解它们。1.数组在内存中的存储数组在JavaScript......
  • JavaScript的对象属性描述符有哪些?分别有什么作用?
    在JavaScript中,对象的属性描述符主要分为两类:数据描述符和存取描述符。它们都具有以下属性:数据描述符:具有值的属性,该值可能是可写的,也可能不是。数据描述符具有以下属性:value:属性的值。默认是undefined。writable:当且仅当属性的值可能改变时为true。默认是false。enumer......
  • java基础3
    异常Java异常类层次结构图概览:Exception和Error有什么区别?在Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable类有两个重要的子类:Exception:程序本身可以处理的异常,可以通过catch来进行捕获。Exception又可以分为CheckedExcept......
  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行......
  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总 1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行.......