前言:如今本身的學習彷佛遇到了瓶頸,感受學習了 SSM 以後有一些迷茫,不知道接下來該往哪裏去努力了,我以爲這是個很很差的狀態,爲了度過這段時期,我準備把天貓模仿下來(給本身找點事作)以後開始去鞏固 Java 的基礎知識,也準備好暑假去找實習。前端
首先要肯定要實現哪些功能,須要對需求進行完整的分析,才能在編寫項目的時候有條不紊,咱們的目的很明確:就是模仿天貓前端 + 本身實現後端。而且盡最大努力去下降這個項目的複雜度(畢竟高深的東西不懂)。java
規定:全天貓沒有店鋪,就只有惟一一家叫作 Tmall 的商家,賣全部的東西。mysql
- 1.數據的顯示:
首頁數據顯示分析:git
首先是搜索欄下方的九個商品,須要從數據庫中取出銷量最高的幾個產品,關於標紅的關鍵字,是要知足必定條件的,好比:這一個星期內銷量超過多少...github
接着是分類導航欄,首先是商品分類右邊固定的兩個連接【天貓超市】和【天貓國際】,還有緊跟着的八個超鏈,這個能夠設計爲一個單表,存儲它顯示的文字和連接過去的地址,而後是具體的 16 個分類以及輪播:web
下面的具體產品展現比較複雜,咱們能夠本身作一下簡化,好比就展現幾個產品比較多的固定的幾個分類就行了,其餘的就直接捨棄:spring
- 2.登陸/註冊頁
須要有一個登陸/註冊頁,可以完成用戶的登陸和註冊功能,並能提供基礎的例如判斷空值等功能。sql
- 3.產品搜索頁
左上角的圖標咱們能夠統一簡化成 Tmall 的圖片,商品圖片,咱們能夠整個大分類使用一張圖,主要就是實現排序功能還有搜索功能數據庫
- 4.產品展現頁
天貓原生的產品展現頁有些複雜,咱們能夠本身簡化一下,就不要選這麼多東西,都是一口價,apache
另外下方規格參數和評價都不能省略:
- 5.購物車/購買頁面
根據對於前端的分析,數據庫有了一些眉目,爲了簡化項目的難度,因此咱們須要本身想點辦法,先來構思一下大概須要一些什麼樣的表:
我大概就想出來須要用到這些表,咱們一個一個來建立它們:
首先咱們須要一個表來存儲咱們的分類信息,也就是【女裝/內衣】、【男裝/運動戶外】在內的 16 個分類,爲了高度一致,這 16 個分類不能多也不能少。
爲了簡化任務,能夠觀察出,【熱門手機】、【特點手機】分欄下的東西都是【手機/數碼/電腦辦公】類別裏的東西,因此咱們直接砍掉,右邊的一些圖片超鏈也給直接砍掉,咱們規定每一行顯示的產品數目就能夠了,這樣就簡單多了。
CREATE TABLE category ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '分類的名字', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
即在【天貓國際】右邊的 8 個超鏈,咱們單獨新建一個表來存儲超鏈顯示的文字和連接的地址,這樣就能夠任意的修改其內容:
百度翻譯【推薦連接】翻譯爲【Referral links】,那咱們也這麼給咱們的表命名好了:
CREATE TABLE referal_link ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', text varchar(255) NOT NULL COMMENT '超鏈顯示的文字', link varchar(255) NOT NULL COMMENT '超鏈的地址', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
每一個分類下都要必定的產品,這些產品還有本身的一些屬性,因此另外須要屬性表,這個表另外建立,咱們先來觀察一下一個產品表須要一些什麼東西:
CREATE TABLE product ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '產品的名稱', sub_title varchar(255) DEFAULT NULL COMMENT '小標題', price float DEFAULT NULL COMMENT '價格', sale int(11) DEFAULT NULL COMMENT '銷量', stock int(11) DEFAULT NULL COMMENT '庫存', category_id int(11) DEFAULT NULL COMMENT '對應的分類id', PRIMARY KEY (id), CONSTRAINT fk_product_category FOREIGN KEY (category_id) REFERENCES category (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
去掉詳細的規格參數劃分,其實屬性也就是一個名字而已(簡化簡化簡化)。
CREATE TABLE property ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) DEFAULT NULL COMMENT '屬性名稱', product_id int(11) NOT NULL COMMENT '對應的產品id', PRIMARY KEY (id), CONSTRAINT fk_property_product FOREIGN KEY (product_id) REFERENCES product(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 忽然想到的問題:
每個產品的屬性實際上是不少的,若是每個產品都對應不少屬性的話,對於天貓這樣的數據量來講,應該會讓數據庫爆炸的吧...- 改進方法:
將屬性表關聯到 category 表上,由於其實每個分類下的產品的屬性差很少!
根據以上問題,修改一下數據庫表之間的關係
並將屬性表的外鍵修改成 category 的主鍵:
CREATE TABLE property ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) DEFAULT NULL COMMENT '屬性名稱', category_id int(11) NOT NULL COMMENT '對應的分類id', PRIMARY KEY (id), CONSTRAINT fk_property_category FOREIGN KEY (category_id) REFERENCES category(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中就是保存了對應屬性的值,而且應該有兩個外鍵,一個指向 Property 表,而另外一個則指向 Product 表
CREATE TABLE property_value ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) NOT NULL COMMENT '對應產品id', properti_id int(11) NOT NULL COMMENT '對應屬性id', value varchar(255) DEFAULT NULL COMMENT '具體的屬性值', PRIMARY KEY (id), CONSTRAINT fk_property_value_property FOREIGN KEY (properti_id) REFERENCES property (id), CONSTRAINT fk_property_value_product FOREIGN KEY (product_id) REFERENCES product (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
這個表名義上是保存了產品的圖片,其實只是保存了產品圖片的位置即圖片名稱,咱們能夠規定全部的產品圖片都放在一個統一的文件夾下面,而後經過 id 來獲取對應名稱的圖片:
CREATE TABLE product_image ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) DEFAULT NULL COMMENT '對應的產品id', PRIMARY KEY (id), CONSTRAINT fk_product_image_product FOREIGN KEY (product_id) REFERENCES product (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用戶表很簡單,也沒有權限之類的東西:
CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '用戶名稱', password varchar(255) NOT NULL COMMENT '用戶密碼', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
評價表對應了用戶和產品兩個表,也比較簡單,咱們爲了簡單,把上面紅色的部分所有砍掉,由於沒有商家,因此也不須要回複用戶的評價,都砍掉砍掉!
CREATE TABLE review ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', content varchar(4000) DEFAULT NULL COMMENT '評價內容', user_id int(11) NOT NULL COMMENT '對應的用戶id', product_id int(11) NOT NULL COMMENT '對應的產品id', createDate datetime DEFAULT NULL COMMENT '評價時間', PRIMARY KEY (id), CONSTRAINT fk_review_product FOREIGN KEY (product_id) REFERENCES product (id), CONSTRAINT fk_review_user FOREIGN KEY (user_id) REFERENCES user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
因爲 Order 是 MySql 的一個關鍵字,因此咱們在訂單表的最後添加一個下劃線:
CREATE TABLE order_ ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', order_code varchar(255) NOT NULL COMMENT '訂單號', address varchar(255) NOT NULL COMMENT '收貨地址', post varchar(255) NOT NULL COMMENT '郵編', receiver varchar(255) NOT NULL COMMENT '收貨人姓名', mobile varchar(255) NOT NULL COMMENT '手機號碼', user_message varchar(255) NOT NULL COMMENT '用戶備註的信息', create_date datetime NOT NULL COMMENT '訂單建立時間', pay_date datetime DEFAULT NULL COMMENT '訂單支付時間', delivery_date datetime DEFAULT NULL COMMENT '發貨日期', confirm_date datetime DEFAULT NULL COMMENT '確認收貨日期', user_id int(11) DEFAULT NULL COMMENT '對應的用戶id', status varchar(255) NOT NULL COMMENT '訂單狀態', PRIMARY KEY (id), CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一個訂單裏面可能有多個訂單項,一個產品也可能對應多個訂單項,因此這個表應該有兩個外鍵:
CREATE TABLE order_item ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) NOT NULL COMMENT '對應產品id', order_id int(11) NOT NULL COMMENT '對應訂單id', number int(11) DEFAULT NULL COMMENT '對應產品購買的數量', PRIMARY KEY (id) COMMENT '郵編', CONSTRAINT fk_order_item_product FOREIGN KEY (product_id) REFERENCES product (id), CONSTRAINT fk_order_item_order FOREIGN KEY (order_id) REFERENCES order_ (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
咱們在建立表以前,應該建立一個新的數據庫,並命名爲【tmall_ssm】
DROP DATABASE IF EXISTS tmall_ssm; CREATE DATABASE tmall_ssm DEFAULT CHARACTER SET utf8;
將這十個表匯個總就是:
DROP DATABASE IF EXISTS tmall_ssm; CREATE DATABASE tmall_ssm DEFAULT CHARACTER SET utf8; use tmall_ssm; CREATE TABLE category ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '分類的名字', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE referal_link ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', text varchar(255) NOT NULL COMMENT '超鏈顯示的文字', link varchar(255) NOT NULL COMMENT '超鏈的地址', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE product ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '產品的名稱', sub_title varchar(255) DEFAULT NULL COMMENT '小標題', price float DEFAULT NULL COMMENT '價格', sale int(11) DEFAULT NULL COMMENT '銷量', stock int(11) DEFAULT NULL COMMENT '庫存', category_id int(11) DEFAULT NULL COMMENT '對應的分類id', PRIMARY KEY (id), CONSTRAINT fk_product_category FOREIGN KEY (category_id) REFERENCES category (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE property ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) DEFAULT NULL COMMENT '屬性名稱', category_id int(11) NOT NULL COMMENT '對應的分類id', PRIMARY KEY (id), CONSTRAINT fk_property_category FOREIGN KEY (category_id) REFERENCES category(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE property_value ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) NOT NULL COMMENT '對應產品id', properti_id int(11) NOT NULL COMMENT '對應屬性id', value varchar(255) DEFAULT NULL COMMENT '具體的屬性值', PRIMARY KEY (id), CONSTRAINT fk_property_value_property FOREIGN KEY (properti_id) REFERENCES property (id), CONSTRAINT fk_property_value_product FOREIGN KEY (product_id) REFERENCES product (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE product_image ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) DEFAULT NULL COMMENT '對應的產品id', PRIMARY KEY (id), CONSTRAINT fk_product_image_product FOREIGN KEY (product_id) REFERENCES product (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', name varchar(255) NOT NULL COMMENT '用戶名稱', password varchar(255) NOT NULL COMMENT '用戶密碼', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE review ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', content varchar(4000) DEFAULT NULL COMMENT '評價內容', user_id int(11) NOT NULL COMMENT '對應的用戶id', product_id int(11) NOT NULL COMMENT '對應的產品id', createDate datetime DEFAULT NULL COMMENT '評價時間', PRIMARY KEY (id), CONSTRAINT fk_review_product FOREIGN KEY (product_id) REFERENCES product (id), CONSTRAINT fk_review_user FOREIGN KEY (user_id) REFERENCES user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE order_ ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', order_code varchar(255) NOT NULL COMMENT '訂單號', address varchar(255) NOT NULL COMMENT '收貨地址', post varchar(255) NOT NULL COMMENT '郵編', receiver varchar(255) NOT NULL COMMENT '收貨人姓名', mobile varchar(255) NOT NULL COMMENT '手機號碼', user_message varchar(255) NOT NULL COMMENT '用戶備註的信息', create_date datetime NOT NULL COMMENT '訂單建立時間', pay_date datetime DEFAULT NULL COMMENT '訂單支付時間', delivery_date datetime DEFAULT NULL COMMENT '發貨日期', confirm_date datetime DEFAULT NULL COMMENT '確認收貨日期', user_id int(11) DEFAULT NULL COMMENT '對應的用戶id', status varchar(255) NOT NULL COMMENT '訂單狀態', PRIMARY KEY (id), CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES user (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE order_item ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '惟一索引id', product_id int(11) NOT NULL COMMENT '對應產品id', order_id int(11) NOT NULL COMMENT '對應訂單id', number int(11) DEFAULT NULL COMMENT '對應產品購買的數量', PRIMARY KEY (id) COMMENT '郵編', CONSTRAINT fk_order_item_product FOREIGN KEY (product_id) REFERENCES product (id), CONSTRAINT fk_order_item_order FOREIGN KEY (order_id) REFERENCES order_ (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
直接複製進 MySql 中執行,就能看到咱們建立好的十個數據庫:
根據以前我寫過的博文:IDEA 整合 SSM 搭建好 SSM 開發環境,這裏給出完整的項目結構和 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <name>wmyskxz</name> <groupId>cn.wmyskxz</groupId> <artifactId>wmyskxz</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version} </webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build> <properties> <!-- 設置項目編碼編碼 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- spring版本號 --> <spring.version>4.3.5.RELEASE</spring.version> <!-- mybatis版本號 --> <mybatis.version>3.4.1</mybatis.version> </properties> <dependencies> <!-- pageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2-beta</version> </dependency> <!--jsqlparser--> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>1.0</version> </dependency> <!-- jstl標籤 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <!-- java ee --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- 實現slf4j接口並整合 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.2</version> </dependency> <!-- JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.7</version> </dependency> <!-- 數據庫 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> <scope>runtime</scope> </dependency> <!-- 數據庫鏈接池 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis/spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </project>
按照正常的流程,咱們應該去建立數據庫對應的 POJO 和 DAO 類還有對應的 mapper 映射文件,按照上面的分析咱們一共有十張表,想象一下爲這十張表作這些無技術含量的機械化的繁雜的工做是多麼頭疼的一件事,咱們但願的是:有人幫我自動建立好這些!
咱們使用逆向工程,須要先導入 Mybatis Generator 的官方包,因爲咱們使用的是 Maven 搭建的 SSM 項目,全部咱們能夠去 Maven 的官網去查詢須要的相關包:http://mvnrepository.com/
戳進去點擊最新的包:
就能夠在下方找到 Maven 依賴添加的語句:
直接粘進 pom.xml 就能夠了,這裏就不演示了。
在【resources】下建立 generatorConfig.xml 配置文件,該配置文件說明了一些逆向工程的細節:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 是否去除自動生成的代碼中的註釋 true:是 false:否--> <commentGenerator> <property name="suppressDate" value="true"/> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 數據庫鏈接信息:驅動類、鏈接地址、用戶名、密碼 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/tmall_ssm" userId="root" password="root"> </jdbcConnection> <!-- 默認 false,把 JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer 爲 true 時解析爲 java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- targetProject:生成 POJO 類的位置 --> <javaModelGenerator targetPackage="cn.wmyskxz.pojo" targetProject="src/main/java"> <!-- enableSubPackages:是否讓 schema 做爲包的後綴--> <property name="enableSubPackages" value="false"/> <!-- trimStrings:從數據庫返回的值被清理先後的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- targetProject:生成xml映射文件存放位置 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <!-- enableSubPackages:是否讓 schema 做爲包的後綴--> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- targetProject:生成mapper類存放位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.wmyskxz.mapper" targetProject="src/main/java"> <!-- enableSubPackages:是否讓 schema 做爲包的後綴--> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!--生成對應表及類名 tableName:要生成的表名 domainObjectName:生成後的實例名 enableCountByExample:Count語句中加入where條件查詢,默認爲true開啓 enableUpdateByExample:Update語句中加入where條件查詢,默認爲true開啓 enableDeleteByExample:Delete語句中加入where條件查詢,默認爲true開啓 enableSelectByExample:Select多條語句中加入where條件查詢,默認爲true開啓 selectByExampleQueryId:Select單個對象語句中加入where條件查詢,默認爲true開啓 --> <table tableName="category" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <!-- 使用數據庫中實際的字段名做爲生成的實體類的屬性 --> <property name="useActualColumnNames" value="true"/> <!-- 使用自增加鍵 --> <property name="my.isgen.usekeys" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="property" domainObjectName="Property" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="useActualColumnNames" value="true"/> <property name="my.isgen.usekeys" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="product" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="product_image" domainObjectName="ProductImage" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="order_" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="property_value" domainObjectName="PropertyValue" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="review" domainObjectName="Review" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="order_item" domainObjectName="OrderItem" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> <table tableName="referal_link" domainObjectName="ReferalLink" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="my.isgen.usekeys" value="true"/> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="JDBC"/> </table> </context> </generatorConfiguration>
這樣配置文件也就編寫好了
在編寫完配置文件只有,就須要加載該配置文件,利用逆向工程的機制來對數據庫的各個表進行一系列文件的生成,咱們在【test/java】包下建立【TestMyBatisGenerator】類:
import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.api.ShellCallback; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.util.ArrayList; import java.util.List; /** * 逆向工程測試類 * * @author: @我沒有三顆心臟 * @create: 2018-04-27-上午 8:26 */ public class TestMybatisGenerator { public static void main(String[] args) throws Exception { // warnings 爲用於放置生成過程當中警告信息的集合對象 List<String> warnings = new ArrayList<String>(); // 指定是否覆蓋重名文件 boolean overwrite = true; // 加載配置文件 File configFile = new File(MyBatisGenerator.class.getClassLoader().getResource("generatorConfig.xml").toURI()); // 配置解析類 ConfigurationParser cp = new ConfigurationParser(warnings); // 配置解析類解析配置文件並生成 Configuration 配置對象 Configuration config = cp.parseConfiguration(configFile); // ShellCallback 負責如何處理重複文件 ShellCallback callback = new DefaultShellCallback(overwrite); // 逆向工程對象 MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); // 執行逆向文件生成操做 myBatisGenerator.generate(null); // 打印提示信息 System.out.println("MyBatis 逆向工程執行成功,刷新項目查看文件!"); } }
執行該測試類,就能看見自動生成的文件:
以 Category 爲例,咱們來看一下自動生成的文件:
- Category 實體類:
package cn.wmyskxz.pojo; public class Category { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } }
- CategoryMapper 映射類:
package cn.wmyskxz.mapper; import cn.wmyskxz.pojo.Category; import cn.wmyskxz.pojo.CategoryExample; import java.util.List; public interface CategoryMapper { int deleteByPrimaryKey(Integer id); int insert(Category record); int insertSelective(Category record); List<Category> selectByExample(CategoryExample example); Category selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Category record); int updateByPrimaryKey(Category record); }
- CategoryMapper.xml 映射文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.wmyskxz.mapper.CategoryMapper"> <resultMap id="BaseResultMap" type="cn.wmyskxz.pojo.Category"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> </resultMap> <sql id="Example_Where_Clause"> <where> <foreach collection="oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List"> id, name </sql> <select id="selectByExample" parameterType="cn.wmyskxz.pojo.CategoryExample" resultMap="BaseResultMap"> select <if test="distinct"> distinct </if> 'false' as QUERYID, <include refid="Base_Column_List"/> from category <if test="_parameter != null"> <include refid="Example_Where_Clause"/> </if> <if test="orderByClause != null"> order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select <include refid="Base_Column_List"/> from category where id = #{id,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from category where id = #{id,jdbcType=INTEGER} </delete> <insert id="insert" keyColumn="id" keyProperty="id" parameterType="cn.wmyskxz.pojo.Category" useGeneratedKeys="true"> insert into category (name) values (#{name,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="cn.wmyskxz.pojo.Category" useGeneratedKeys="true"> insert into category <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null"> name, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="name != null"> #{name,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="cn.wmyskxz.pojo.Category"> update category <set> <if test="name != null"> name = #{name,jdbcType=VARCHAR}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="cn.wmyskxz.pojo.Category"> update category set name = #{name,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} </update> </mapper>
其中就只有映射文件稍微有些複雜,但細看下來其實跟咱們本身寫的差很少,甚至自動生成的完成得更好。
xxxExample
MybatisGenerator會生成一個類叫作XXXXExample的。,它的做用是進行排序,條件查詢的時候使用。
這裏有詳細的說明,瞭解一下就行了:戳這裏
咱們這裏僅僅就用 CategoryMapper 映射類來進行簡單測試了:
@Autowired CategoryMapper categoryMapper; @Test public void test() { Category category = new Category(); category.setName("分類1"); categoryMapper.insert(category); }
因爲咱們使用了自增加鍵 id ,因此僅僅只須要提供 name 屬性就能夠了,執行,能夠看到數據庫中有正確的數據:
根據以上的 「折騰」 算是完成了項目的起步工做了吧,我是一邊寫項目一邊寫博客的,因此可能有時候想着想着寫着寫着思緒會有點飄,寫得凌亂,這也是沒有辦法的事,無論寫得好仍是差我都但願能記錄下來,這些都是屬於我本身的思路和學習路程。
歡迎轉載,轉載請註明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz 歡迎關注公衆微信號:wmyskxz_javaweb 分享本身的Java Web學習之路以及各類Java學習資料