欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[JDBC初入门1] 实现英汉词典导入/查询

程序员文章站 2022-05-04 12:05:36
...

用之前jdbc的知识实现一个简单的基于本地数据库的词典查询类。
总体流程是先在本地数据库创建一个dictionary表单,再通过jdbc读取词典文件读入到此表单中,再提供查询方法。
词典文件可以在网上随便找个mdx格式的词典(https://freemdict.com/),再转成txt格式做一些处理(做法可参考https://blog.csdn.net/whbtomt/article/details/82151477)。
我自己找了个《四级英语重点词汇》来测试,将转好的txt各个词条内容用分隔符分开后导入数据库的代码如下:

private void init() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("英语4级词汇汇总.txt")),
			        "UTF-8"));
			String lineText = null;
			while((lineText = br.readLine()) != null) {
				String[] element = lineText.split("\t");
				if(element.length == 4) {
					insert(element[0], element[1], element[2], element[3]);
				}else insert(element[0], element[1], null, null);
			}
			br.close();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 每个词条有名称、释义(包含词性)、例题、解答,而例题和解答有的词条有,有的没有。

导入成功后就开始写查询方法了。对于jdbc查询,可以参考:https://www.yiibai.com/jdbc/jdbc-statements.html
jdbc提供了3种statement:Statement、PreparedStatement、CallableStatement,这三个对象依次继承自前者,添加了一些独有的功能。Statement支持普通的不带参的查询SQL,PreparedStatement支持可变参数的SQL,CallableStatement支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
我们的查询不需要调用储存过程,而PreparedStatement在安全性和性能上都优于Statement,具体可以参见这篇博客:https://www.cnblogs.com/liang-chen/p/11969788.html,写得很棒。

现在可以写出查询方法:

private String resultSql = "SELECT * FROM dictionary WHERE name = ?";

public Paraphrase search(String primaryWord) {
		String word = primaryWord.toLowerCase();
		try {
			stmt = conn.prepareStatement(resultSql);
			stmt.setString(1, word);
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				return new Paraphrase(rs.getString("name"), rs.getString("meaning"),     
                 rs.getString("question"), rs.getString("answer"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}  finally { try { if(stmt != null) { stmt.close(); } } catch (SQLException e) {
			e.printStackTrace(); } }
		return null;
	}

我们来运行测试一下:

public static void main(String[] args) {
		Base persons = new Base();
		persons.openDatabase();
		String[] strings = {"aaaaaa", "abstract", "AbStRaCt", "wofjsf", "abuse", "32133", "(*)*)()(*}"};
		for(String s : strings) {
			persons.print(s);
			System.out.print("\n");
		}
		persons.closeDatabase();
	}

结果为:

找不到单词

abstract
v.抽取;n.摘要 

abstract
v.抽取;n.摘要 

找不到单词

abuse
v.& n.滥用;滥用,谩骂〖同〗insult;虐待〖同〗mistreat
〖题〗He has ___ my confidence in him. A.abused B.chilled C.drafted D.dragged
〖解〗 答案A。句意为“他辜负了我对他的信任。”chill v.(使)寒冷;draft v.起草;drag v.拖拉。用在本句中都不合题意。

找不到单词

找不到单词