【JavaEE】电商秒杀项目·第2章·基础项目搭建

前言

我想整一个Android借助本地MySQL进行登录注册的功能,
奈何搜遍全网,都没看见多好的资源。
好在我是龙虾三少的关门弟子୧(๑•̀◡•́๑)૭
(哇,好厉害啊,关门弟子哎!(o)/~)
没错,我每次听他课都会把宿舍门关上O(∩_∩)O
(……-_-||……)
我又看了一遍龙虾三少的《Java电商秒杀系统》
现记录一下,原因是视频时间有点长,保存成文字+截图或许会节省一点时间,防止再次大量重复劳动。

第2章·基础项目搭建的基本流程:
构建Maven项目—>引入SpringBoot依赖—>接入Mybatis

正文

构建Maven项目:

打开IDEA,new一个新坑
new project
1、选择maven-archetype-quickstart 这种方式创建出来的是以一种jar包的方式提供对外统一的输出
maven quick start
2、点完next之后,会让填写GAV
gav
具体填写什么,可以参考阿里的开发手册
alibaba gav
3、接下来一个界面,是找本地安装的Maven,如果以前用IDEA搭建过Maven,直接点next,没有搭建过的,选择一下本地安装Maven路径即可
next

4、最后,给项目起个名字,然后指定保存路径,就可以finish了
finish
finish之后,稍等片刻,就会看到控制台提示Maven搭建完成
console
5、手动标记,Mark Directory as Sources/Test Root
现在我们可以看看左侧project,Maven都帮我们自动创建了哪些东西
可以看到浅蓝色是代表source目录,绿色代表test目录
color
如果不是对应的颜色,需要手动Mark一下。如何手动mark,看下一步示范
6、手动new Directory:resources ,Mark Directory as Resources Root
现在还缺少一个resource目录。
我们可以右键main,new,Directory,新建一个目录,起名为resources
resources
然后右键resources,Mark Directory as ,Resources Root
root
IDEA就是这样构建的,如果你不Mark对,那么它就找source、test、resources的时候就找不到,所以必须Mark Directory as 对应的类别
mark完之后,整体目录结构长下面这个样子,这就是一个Maven工程具体的样子了。
maven
7、run App ,测试能否出现 Hello World
run
可以看到控制台输出Hello World,就代表这个Maven框架搭建成功了
hello

构建Maven框架总结

想当年Maven是服务于美国军方的,虽然不知道那个Maven和咱们现在这个Maven到底是不是同一个东西,但不管怎么说,一个听上去很高大上的框架,搭建起来并不费劲,只需要七步。




引入SpringBoot依赖:

哈哈,龙虾哥特意强调了一下,想要集成一个项目,首先要做的不是去百度怎么用,而应该去看它的官方文档!(道理就是:百度到的东西实在是良莠不齐,有那甄选的时间,不如一步到位,直接去正确的地方找找看)
1、上SpringBoot官网
当然,并不是一点也不用百度,找SpringBoot的官网就需要百度一下,我们百度要的链接是:
springboot官网
进去点击Guides下面的一个连接:搭建一个RESTful的web服务器
guides
2、pom.xml文件中指定并引入spring-boot-starter-web的<dependency>
需要引入下面两个

<!-- 1、引入的第一个:导入springmvc、spring-aop之类的jar包 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>

<!-- 2、引入的第二个:导入一些web相关的jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

其中 是全局目录project的子目录
是全局目录project的子目录的子目录

引入这俩之后,官网就可以关了,想看的也可以耐下性子细看看官网教程都讲了啥。

3、Reimport All Maven Projects ,下载需要的jar包

按说,第一次修改Maven的pom.xml的时候IDEA会弹出一个小框框
dialog
选择Enable Auto Import,之后在pom.xml中每次引入一下,Maven都会自动进行下载并配置。
如果你那里没有弹出Enable Auto import也没有配置IDEA的Maven为自动引入的话,也可以手动点IDEA右侧边栏的Maven
maven
可以直接点Reimport按钮,也可以先右键,再进行Reimport
reimport
如果想知道每次引入都import了哪些内容,可以再每次引入的时候,关注一下左侧目录树的External Libraries的变化
External Libraries
4、测试SpringBoot引入成功与否
App.java中添加@EnableAutoConfiguration注解
main方法中添加SpringApplication.run(App.class,args);
test
5、run App ,浏览器localhost:8080,测试Tomcat是否启动
run的时候,可以看到控制台不止输出了Hello World
spring
打开浏览器,地址栏里输入http://localhost:8080/
具体的端口号可以看SpringBoot的日志
8080如果出现下面页面就代表引入SpringBoot成功了
whitelable

引入SpringBoot总结

本来Spring就够高大上了,现在又来个SpringBoot,听上去更加高深莫测,其实如果不深究原理,单纯的引入一下,并不难,5步就够了。




SpringMVC+RESTful的使用

我们搭建后台服务的整体框架是SpringMVC,设计风格是RESTful,下面就来学学SpringMVC,RESTful

1、@RestController注解与@RequestMapping注解
@RestController,作用于类上,用于声明这是一个Controller,也就是MVC中的C层
@RequestMapping("/home"),作用于类内具体方法上,对相应的URL请求进行映射
现在我们的App.java长下面这个样子
app
2、重新run App,浏览器localhost:8080/home,测试SpringMVC效果
restful

SpringMVC+RESTful的使用总结

SpringBoot是Spring家族的一个集合,集成了Spring,SpringMVC等等,而Spring家族框架的特色就是使用注解开发。

RESTful就是一种访问资源的风格,也就是浏览器地址栏输入的风格,目前我知道的风格有三种
1. 原始风格:http://localhost:8080/home.html或者http://localhost:8080/home.jsp ,带后缀名
2. RPC风格(Doubble):http://localhost:8080/print.home ,带方法调用
3. RESTful风格(SpringMVC):http://localhost:8080/home ,啥都不带,最多会有?parm=value加个参数之类的
这就是我对RESTful的浅显理解。




接入Mybatis

1、新建application.properties配置文件
一开始的时候,我们创建并mark了resources目录,现在在其中new 一个file,起名为application.properties
创建好之后,在IDEA中就会自动显示一个绿叶+按钮的小图标,表示这是SpringBoot的配置文件
greenicon
我们可以写一行server.port = 8090,然后重新运行server
可以发现控制台输出有了变化
console
当然,对应浏览器地址栏也要进行修改
8090
2、pom.xml中引入mysql-connector-java、druid(德鲁伊)、mybatis-spring-boot-starter
前面我们在<dependencies>中已经引入过SpringBoot的starter-web的相关jar包了,这次一下引入三个

<!--3、引入的第三个:java连接mysql的connector的jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!--4、引入的第四个:阿里的德鲁伊连接池,管理mysql连接的jar包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<!--5、引入的第五个:Mybatis相关的jar包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>

还是,如果你想看到每个引入后的具体变化,可以一个一个的引入,同时观察左侧的External Libraries
全部引入完后,External Libraries已经今非昔比了
external
3、引入mybatis相关插件mybatis-generator
mybatis和hibernate一样,都是持久层框架,目的就是代替人工来自动映射生成数据库对象
上面引入的都是一些和mysql相关的,下面需要引入一个真正和mybatis相关的generator插件
代码有点多:

	<!-- 6、第六个引入的:mybatis的相关插件 -->
        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.5</version>
          <!-- 注意这里plugin下的dependencies,Maven是无法识别的 -->
          <!-- 比较骚的操作就是,先把下面的dependency放到外面project下面的dependencies -->
          <!-- 然后去右侧工具条Maven执行Reimport,最后再把这些dependency放回来,再进行Reimport,来导入mybatis的插件 -->
          <dependencies>
            <!-- 7、 第七个引入的:mybatis生成器的core相关jar包  -->
            <dependency>
              <groupId>org.mybatis.generator</groupId>
              <artifactId>mybatis-generator-core</artifactId>
              <version>1.3.5</version>
            </dependency>
            <!-- 8、 在mybatis的插件里再引入一遍mysql的连接jar包 -->
            <!-- 上面曾经引入过,是服务端java代码与mysql连接 -->
            <!-- 这里再次声明,是mybatis插件和mysql连接 -->
            <!-- 虽说老师这么写了, 但我个人觉得没必要重复引入jar包啊 -->
            <!-- 老师给出的解释是:要生成的mybatis插件,需要借助相关的依赖 -->
            <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.41</version>
            </dependency>
          </dependencies>
          <!-- executions : 执行-->
          <!-- 9、配置mybatis generator 插件的执行阶段phase以及执行目的goal -->
          <executions>
              <execution>
                  <id>mybatis generator</id>
                  <phase>package</phase>
                  <goals>
                      <goal>generate</goal>
                  </goals>
              </execution>
          </executions>
          <!-- 10、mybatis generator 插件的相关属性配置 -->
          <configuration>
              <!-- verbose : 冗余的 , 允许移动生成的文件 -->
              <verbose>true</verbose>
              <!-- 新生成的覆盖旧生成的,实际工作中慎用 -->
              <overwrite>true</overwrite>
              <!-- 指定mybatis配置文件的路径 -->
              <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
          </configuration>
        </plugin>

4、为该项目指定mybatis的映射路径已经文件后缀名
在application.properties文件中添加一行配置:
mybatis.mapper-locations=classpath:mapping/*.xml
既然这样指定了,对应我们就该在resources目录下新建一个目录名为mapping

5、设计并创建数据库
我给数据库起名为login_db,这个数据库比较简单,只有两张表user_info 和 user_password
database

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50724
Source Host           : localhost:3306
Source Database       : login_db

Target Server Type    : MYSQL
Target Server Version : 50724
File Encoding         : 65001

Date: 2019-05-31 14:31:32
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user_info`
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户姓名',
  `gender` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1代表男性,2代表女性',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '用户年龄',
  `telphone` varchar(255) NOT NULL DEFAULT '' COMMENT '用户登录的手机号码,用于接收短信',
  `register_mode` varchar(255) NOT NULL DEFAULT '' COMMENT '注册方式:byphone,bywechat,byalipay,byqq',
  `third_part_id` varchar(64) NOT NULL DEFAULT '' COMMENT '第三方登录的id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_info
-- ----------------------------

-- ----------------------------
-- Table structure for `user_password`
-- ----------------------------
DROP TABLE IF EXISTS `user_password`;
CREATE TABLE `user_password` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '密码表的冗余字段,有利于查询索引',
  `encrypt` varchar(255) NOT NULL DEFAULT '' COMMENT '用户密码加密后的MD5值',
  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '外键,连接user_info',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_password
-- ----------------------------

6、创建并修改mybatis-generator.xml文件
有了数据库之后,就该将数据库表映射为对象了,需要下面两步:
1、创建
mybatis官网给出的mybatis-generator.xml文件模板
我们复制一份,在resources目录下新建一个mybatis-generator.xml进行粘贴
有可能出现下面这样一串红字,是因为我们本地没有这个dtd文件,电脑联网的情况下,点击左侧小灯泡
选择Fetch external resource ,IDEA就会自动进行下载
fetch
2、修改
为了保证文件的完整性,我没有删掉注释,因此看上去有点多,但是如果把没用的注释都删掉,其实仅仅34行代码。

<?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>
    <!--<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!--<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"-->
                        <!--connectionURL="jdbc:db2:TEST"-->
                        <!--userId="db2admin"-->
                        <!--password="db2admin">-->
        <!--</jdbcConnection>-->

        <!-- 数据库链接地址及连接用户密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/login_db"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!--<javaTypeResolver >-->
            <!--<property name="forceBigDecimals" value="false" />-->
        <!--</javaTypeResolver>-->

        <!-- 生成dataobject类存放位置 -->
        <!-- 意思就是每个数据库表映射的entity java类的位置 -->
        <!-- 老外真有意思,先说包名targetPackage,然后再说相对路径targetProject -->
        <javaModelGenerator targetPackage="edu.heuet.android.logindemo.dataobject" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成数据库映射文件存放位置 -->
        <!-- 意思就是mybatis到底是按照什么逻辑进行mysql数据库表与java对象之间映射-->
        <sqlMapGenerator targetPackage="mapping"  targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成DAO类存放位置 -->
        <!-- DAO类里持有dataobject的引用,可以进行相应model的操作 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="edu.heuet.android.logindemo.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >-->
            <!--<property name="useActualColumnNames" value="true"/>-->
            <!--<generatedKey column="ID" sqlStatement="DB2" identity="true" />-->
            <!--<columnOverride column="DATE_FIELD" property="startDate" />-->
            <!--<ignoreColumn column="FRED" />-->
            <!--<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />-->
        <!--</table>-->
        
        <!-- 生成mysql对应表的DAO文件,并指定特殊的生成方式,去掉自动生成的复杂查询语句 -->
        <!-- 更好的 方式是手写发杂查询 -->
        <table tableName="user_info" domainObjectName="UserDO"
                    enableCountByExample="false"
                    enableUpdateByExample="false"
                    enableDeleteByExample="false"
                    enableSelectByExample="false"
                    selectByExampleQueryId="false"/>

        <table tableName="user_password" domainObjectName="UserPasswordDO"
		          enableCountByExample="false"
                     enableUpdateByExample="false"
                     enableDeleteByExample="false"
                     enableSelectByExample="false"
                    selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

可以看一下我们现在目录的结构,其中dao、dataobject、mapping都是在写上面文件的过程中手动创建的。
mapping
7、运行Mybatis插件,自动生成相关文件
配置运行mybatis插件
edit
点+号,新建一个Maven项目的运行命令
+

填写Maven待执行的命令 mybatis-generator:generate
maven
然后,执行
run
执行结束,可以看到控制台对应输出
save
现在目录结构如下,可以看到mybatis帮我们生成了8个文件,并且都放到了指定的目录
directory

其中有两个带Example的文件是没用的,可以直接删除。
最终目录结构如下

end
至此,数据库表就映射成了Java类、并且自动生成了DAO类和mapping文件

8、application.properties中配置SpringBoot项目数据源
配置完成后文件全部内容为

# 该项目的 Tomcat 启动端口号
server.port=8090

# 为该项目指定mybaits映射文件
mybatis.mapper-locations=classpath:mapping/*.xml

# 为该项目指定数据源
spring.datasource.name=login_db
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/login_db
spring.datasource.username=root
spring.datasource.password=123456

# 使用druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

9、编写代码,运行测试
App.java中注释掉@EnableAutoConfiguration注解,加入@SpringBootApplication(scanBasePackages={"…"})注解,老师说这两个注解有异曲同工之妙,具体怎么异曲同工我也没理解。加入@MapperScan("…")和@Autowired 注解,这两个注解是搭配着使用的,SpringBoot会自动扫描包进行自动装配Autowired
源代码中有一处红线,是因为IDEA执行Autowired编译检查导致的,不影响运行
run
启动之前,一定一定一定要看清绿色三角按钮旁边是不是App
run
比如我就是启动的这个,导致启动失败。另外,如果在公司一不小心执行了这个,有可能带来灾难性后果。比如覆盖掉原来的表结构,查询语句等等
true run
启动,浏览器localhost:8090/home ,测试
not exist
因为我们手动执行了

UserDOuserDO=userDOMapper.selectByPrimaryKey(1);

而现在我们的数据库还是空的,所以会显示用户信息不存在!
这证明了我们运行是没问题的。

接入mybatis总结

这一步比较繁琐,其实都可以写成一本书了。但是,这些都是见过一遍就能记住的活,
也不涉及多么多么难的技术,所以我一口气,把内容都写到一个文章里了。


版权声明:本文为midnight_time原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。