前言
我想整一个Android借助本地MySQL进行登录注册的功能,
奈何搜遍全网,都没看见多好的资源。
好在我是龙虾三少的关门弟子୧(๑•̀◡•́๑)૭
(哇,好厉害啊,关门弟子哎!(o)/~)
没错,我每次听他课都会把宿舍门关上O(∩_∩)O
(……-_-||……)
我又看了一遍龙虾三少的《Java电商秒杀系统》
现记录一下,原因是视频时间有点长,保存成文字+截图或许会节省一点时间,防止再次大量重复劳动。
第2章·基础项目搭建的基本流程:
构建Maven项目—>引入SpringBoot依赖—>接入Mybatis
正文
构建Maven项目:
打开IDEA,new一个新坑
1、选择maven-archetype-quickstart 这种方式创建出来的是以一种jar包的方式提供对外统一的输出
2、点完next之后,会让填写GAV
具体填写什么,可以参考阿里的开发手册
3、接下来一个界面,是找本地安装的Maven,如果以前用IDEA搭建过Maven,直接点next,没有搭建过的,选择一下本地安装Maven路径即可
4、最后,给项目起个名字,然后指定保存路径,就可以finish了
finish之后,稍等片刻,就会看到控制台提示Maven搭建完成
5、手动标记,Mark Directory as Sources/Test Root
现在我们可以看看左侧project,Maven都帮我们自动创建了哪些东西
可以看到浅蓝色是代表source目录,绿色代表test目录
如果不是对应的颜色,需要手动Mark一下。如何手动mark,看下一步示范
6、手动new Directory:resources ,Mark Directory as Resources Root
现在还缺少一个resource目录。
我们可以右键main,new,Directory,新建一个目录,起名为resources
然后右键resources,Mark Directory as ,Resources Root
IDEA就是这样构建的,如果你不Mark对,那么它就找source、test、resources的时候就找不到,所以必须Mark Directory as 对应的类别
mark完之后,整体目录结构长下面这个样子,这就是一个Maven工程具体的样子了。
7、run App ,测试能否出现 Hello World
可以看到控制台输出Hello World,就代表这个Maven框架搭建成功了
构建Maven框架总结
想当年Maven是服务于美国军方的,虽然不知道那个Maven和咱们现在这个Maven到底是不是同一个东西,但不管怎么说,一个听上去很高大上的框架,搭建起来并不费劲,只需要七步。
引入SpringBoot依赖:
哈哈,龙虾哥特意强调了一下,想要集成一个项目,首先要做的不是去百度怎么用,而应该去看它的官方文档!(道理就是:百度到的东西实在是良莠不齐,有那甄选的时间,不如一步到位,直接去正确的地方找找看)
1、上SpringBoot官网
当然,并不是一点也不用百度,找SpringBoot的官网就需要百度一下,我们百度要的链接是:
springboot官网
进去点击Guides下面的一个连接:搭建一个RESTful的web服务器
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会弹出一个小框框
选择Enable Auto Import,之后在pom.xml中每次引入一下,Maven都会自动进行下载并配置。
如果你那里没有弹出Enable Auto import也没有配置IDEA的Maven为自动引入的话,也可以手动点IDEA右侧边栏的Maven
可以直接点Reimport按钮,也可以先右键,再进行Reimport
如果想知道每次引入都import了哪些内容,可以再每次引入的时候,关注一下左侧目录树的External Libraries的变化
4、测试SpringBoot引入成功与否
App.java中添加@EnableAutoConfiguration注解
main方法中添加SpringApplication.run(App.class,args);
5、run App ,浏览器localhost:8080,测试Tomcat是否启动
run的时候,可以看到控制台不止输出了Hello World
打开浏览器,地址栏里输入http://localhost:8080/
具体的端口号可以看SpringBoot的日志如果出现下面页面就代表引入SpringBoot成功了
引入SpringBoot总结
本来Spring就够高大上了,现在又来个SpringBoot,听上去更加高深莫测,其实如果不深究原理,单纯的引入一下,并不难,5步就够了。
SpringMVC+RESTful的使用
我们搭建后台服务的整体框架是SpringMVC,设计风格是RESTful,下面就来学学SpringMVC,RESTful
1、@RestController注解与@RequestMapping注解
@RestController,作用于类上,用于声明这是一个Controller,也就是MVC中的C层
@RequestMapping("/home"),作用于类内具体方法上,对相应的URL请求进行映射
现在我们的App.java长下面这个样子
2、重新run App,浏览器localhost:8080/home,测试SpringMVC效果
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的配置文件
我们可以写一行server.port = 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已经今非昔比了
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
/*
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就会自动进行下载
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都是在写上面文件的过程中手动创建的。
7、运行Mybatis插件,自动生成相关文件
配置运行mybatis插件
点+号,新建一个Maven项目的运行命令
填写Maven待执行的命令 mybatis-generator:generate
然后,执行
执行结束,可以看到控制台对应输出
现在目录结构如下,可以看到mybatis帮我们生成了8个文件,并且都放到了指定的目录
其中有两个带Example的文件是没用的,可以直接删除。
最终目录结构如下
至此,数据库表就映射成了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编译检查导致的,不影响运行
启动之前,一定一定一定要看清绿色三角按钮旁边是不是App
比如我就是启动的这个,导致启动失败。另外,如果在公司一不小心执行了这个,有可能带来灾难性后果。比如覆盖掉原来的表结构,查询语句等等
启动,浏览器localhost:8090/home ,测试
因为我们手动执行了
UserDOuserDO=userDOMapper.selectByPrimaryKey(1);
而现在我们的数据库还是空的,所以会显示用户信息不存在!
这证明了我们运行是没问题的。
接入mybatis总结
这一步比较繁琐,其实都可以写成一本书了。但是,这些都是见过一遍就能记住的活,
也不涉及多么多么难的技术,所以我一口气,把内容都写到一个文章里了。