文章目錄
分層開發
- 表現層
- 業務邏輯層
- 數據訪問層
- 數據庫
後臺功能
準備工作
-
軟件
- IntellJ Idea 2017~2020版本都可以
- MySQL5.5~5.7 都可以{5.7的版本完全區分表的名稱大小寫}
- Jdk1.8 (示例開發:1.8.211)
- Tomcat(9.0)
- Maven3.63
-
創建Maven項目 命名store
-
選擇到maven
- Maven home directory:apache-maven-3.6.3
- User setting file:apache-maven-3.6.3\conf\settings.xml
-
關於Maven的設置
在maven的目錄下有一個文件夾叫conf(配置的目錄)內有一個文件名稱是 settings.xml 進行修改
- 修改 座標的下載位置[若不修改、需確定有D盤、且下方路徑存在]
<localRepository>D:\Tols\Repository</localRepository>
- 修改 jar下載源採用爲阿里鏡像
- 修改 座標的下載位置[若不修改、需確定有D盤、且下方路徑存在]
-
程序的目錄結構如下
-
src ----main -------java -------webapp ----test -------java ----pom.xml store.iml
-
-
編寫pom.xml
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>StoreMall</groupId> <artifactId>StoreMall</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>StoreMall Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <!--數據驅動包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--選擇【阿里巴巴的德魯伊】數據源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.14</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils --> <!--導入工具類:1.dbutils --> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils --> <!--導入工具類:2.beanutil --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <!--導入工具類:3.lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <!--依賴包: 日誌包--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- 導入servlet座標--> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- 導入jsp座標--> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <!-- 導入Jstl標準標籤庫的座標--> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <!--單元測試--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>storemall</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
-
-
配置文件- db.properties
-
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/store classname=root password=root
-
編寫代碼
-
創建各個包
- 實體包 entity
- 服務層(業務邏輯層)接口包 dao
- 服務層(業務邏輯層)接口的實現類包 daoimpl
- 持久層(數據訪問層)接口包 service
- 持久層(數據訪問層)接口的實現類包 serviceimpl
- 工具包 util
- 異常包 exception
- 通用包 commons
- 數據庫包
- Servlet包
- fifilter包
- [測試包] test
-
類目的實體類
-
Category
package cn.javabs.store.entity; /** * 類別 * getter和setter方法 * toString方法 * 構造方法 * 有參構造方法 * 無參構造方法 */ public class Category { private Integer cid; private String cname; @Override public String toString() { return "Category{" + "cid=" + cid + ", cname='" + cname + '\'' + '}'; } public Category(Integer cid, String cname) { this.cid = cid; this.cname = cname;} public Category() {super();} public Integer getCid() {return cid;} public void setCid(Integer cid) {this.cid = cid;} public String getCname() {return cname;} public void setCname(String cname) {this.cname = cname;} }
-
-
類目的Service的接口
-
CategoryService
package cn.javabs.store.service; import cn.javabs.store.entity.Category; import java.util.List; /** 類目的功能邏輯 * 思考? 類目會涉及到分頁功能嗎? | 不涉及到! */ public interface CategoryService { /** * 查詢全部類目 */ public List<Category> findAllCategries(); /** * 指定查找類目 */ public Category findCategoryById(Integer id); /** * 添加類目 */ public int addCategory(Category category); /** * 修改類目 */ public int editCategory(Category category); /** * 刪除類目 */ public int delCategory(Integer id); }
-
-
類目的Service的接口的實現類ServiceImpl
-
CategoryServiceImpl
package cn.javabs.store.service.impl; import cn.javabs.store.dao.CategoryDao; import cn.javabs.store.dao.impl.CategoryDaoImpl; import cn.javabs.store.entity.Category; import cn.javabs.store.service.CategoryService; import java.util.List; /** * 業務邏輯層實現類 */ public class CategoryServiceImpl implements CategoryService { // 創建Dao 層對象 進行此類中進行 dao類的方法 CategoryDao categoryDao = new CategoryDaoImpl(); /** * 查詢所有類目 */ @Override public List<Category> findAllCategries() { List<Category> categoryList = categoryDao.findAll(); return categoryList; } /** * 指定查詢類目 */ @Override public Category findCategoryById(Integer id) { Category category = categoryDao.findById(id); return category; } /** * 添加類目 */ @Override public int addCategory(Category category) { int number = categoryDao.add(category); return number; } /** * 修改類目 */ @Override public int editCategory(Category category) { int number = categoryDao.update(category); return number; } /** * 刪除類目 */ @Override public int delCategory(Integer id) { int number = categoryDao.delById(id); return number; } }
-
-
類目的dao的接口
-
CategoryDao
package cn.javabs.store.dao; import cn.javabs.store.entity.Category; import java.util.List; public interface CategoryDao { /** * 查詢所有類目 */ List<Category> findAll(); /** * 指定查詢 */ Category findById(Integer id); /** * 添加類目 */ int add(Category category); /** * 修改類目 */ int update(Category category); /** * 刪除類目 */ int delById(Integer id); }
-
-
類目的dao的接口的實現類DaoImpl
-
CategoryDaoImpl
package cn.javabs.store.dao.impl; import cn.javabs.store.dao.CategoryDao; import cn.javabs.store.entity.Category; import cn.javabs.store.util.DruidUtil; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List; public class CategoryDaoImpl implements CategoryDao { /** * 準備QueryRunner * 因爲QueryRunner的有參數構造方法需要一個參數的 參數爲DataSource類型的ds * 而DruidUtil.getDs() 方法是一個 返回 */ QueryRunner qr = new QueryRunner(DruidUtil.getDataSource()); /** * 查詢所有類目 */ @Override public List<Category> findAll() { try { List<Category> list = qr.query("select cid,cname from category",new BeanListHandler<Category>(Category.class)); return list; } catch (SQLException e) { throw new RuntimeException(e); } } /** * 指定查詢類目 */ @Override public Category findById(Integer id) { try { Category category = qr.query("select cid,cname from category where cid=?", new BeanHandler<Category>(Category.class)); return category; } catch (SQLException e) { throw new RuntimeException(e); } } /** * 添加類目 */ @Override public int add(Category category) { try { int num = qr.update("insert into category(cid,cname) values(?,?)", null,category.getCname()); return num; } catch (SQLException e) { throw new RuntimeException(e); } } /** * 修改類目 */ @Override public int update(Category category) { try { int num = qr.update("update category set cname=? where cid=?", category.getCname(), category.getCid()); return num; } catch (SQLException e) { throw new RuntimeException(e); } } /** * 刪除類目 */ @Override public int delById(Integer id) { try { int num = qr.update("delete from category where cid=?",id); return num; } catch (SQLException e) { throw new RuntimeException(e); } } }
-
-
工具類的創建 DruidUtil
-
DruidUtil
package cn.javabs.store.util; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; /** * 工具類 */ public class DruidUtil { // 1.定義全局變量ds 類型是 DataSource(數據源) private static DataSource dataSource; // 2.定義靜態代碼塊 static { try { // 2.1 通過反射讀取 db.properties文件 返回一個io對象 InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("db.properties"); // 2.2 找properties類去讀取(加載)io流 // 2.2.1 創建properties對象 Properties properties = new Properties(); // 2.2.2 讀取 properties.load(is); // 2.3 通過核心類[德魯伊數據源工廠]去創建數據源 會返回一個DataSource類型 --會有一場需要try DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { throw new RuntimeException(e); } } // 3.定義靜態方法:獲取數據源 返回值類爲 DataSource public static DataSource getDataSource(){ //3.1 返回ds return dataSource; } // 4.定義靜態方法:獲取連接方法 返回值類爲 Connection public static Connection getConnection() throws SQLException { //4.1 返回調用獲取連接 -- 會有異常 return dataSource.getConnection(); } }
-
-
數據庫表結構搭建
-
# 創建數據庫 create database store; # 選擇哪1個數據庫來進行操作 use store; create table category( cid int primary key auto_increment, cname varchar(50) not null unique # not null 不許爲空、| unique 唯一的約束 ); # 插入語句 insert into category(cid,cname) values (1,'手機'); insert into category(cid,cname) values (2,'手機殼'); insert into category(cid,cname) values (3,'充電器');
-
-
單元測試
-
package cn.javabs.store.test; import cn.javabs.store.entity.Category; import cn.javabs.store.service.CategoryService; import cn.javabs.store.service.impl.CategoryServiceImpl; import org.junit.Test; import java.util.List; public class TestCategory { //創建對象CategoryService CategoryService categoryService = new CategoryServiceImpl(); /** * 查詢所有類目 */ @Test public void testFindAllCategories(){ List<Category> list = categoryService.findAllCategries(); System.out.println("從數據庫中查詢到的分類和類目有:"+list); } /** * 根據id進行指定查詢 */ @Test public void testFindById(){ Category category = categoryService.findCategoryById(2); System.out.println(category); } /** * 添加分類 */ @Test public void testAddCategory(){ Category category = new Category(null,"耳機"); // 這是用 有參數的構 造方法 int number = categoryService.addCategory(category); System.out.println("數據庫插入了"+number+"條語句"); } /** * 修改分類 */ @Test public void testEditCategory(){ Category category = new Category(2,"手機保護殼"); int number = categoryService.editCategory(category); System.out.println("數據庫修改了"+number+"條語句"); } /** * 刪除分類 */ @Test public void testDelCategoryById(){ int number = categoryService.delCategory(4); System.out.println("數據庫刪除了"+number+"條語句"); } }
-