用数据库和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,'新闻1','2018-3-6 14:15:12',"新闻1详细内容##############################################");
INSERT into news VALUES (NULL,'新闻2','2018-3-6 08:25:10',"新闻2详细内容##############################################");
INSERT into news VALUES (NULL,'新闻3','2018-3-5 18:00:00',"新闻3详细内容##############################################");
INSERT into news VALUES (NULL,'新闻4','2018-3-5 14:20:00',"新闻4详细内容##############################################");
INSERT into news VALUES (NULL,'新闻5','2018-3-5 10:10:10',"新闻5详细内容##############################################");

INSERT into news VALUES (NULL,'新闻6','2018-3-5 09:10:10',"新闻6详细内容##############################################");
INSERT into news VALUES (NULL,'新闻7','2018-3-4 16:10:10',"新闻7详细内容##############################################");
INSERT into news VALUES (NULL,'新闻8','2018-3-4 13:10:10',"新闻8详细内容##############################################");

查看数据
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,'评论1','2018-3-5 09:52:39',4);
INSERT into comments VALUES (NULL,'评论2','2018-3-5 20:30:39',4);
INSERT into comments VALUES (NULL,'评论3','2018-3-6 08:02:39',4);
INSERT into comments VALUES (NULL,'评论4','2018-3-6 12:52:39',4);



INSERT into comments VALUES (NULL,'评论5',NULL,4);
查看
SELECT * from comments where news_id=4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝皮蛋瘦肉粥的小饶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值