1. 程式人生 > 資料庫 >用資料庫和JDBC完成控制檯版本的簡易新聞釋出系統

用資料庫和JDBC完成控制檯版本的簡易新聞釋出系統

簡易新聞釋出系統

一、功能介紹

1、程式執行時,首先顯示最近的5條新聞的標題(按照新聞的釋出時間排序),然後提示操作選單,執行效果圖如下:

在這裡插入圖片描述

2、如果選擇選單A能顯示所有的新聞標題(按照新聞的釋出時間排序)後提示操作選單,執行效果圖如下:
在這裡插入圖片描述

3、如果選擇選單B則根據使用者輸入的新聞的編號來顯示新聞的詳細資訊(新聞詳細內容的顯示格式不做要求)以及所有的新聞評論,然後提示操作選單,執行效果圖如下:
在這裡插入圖片描述

4、如果選擇選單C,則根據使用者輸入的新聞編號來新增評論,然後提示操作選單,執行效果圖如下:

在這裡插入圖片描述

5、選擇D則結束程式。

二、開發背景

開發工具為mysql+IDEA。
使用經典MVC模式。

M是指業務模型,V是指使用者介面,C則是控制器,使用MVC的目的是將M和V的實現程式碼分離,從而使同一個程式可以使用不同的表現形式。
V即View檢視是指使用者看到並與之互動的介面。比如由html元素組成的網頁介面,或者軟體的客戶端介面。MVC的好處之一在於它能為應用程式處理很多不同的檢視。在檢視中其實沒有真正的處理髮生,它只是作為一種輸出資料並允許使用者操縱的方式。
M即model模型是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的資料是中立的,模型與資料格式無關,這樣一個模型能為多個檢視提供資料,由於應用於模型的程式碼只需寫一次就可以被多個檢視重用,所以減少了程式碼的重複性。
C即controller控制器是指控制器接受使用者的輸入並呼叫模型和檢視去完成使用者的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示返回的資料。

三、專案結構

在這裡插入圖片描述

在這裡插入圖片描述

四、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