用資料庫和JDBC完成控制檯版本的簡易新聞釋出系統
阿新 • • 發佈:2020-12-03
簡易新聞釋出系統
一、功能介紹
1、程式執行時,首先顯示最近的5條新聞的標題(按照新聞的釋出時間排序),然後提示操作選單,執行效果圖如下:
2、如果選擇選單A能顯示所有的新聞標題(按照新聞的釋出時間排序)後提示操作選單,執行效果圖如下:
3、如果選擇選單B則根據使用者輸入的新聞的編號來顯示新聞的詳細資訊(新聞詳細內容的顯示格式不做要求)以及所有的新聞評論,然後提示操作選單,執行效果圖如下:
4、如果選擇選單C,則根據使用者輸入的新聞編號來新增評論,然後提示操作選單,執行效果圖如下:
5、選擇D則結束程式。
二、開發背景
開發工具為mysql+IDEA。
使用經典MVC模式。
V即View檢視是指使用者看到並與之互動的介面。比如由html元素組成的網頁介面,或者軟體的客戶端介面。MVC的好處之一在於它能為應用程式處理很多不同的檢視。在檢視中其實沒有真正的處理髮生,它只是作為一種輸出資料並允許使用者操縱的方式。
M即model模型是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的資料是中立的,模型與資料格式無關,這樣一個模型能為多個檢視提供資料,由於應用於模型的程式碼只需寫一次就可以被多個檢視重用,所以減少了程式碼的重複性。
三、專案結構
四、file.properties
DRIVER = com.mysql.jdbc.Driver
URL = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
USER = root
PWD = root
五、DBUtils工具類
package utils; import com.alibaba.druid.pool.DruidDataSource; import org.apache.commons.dbutils.BasicRowProcessor; import org.apache.commons.dbutils.GenerousBeanProcessor; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import java.io.File; import java.io.FileInputStream; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.Properties; public class DBUtils { // 要連線的驅動型別 private static String DRIVER = null; //要連線的URL private static String URL = null; // 要連線的資料庫的使用者名稱 private static String USER = null; // 要連線的資料庫的密碼 private static String PWD = null; private static QueryRunner runner ; static { //建立聯結器 File f = new File("src/file.properties"); Properties p = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream(f); p.load(fis); DRIVER = p.getProperty("DRIVER"); URL = p.getProperty("URL"); USER = p.getProperty("USER"); PWD = p.getProperty("PWD"); fis.close(); } catch (Exception e) { e.printStackTrace(); } //連線資料庫 DruidDataSource ds = new DruidDataSource(); ds.setUrl(URL); ds.setUsername(USER); ds.setPassword(PWD); ds.setDriverClassName(DRIVER); runner = new QueryRunner(ds); } /** * 進行新增、修改、刪除操作 * @param sql 進行操作的SQL語句 * @param param 操作對應的引數,替代SQL中的佔位符 * @return SQL執行後受影響的行 */ public static int update(String sql ,Object... param ){ try { return runner.update(sql, param); } catch (SQLException e) { e.printStackTrace(); } return 0 ; } /** * 查詢1個物件封裝成Bean物件 * @param sql 進行操作的SQL語句 * @param clazz 結果封裝的Bean型別 * @param param 操作對應的引數,替代SQL中的佔位符 * @return SQL操作後的Bean物件,如果異常則返回null */ public static<T> T queryOneToBean(String sql, Class<T> clazz,Object... param ){ try { BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor()); return runner.query(sql, new BeanHandler<T>(clazz,brp),param); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 查詢只有1行結果的操作,結果封裝成Map * @param sql 進行操作的SQL語句 * @param param 操作對應的引數,替代SQL中的佔位符 * @return SQL操作後的1行內容封裝到Map中,如果異常則返回null */ public static Map<String,Object> queryOneToMap(String sql, Object... param ){ try { return runner.query(sql,new MapHandler(),param); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 有多行結果的查詢操作,結果封裝成List,元素為bean型別 * @param sql sql 進行操作的SQL語句 * @param clazz 結果封裝的Bean型別 * @param param 操作對應的引數,替代SQL中的佔位符 * @return SQL操作後的多行內容封裝到List中,如果異常則返回null */ public static<T> List<T> queryAllList(String sql, Class<T> clazz,Object... param ){ try { BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor()); return runner.query(sql, new BeanListHandler<T>(clazz,brp),param); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 查詢有多行結果的操作,結果封裝成List中,元素為map型別 * @param sql 進行操作的SQL語句 * @param param 操作對應的引數,替代SQL中的佔位符 * @return SQL操作後的多行內容封裝到List中,如果異常則返回null */ public static List<Map<String,Object>> queryAllMap(String sql, Object... param ){ try { return runner.query(sql,new MapListHandler(),param ); } catch (SQLException e) { e.printStackTrace(); } return null; } }
六、NewsView(使用者介面)
package view;
import java.util.Scanner;
//使用者介面
public class NewsView {
//建立scanner物件,獲取輸入的資訊
private static Scanner sc =new Scanner(System.in);
//主介面
public void show(){
System.out.println("最新新聞標題如下:");
}
//選單
public String showMenu(){
System.out.println("操作選單如下:");
System.out.println("A.瀏覽所有新聞標題");
System.out.println("B.瀏覽新聞詳細資訊");
System.out.println("C.發表評論");
System.out.println("D.退出");
System.out.print("請選擇:");
return sc.next();
}
//B則根據使用者輸入的新聞的編號來顯示新聞的詳細資訊
public int newsMessage(){
System.out.print("請選擇要瀏覽的新聞的編號:");
return sc.nextInt();
}
public void showComment(){
System.out.println("新聞評論如下:");
}
//C根據使用者輸入的新聞編號來新增評論
public int addCommentsNum(){
System.out.print("請選擇要新增評論的新聞的編號:");
return sc.nextInt();
}
public String addCommentsMsg(){
System.out.print("請輸入評論內容:");
return sc.next();
}
public void addCommentsResult(int a){
if (a>0){
System.out.println("恭喜您!評論發表成功!");
}
}
}
七、NewsModel(業務模型)
package model;
import beans.News;
import utils.DBUtils;
import java.util.List;
import java.util.Map;
//業務模型:資料處理
public class NewsModel {
//主介面:前五條新聞標題
public void show(){
List<Map<String, Object>> maps = DBUtils.queryAllMap("SELECT * from news limit 0,5;");
for (Map map:maps) {
System.out.println(map.get("news_id")+"\t"+map.get("news_name")+"\t"+map.get("news_time"));
}
}
//A.能顯示所有的新聞標題
public void showAllNews(){
List<Map<String, Object>> maps = DBUtils.queryAllMap("SELECT * from news ");
for (Map map:maps) {
System.out.println(map.get("news_id")+"\t"+map.get("news_name")+"\t"+map.get("news_time"));
}
}
//B則根據使用者輸入的新聞的編號來顯示新聞的詳細資訊
public void showMessage(int a){
News news = DBUtils.queryOneToBean("SELECT * from news where news_id=?", News.class, a);
System.out.println(news);
}
//評論查詢和輸出
public void showComments(int a){
int i =1;
List<Map<String, Object>> maps = DBUtils.queryAllMap("SELECT * from comments where news_id=? ",a);
for (Map map:maps) {
System.out.println(i+"\t"+map.get("comment_name")+"\t"+map.get("comment_time"));
i++;
}
}
//C根據使用者輸入的新聞編號來新增評論
//判斷是否有這個新聞編號
public int addCommentsNum(int a){
News news = DBUtils.queryOneToBean("SELECT * from news where news_id=?", News.class, a);
if (news==null){
return -1;
}
return 1;
}
//新增評論
public int addComment(int a,String msg){
return DBUtils.update("INSERT into comments VALUES (NULL,?,NULL,?)", msg, a);
}
}
八、NewsController(控制器)
package controller;
import model.NewsModel;
import view.NewsView;
//控制器
public class NewsController {
//建立view和model的物件
private static NewsView view= new NewsView();
private static NewsModel model= new NewsModel();
public static void main(String[] args) {
//定義選單控制器
boolean isWork=true;
//主介面:顯示最近的5條新聞的標題
view.show();
model.show();
while (isWork){
//操作選單
String chose = view.showMenu();
//A能顯示所有的新聞標題
if (chose.equals("A")){
view.show();
model.showAllNews();
//B則根據使用者輸入的新聞的編號來顯示新聞的詳細資訊
}else if (chose.equals("B")){
//獲取新聞編號
int newsMessage = view.newsMessage();
//顯示新聞內容
model.showMessage(newsMessage);
view.showComment();
//顯示評論內容
model.showComments(newsMessage);
//C根據使用者輸入的新聞編號來新增評論
}else if (chose.equals("C")){
//獲取新聞編號
int addCommentsNum = view.addCommentsNum();
//判斷是否有這個新聞編號
int i = model.addCommentsNum(addCommentsNum);
if (i>0){
//獲取評論內容
String addCommentsMsg = view.addCommentsMsg();
//新增
int i1 = model.addComment(addCommentsNum, addCommentsMsg);
view.addCommentsResult(i1);
}
//退出
}else if (chose.equals("D")){
isWork=false;
}
}
}
}
九、News新聞標題類
package beans;
//新聞標題類
public class News {
private int news_id;
private String news_name;
private String news_time;
private String news_msg;
@Override
public String toString() {
return
"新聞標題:" + news_name + '\n' +
"釋出時間:" + news_time + '\n' +
"新聞詳細內容:"+'\n' +'\t'+news_msg;
}
public String getNews_msg() {
return news_msg;
}
public void setNews_msg(String news_msg) {
this.news_msg = news_msg;
}
public int getNews_id() {
return news_id;
}
public void setNews_id(int news_id) {
this.news_id = news_id;
}
public String getNews_name() {
return news_name;
}
public void setNews_name(String news_name) {
this.news_name = news_name;
}
public String getNews_time() {
return news_time;
}
public void setNews_time(String news_time) {
this.news_time = news_time;
}
}
十、資料庫
簡易新聞釋出系統
建立新聞標題表
create table news(
news_id int PRIMARY key auto_increment,
news_name VARCHAR(20),
news_time VARCHAR(20),
news_msg VARCHAR(300)
);
新增資料
INSERT into news VALUES (NULL,'習近平','2018-3-6 14:15:12',"習近平畫了七個同心圓##############################################");
INSERT into news VALUES (NULL,'兩會的將軍','2018-3-6 08:25:10',"出席兩會的294位軍方代表中##############################################");
INSERT into news VALUES (NULL,'特朗普','2018-3-5 18:00:00',"美特朗普##############################################");
INSERT into news VALUES (NULL,'格力小米','2018-3-5 14:20:00',"格力小米##############################################");
INSERT into news VALUES (NULL,'樂視','2018-3-5 10:10:10',"賠錢也開心##############################################");
INSERT into news VALUES (NULL,'范冰冰','2018-3-5 09:10:10',"范冰冰自認魅力##############################################");
INSERT into news VALUES (NULL,'C羅','2018-3-4 16:10:10',"C羅被皇馬隊友圍剿##############################################");
INSERT into news VALUES (NULL,'無逆轉','2018-3-4 13:10:10',"無逆轉不紅魔,背水一戰##############################################");
檢視資料
SELECT * from news limit 0,5;
SELECT * from news ORDER BY 'news_time' DESC
SELECT * from news where news_id=4
select * from news where 1=1 and news_id = 2 order by id desc limit 0,5
刪除資料
DELETE from goods where goods_id = 6;
建立新聞評論表
create table comments(
comment_id int PRIMARY key auto_increment,
comment_name VARCHAR(20),
comment_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
news_id int,
FOREIGN KEY(news_id) REFERENCES news(news_id)
);
新增資料
INSERT into comments VALUES (NULL,'舉報了','2018-3-5 09:52:39',4);
INSERT into comments VALUES (NULL,'無力還債','2018-3-5 20:30:39',4);
INSERT into comments VALUES (NULL,'以身相許','2018-3-6 08:02:39',4);
INSERT into comments VALUES (NULL,'請在一起','2018-3-6 12:52:39',4);
INSERT into comments VALUES (NULL,'請在一起',NULL,4);
檢視
SELECT * from comments where news_id=4