日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个简单的格式化信函生成器

發(fā)布時(shí)間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个简单的格式化信函生成器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


? ? ? ? 童鞋們都應(yīng)該見過各種各樣的請(qǐng)柬咯, 請(qǐng)柬上面通常是一個(gè)模板,然后填上被邀請(qǐng)人及相關(guān)信息,在 Word 里面稱之為 “郵件合并”特性。 今天,我們就來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的格式化信函生成器。 我們將要做的東西, 包括一個(gè)非常簡(jiǎn)單的學(xué)生選課數(shù)據(jù)庫,以及簡(jiǎn)單的模板, 利用數(shù)據(jù)庫中的記錄及模板生成格式化的通知信息。 關(guān)于C語言的實(shí)現(xiàn), 請(qǐng)參考 《編程珠璣I》(第二版) 的第三章第二節(jié)。

? ? ? ? 別看這個(gè)東西簡(jiǎn)單, 其中也蘊(yùn)涵了不變和變化的部分。 不變是信息模板內(nèi)容, 變化部分是數(shù)據(jù)庫中的記錄信息, 所要做的,就是將不變和變化隔離開來。 基本的設(shè)計(jì)思想如下:

? ? ? ? 1. ?一個(gè)非常簡(jiǎn)單的學(xué)生選課數(shù)據(jù)庫, 包括學(xué)生信息表 students , 課程信息表 courses, 學(xué)生選課信息表 stus_cours;?

? ? ? ? 2. ?一個(gè)JDBC 實(shí)用工具類 JDBCUtil , 主要是從數(shù)據(jù)庫中檢索記錄, 并將其轉(zhuǎn)換為相應(yīng)的記錄對(duì)象 DBRecord;?

? ? ? ? 3. ?記錄對(duì)象 DBRecord: 包含一個(gè) String[] 數(shù)組, 用來存儲(chǔ)每條記錄中的數(shù)據(jù)項(xiàng),一個(gè) String 對(duì)應(yīng)一條基本數(shù)據(jù)項(xiàng)。

? ? ? ? 4. ?模板信息接口: interface Template , 包含一個(gè) getText() 的方法聲明;

? ? ? ? 5. ?兩個(gè)模板實(shí)現(xiàn): 課程開設(shè)信息 CourseInfoTemplate 及 學(xué)生選課信息 CourseChosenTemplate

? ? ? ? 6. ?格式化信函生成器 FormattedLetter : 根據(jù)數(shù)據(jù)庫記錄及模板生成格式化通知

? ? ? ? 因?yàn)檫@個(gè)東西并不復(fù)雜, ?這里就不講解太多了, 相信童鞋們看過代碼之后很快就會(huì)明白的。下面給出代碼實(shí)現(xiàn):

? ? ? ? ### course.sql 

############################################## # course.sql: 建立一個(gè)簡(jiǎn)單的學(xué)生選課數(shù)據(jù)庫 # NOTE: 必須保存為 utf-8 格式(文件 - 另存為), # 以保證在命令行下執(zhí)行該文件能夠順利插入中文 ############################################################################################ # how to exec sql file # mysql -u root -p < /your_path/course.sql # Enter password: [input your root password] ############################################## # 或者使用 root 登錄 mysql, # 然后復(fù)制所有語句在 mysql 中執(zhí)行。 ################################################################################### # mysql statement: ######################################CREATE USER 'course6'@'localhost' IDENTIFIED BY 'course6'; CREATE DATABASE course; grant all on course.* to 'course6'@'localhost';#####################################USE course;CREATE TABLE students ( id INT NOT NULL AUTO_INCREMENT, stuName varchar(12) NOT NULL, PRIMARY KEY(id)) ;CREATE TABLE courses (id INT NOT NULL AUTO_INCREMENT, cName varchar(15) NOT NULL, cTime int NOT NULL, note varchar(30),PRIMARY KEY(id)) ;CREATE table stus_cours ( stu_id int NOT NULL, cour_id int NOT NULL, sch_term varchar(5) NOT NULL, PRIMARY KEY(stu_id, cour_id)); alter table stus_cours add constraint stuCons foreign key(stu_id) references students(id); alter table stus_cours add constraint courCons foreign key(cour_id) references courses(id);desc courses;desc students;desc stus_cours;insert into students values(10001, '小華');insert into students values(10002, '小明');insert into courses values(1001, '高數(shù)', 54, '');insert into courses values(1002, '大學(xué)英語', 81, '');insert into stus_cours values(10001, 1001, '2nd');insert into stus_cours values(10002, 1001, '2nd');insert into stus_cours values(10001, 1002, '1st');insert into stus_cours values(10002, 1002, '1st');SELECT * from students;SELECT * from courses;SELECT * from stus_cours;SELECT stuName , cName, cTime , sch_term FROM students, courses, stus_cours WHERE students.id = stus_cours.stu_id AND courses.id = stus_cours.cour_id;

  JDBCUtil.java

? ? ? ?

package javatech.JDBClearn;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import com.mysql.jdbc.ResultSetMetaData; import com.mysql.jdbc.Statement;public class JDBCUtil {private static Connection conn;private static final String mysqlDriver = "com.mysql.jdbc.Driver";private static final String mysqlURL = "jdbc:mysql://localhost:3306/course";private static final String username = "course6";private static final String password = "course6";private JDBCUtil() { }public static Connection getConnection() throws SQLException, ClassNotFoundException { Class.forName(mysqlDriver);conn = DriverManager.getConnection(mysqlURL, username, password);return conn; }public static void printResult(ResultSet rs) throws SQLException{ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();int colNum = rsmd.getColumnCount();while(rs.next()) {for (int i = 0; i < colNum; i++) System.out.printf(rs.getString(i+1) + " ");System.out.println();}}public static List<DBRecord> toRecords(ResultSet rs) throws SQLException {List<DBRecord> records = new ArrayList<DBRecord>();ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();int colNum = rsmd.getColumnCount();while(rs.next()) {String[] datas = new String[colNum]; for (int i = 0; i < colNum; i++) datas[i] = rs.getString(i+1);records.add(new DBRecord(datas));}rs.close();conn.close();return records;}public static ResultSet getResultSet(String sqlString) throws SQLException, ClassNotFoundException{Connection conn = getConnection();Statement stm = (Statement) conn.createStatement(); ResultSet rs = stm.executeQuery(sqlString);return rs;}public static void main(String[] args) throws SQLException, ClassNotFoundException{String sqlString = "SELECT stuName, cName, cTime, sch_term " +"FROM students, courses, stus_cours " +"WHERE students.id = stu_id AND " +" courses.id = cour_id; ";ResultSet rs = getResultSet(sqlString);printResult(rs);rs.close();conn.close();}}
? ? ? ? DBRecord.java

? ? ? ?

package javatech.JDBClearn;/*** DBRecord: 與數(shù)據(jù)庫中一條行記錄相對(duì)應(yīng)的數(shù)據(jù)對(duì)象**/ public class DBRecord {// 將數(shù)據(jù)庫中檢索到的一條記錄轉(zhuǎn)化為字符串并存儲(chǔ)private String[] datas;public DBRecord(String[] datas) {this.datas = datas;}// 返回?cái)?shù)據(jù)庫中一條記錄的第 index 個(gè)數(shù)據(jù)項(xiàng)public String getDataTerm(int index) {if (index < 0 || index > datas.length-1) {throw new ArrayIndexOutOfBoundsException("數(shù)組下標(biāo)越界!");}return datas[index];}// 返回?cái)?shù)據(jù)庫一條記錄所含的數(shù)據(jù)項(xiàng)的數(shù)目public int dataTermNum() {return datas.length;}public String toString() {StringBuilder sb = new StringBuilder("[DBRecord]: ");for (String s: datas) {sb.append(s);sb.append(' ');}sb.append('\n');return sb.toString();}}
? ? ? ? ?FormattedLetter.java

? ? ? ? ?

package javatech.JDBClearn;import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;public class FormattedLetter {/*** 用數(shù)據(jù)庫中每條記錄的數(shù)據(jù)項(xiàng)依序替換模板中的模板數(shù)據(jù)。* @param record 數(shù)據(jù)庫中的一條記錄* @param tpl 指定模板文件接口* @return 替換后的格式化信函*/public String formattedLetter(DBRecord record, Template tpl) {String text = tpl.getText();for (int i=0; i < record.dataTermNum(); i++) text = text.replaceAll("\\$" + (i+1), record.getDataTerm(i));return text;}/*** 批量生成格式化信函*/public List<String> batFormattedLetter(List<DBRecord> records, Template tpl){List<String> letters = new ArrayList<String>();for (DBRecord r: records) {letters.add(formattedLetter(r, tpl));}return letters;}/*** printList: 打印列表內(nèi)容*/public static <T> void printList(List<T> list){System.out.println("List: [");for (T t: list) {System.out.println(t);}System.out.println("]");}public static void test(String sqlStmt, Template tpl) throws SQLException, ClassNotFoundException{ResultSet rs = JDBCUtil.getResultSet(sqlStmt);List<DBRecord> records = JDBCUtil.toRecords(rs);List<String> letters = new FormattedLetter().batFormattedLetter(records , tpl);System.out.println("Formatted letters: ");printList(letters);}public static void main(String[] args) throws SQLException, ClassNotFoundException{String courseInfoSql = "SELECT cName, cTime FROM courses";test(courseInfoSql, new CourseInfoTemplate());String courseChosenString = "SELECT stuName, cName, cTime, sch_term " +"FROM students, courses, stus_cours " +"WHERE students.id = stu_id AND " +" courses.id = cour_id; ";test(courseChosenString, new CourseChosenTemplate()); }}

? ? ? ?? ? ?

? ? ? ? ? ?CourseInfoTemplate.java


package javatech.JDBClearn;public class CourseInfoTemplate implements Template {private String text = "同學(xué)們請(qǐng)注意: 本學(xué)期開設(shè)的課程有 $1, 共 $2 學(xué)時(shí),請(qǐng)勿錯(cuò)過!";public String getText(){return text;}}

? ? ? ? ?CourseChosenTemplate.java

? ? ? ? ?

package javatech.JDBClearn;public class CourseChosenTemplate implements Template {private String text = "$1 , 你好! 你所選修的課程是 $2, 共 $3 學(xué)時(shí), 在 $4 上, 請(qǐng)勿錯(cuò)過。 ";public String getText(){return text;}}

? ? ? ?Template.java


package javatech.JDBClearn;public interface Template {String getText();}


? ? ? ??末記: 可以改進(jìn)的地方

? ? ? ? ? 1. 使用 replaceAll 方法替換模板文件中的多個(gè)模板數(shù)據(jù)效率可能會(huì)有些低下, 有待改進(jìn);

? ? ? ? ? 2. 必須根據(jù)數(shù)據(jù)庫中檢索到的記錄的數(shù)據(jù)項(xiàng)順序及模板中定義的模板項(xiàng)依序?qū)?yīng)地替換,而不能無序的任意替換;

? ? ? ? ? 3. 模板文件及格式化信函生成器還可以做得更靈活一點(diǎn), 比如,添加輸入輸出流, 使之模板文件可以來自于各種輸入流而不是簡(jiǎn)單的字符串, 格式化信息可以輸出到各種目標(biāo)流中,而不僅僅是控制臺(tái)。
?

? ? ? ??

?

??

??

總結(jié)

以上是生活随笔為你收集整理的一个简单的格式化信函生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 苍井空张开腿实干12次 | 成人亚洲综合 | 国产精品久久久久久吹潮 | 日日色av | 亚洲网址在线观看 | 免费看黄av | 日本xxxxwww| 8x8ⅹ8成人免费视频观看 | 日韩欧美在线一区二区三区 | 黄色激情视频网站 | 国产污视频在线看 | 91天堂在线视频 | 国产福利视频 | 精品国产免费无码久久久 | 亚洲成av人片久久 | 秋霞成人午夜鲁丝一区二区三区 | 一区免费在线 | 啪啪的网站 | 亚洲一区二区三区三州 | 午夜精品福利视频 | 91麻豆国产在线观看 | 天天想夜夜操 | 亚洲欧美中文字幕5发布 | 欧美a级片视频 | 中文幕无线码中文字蜜桃 | 女人张开腿让男人桶爽 | 久久国产一区二区三区 | 日本天堂在线视频 | 国产传媒在线观看 | 日本国产一级片 | 久久国产精品偷 | 亚洲精品1区2区3区 国产丝袜网站 | 韩国甜性涩爱 | 国产毛片一区二区三区va在线 | 嘿咻视频在线观看 | 色乱码一区二区三区 | 久久久久久国产精品一区 | 成人免费看高清电影在线观看 | 樱花草av| 成人在线激情网 | 国产伦精品一区二区三区照片91 | 日韩区欧美区 | 人人妻人人澡人人爽人人dvd | 日本在线成人 | 91毛片网| 三区四区 | 黄色视屏在线 | 亚洲中文字幕一区二区 | 1000部做爰免费视频 | 91超碰人人 | 国产欧美a| 美女黄色真播 | 五月婷婷激情综合网 | 久久爱一区二区 | 强行侵犯视频在线观看 | 国产乡下妇女做爰 | 女人扒开腿让男人捅爽 | 少妇高潮一区二区三区99小说 | 亚洲第一伊人 | 在线免费观看福利 | 亚洲av综合色区无码一区爱av | 精品无码久久久久成人漫画 | 亚洲国产免费视频 | 免费在线日本 | 国产二区在线播放 | 日日夜夜精品免费 | 三级免费黄录像 | 成人区一区二区 | 中文在线字幕 | 成年人黄色免费网站 | 开心六月婷婷 | 精品综合久久久久 | 欧美日韩在线不卡 | 探花视频在线免费观看 | 不卡一区二区三区四区 | 午夜在线观看视频网站 | 国产又粗又猛视频 | 久久久影视 | 91精品国产乱码久久 | 伦理片一区二区三区 | 夜夜躁日日躁狠狠久久av | 色综合色综合网色综合 | 日韩中文字幕视频在线 | 欧美另类精品xxxx孕妇 | 丰满人妻中伦妇伦精品app | 国模私拍一区二区三区 | 欧美极品jizzhd欧美仙踪林 | 久久毛片视频 | 日本xx视频免费观看 | 欧美人日b| 一级不卡毛片 | 国产精品免费看 | 91大神在线免费观看 | 精品久久久久久久久久久 | 粉嫩精品久久99综合一区 | 青青青在线免费 | 色老头一区 | 91丝袜一区在线观看 | 欧美一级在线观看视频 |