书城项目第五阶段-图书模块
图书管理模块要做的事情如下:
========================================================================================================================
一、MVC 概念
MVC 全称:Model 模型、 View 视图、 Controller 控制器。
MVC 最早出现在 JavaEE 三层中的 Web 层,它可以有效的指导 Web 层的代码如何有效分离,单独工作。
View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作——JSP/HTML。
Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个“调度者”的角色——Servlet。转到某个页面。或者是重定向到某个页面。
Model 模型:将与业务逻辑相关的数据封装为具体的 JavaBean 类,其中不掺杂任何与数据处理相关的代码——JavaBean/domain/entity/pojo。
MVC 是一种思想
MVC 的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。
MVC 的作用还是为了降低耦合。让代码合理分层。方便后期升级和维护。
==========================================================================================================
二、图书模块
2.1 编写图书模块的数据库表
根据图书的信息决定创建数据库表所需要的字段:
创建数据库表t_book以及添加数据:
CREATE TABLE t_book ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR (100), `price` DECIMAL (11, 2), `author` VARCHAR (100), `sales` INT, `stock` INT, `img_path` VARCHAR (200) ) ; ## 插入初始化测试数据 INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'java 从入门到放弃', '国哥', 80, 9999, 9, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '数据结构与算法', '严敏君', 78.5, 6, 13, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '怎样拐跑别人的媳妇', '龙伍', 68, 99999, 52, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '木虚肉盖饭', '小胖', 16, 1000, 50, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'C++编程思想', '刚哥', 45.5, 14, 95, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '蛋炒饭', '周星星', 9.9, 12, 53, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '赌神', '龙伍', 66.5, 125, 535, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'Java 编程思想', '阳哥', 99.5, 47, 36, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'JavaScript 从入门到精通', '婷姐', 9.9, 85, 95, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'cocos2d-x 游戏编程入门', '国哥', 49, 52, 62, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'C 语言程序设计', '谭浩强', 28, 52, 74, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'Lua 语言程序设计', '雷丰阳', 51.5, 48, 82, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '西游记', '罗贯中', 12, 19, 9999, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '水浒传', '华仔', 33.05, 22, 88, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '操作系统原理', '刘优', 133.05, 122, 188, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '数据结构 java 版', '封大神', 173.15, 21, 81, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'UNIX 高级环境编程', '乐天', 99.15, 210, 810, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, 'javaScript 高级编程', '国哥', 69.15, 210, 810, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '大话设计模式', '国哥', 89.15, 20, 10, 'static/img/default.jpg' ) ; INSERT INTO t_book ( `id`, `name`, `author`, `price`, `sales`, `stock`, `img_path` ) VALUES ( NULL, '人月神话', '刚哥', 88.15, 20, 80, 'static/img/default.jpg' ) ; ## 查看表内容 SELECT id, NAME, author, price, sales, stock, img_path FROM t_book ;
效果如下:
2.2 编写图书模块的JavaBean
Book.java类:
注意:对于图片的路径,我们要求不能为空。
2.3 编写图书模块的Dao和测试Dao
BookDao接口:
public interface BookDao { /** * 添加一本书 * @param book * @return */ public int addBook(Book book); /** * 通过id删除一本书 * @param id * @return */ public int deleteBookById(Integer id); /** * 更新某一本书 * @param book * @return */ public int updateBook(Book book); /** * 通过id查询某一本书 * @param id * @return */ public Book queryBookById(Integer id); /** * 查询说有的图书 * @return */ public List<Book> queryBooks(); }
接口实现类:BookDaoImpl.java:
public class BookDaoImpl extends BaseDao implements BookDao { @Override public int addBook(Book book) { String sql = "insert into t_book(`name`,`author`,`price`,`sales`,`stock`,`img_path`) values(?,?,?,?,?,?)"; return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath()); } @Override public int deleteBookById(Integer id) { String sql = "delete from t_book where id = ?"; return update(sql,id); } @Override public int updateBook(Book book) { String sql = "update t_book set `name`=?,`author`=?,`price`=?,`sales`=?,`stock`=?,`img_path`=? where id = ?"; return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId()); } @Override public Book queryBookById(Integer id) { String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book where id = ?"; return queryForOne(Book.class,sql,id); } @Override public List<Book> queryBooks() { String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book"; return queryForList(Book.class,sql); } }
测试BookDaoTest:
public class BookDaoTest { private BookDao bookDao = new BookDaoImpl(); @Test public void addBook() { bookDao.addBook(new Book(null,"三国杀","老郭",new BigDecimal(43434),1188888,0,null)); } @Test public void deleteBookById() { bookDao.deleteBookById(21); } @Test public void updateBook() { bookDao.updateBook(new Book(21,"老郭说事","老郭",new BigDecimal(9999),1188888,0,null)); } @Test public void queryBookById() { System.out.println(bookDao.queryBookById(21)); } @Test public void queryBooks() { for (Book queryBook : bookDao.queryBooks()) { System.out.println(queryBook); } } }
2.4 编写图书模块的Service和测试Service
BookService接口:
public interface BookService { public void addBook(Book book); public void deleteBookById(Integer id); public void updateBook(Book book); public Book queryBookById(Integer id); public List<Book> queryBooks(); }
BookServiceImpl实现类:
public class BookServiceImpl implements BookService { private BookDao bookDao = new BookDaoImpl(); @Override public void addBook(Book book) { bookDao.addBook(book); } @Override public void deleteBookById(Integer id) { bookDao.deleteBookById(id); } @Override public void updateBook(Book book) { bookDao.updateBook(book); } @Override public Book queryBookById(Integer id) { return bookDao.queryBookById(id); } @Override public List<Book> queryBooks() { return bookDao.queryBooks(); } }
BookServiceTest测试:
public class BookServiceTest { private BookService bookService = new BookServiceImpl(); @Test public void addBook() { bookService.addBook(new Book(null,"西游记","4343",new BigDecimal(4444),4343433,7,null)); } @Test public void deleteBookById() { bookService.deleteBookById(22); } @Test public void updateBook() { bookService.updateBook(new Book(22,"水浒传","444",new BigDecimal(4444),22,74545,null)); } @Test public void queryBookById() { System.out.println(bookService.queryBookById(22)); } @Test public void queryBooks() { for (Book queryBook : bookService.queryBooks()) { System.out.println(queryBook); } } }
2.5 编写图书模块的Web 层,和页面联调测试