在前面文章 <<java实例项目学习>> 中分析了下整体项目,按照计划,接下来一点点分析里面的技术细节。

技术点

  1. 项目结构,多模块 传送门
  2. mybatis的使用 ,dao model,service
  3. JWT 登录认证
  4. Swagger文档
  5. logstash
  6. 第三方集成: oss

本章学习如何用spring boot连接mysql,查询,增加等操作

准备

mysql安装 建议5.6+,java8,idea

概念

我们首先得了解一些基础概念和数据读取的基本流程。方便我们更深入的理解

一. 驱动

java程序连接mysql,是要通过驱动,常用的就是:mysql-connector-java
根据前面创建项目接着做,打开admin/pom.xml, 键盘 alt+ insert键,弹出框中选择dependency,会弹出maven artiact search的一个窗口。

搜索mysql,选择mysql-connector-java,pom文件里面会自动增加依赖,编辑右下角有个change的提示,点下自动下载相应的包,当然也可以在编辑器右侧点maven手动down。

二. 框架

链接数据库的框架比较多,Spring data JPA、Hibernate和Mybatis等

  • JPA(Java Persistence API)是Sun官方提出的Java持久化规范,对象/关联映射工具来管理Java应用中的关系数据,JPA是一套规范,不是一套产品
  • Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,继承JpaRepository提供findAll,findOne等方法
  • Mybatis半自动化的持久层框架
  • hibernate 持久层框架

主要学习JPA和Mybatis,hibernate学习事件要久些后面单独来。
既然是学习spring boot,当然先测试jpa

spring data jpa 学习

这里有个guide:https://spring.io/guides/gs/accessing-data-jpa/
文档:https://docs.spring.io/spring-data/jpa/docs/2.1.5.RELEASE/reference/html/

打开pom文件,在depend里面增加 spring-boot-starter-data-jdbc
然后在包下增加entity和repository
具体代码:https://gitee.com/qian/java_study/tree/use-db/admin

开发:

  1. 创建数据库,修改application.properties 传送门
  2. 创建Entity,设置字段 传送门
  3. 创建Repository 传送门
  4. 调用 传送门

说明:

  • repository继承的PagingAndSortingRepository,里面有分页
  • 要理解这个过程,需要了解DDD
    201806201548229.jpg

Mybatis 学习

http://www.mybatis.org/mybatis-3/zh/getting-started.html

在前面文章 <<java实例项目学习>> 中分析了下整体项目,按照计划,接下来一点点分析里面的技术细节。

技术点

  1. 项目结构,多模块
  2. mybatis的使用 ,dao model,service
  3. JWT 登录认证
  4. Swagger文档
  5. logstash
  6. 第三方集成: oss

准备

环境: java8

开始hello

  1. 打开idea=>new project->spring initializr->next->填写包信息->选择依赖 web:web->填写项目名称->flish完成
  2. 点击idea右侧maven菜单,在弹出的菜单点击第三个下载图标down source and document,下载相应的依赖,然后等待一下,右下角有进度
  3. 新建个控制器测试 src/main/java/com../controller/HelloController
    测试代码:https://gitee.com/qian/java_study/tree/s1/

然后点击idea上面的run,然后访问http://127.0.0.1:8080/hello/say,搞定
以上是单模块

多模块

  1. 同样的,idea->new project->maven->填上包名->flish
  2. 项目文件列表中右键 new-> module ->然后上单模块相同的操作,groupId和填写一样 artifactId填写.注意最后目录是要增加子目录的!!!!,否则会覆盖pom文件
  3. 在根目录下pom.xml文件增加
    <modules>
        <module>admin</module>
    </modules>
  1. 同样按上面的步骤,增加控制器,运行,预览。ok!!!搞定
    测试代码:https://gitee.com/qian/java_study/tree/modules/

学了一段时间java和springl ,基本的都可以写了,是时候找个项目学习下,了解下做个web项目的整体架构和流程

一.选型

浏览了一圈项目,最终选择https://gitee.com/macrozheng/mall,进行学习
开发编辑器 intellij IEDA

1. 安装

git clone https://gitee.com/macrozheng/mall

克隆下来后,打开编辑器,直接open这个目录,然后等待,编辑器会自动搞定依赖下载。
趁这个时间,先去mysql建个表,导入document/sql 下面的数据库,修改下src/main/resources/application-dev.yml,将连接修改成我们真实的

2. 运行

测试的mall-admin模块
一段时间后,点击下面run dashboard, 选择MallAdminApplication,右键直接run
1.jpg

ok,项目启动,测试下:http://localhost:8080/swagger-ui.html#/

2.jpg

完美。心情舒畅。

3.搭建访问后台

https://github.com/macrozheng/mall-admin-web.git
cd mall-admin-web
npm install
npm run dev

install一定要等他执行完,中断的话,请手动删除node_modules目录,否则会让你痛不欲生
3.jpg
完美

二.代码分析

首先看pom

根目录下的定义了几个模块,进入mall-admin,查看pom.xml.干了以下几件事

  1. 定义项目名称版本等
  2. 设置spring-boot项目
  3. 设置编码
  4. 设置依赖,spring-boot,myBatis(数据库),swagger(文档),jwt(认证),oss(文件存储),logstash(日志),druid(连接池),lombok(精简注释)
    由于我的java版本过高,导致了有些库不在了,手动添加了下面依赖,否则登录会报错,解析不了查询结果
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

查看入口

入口文件 mall-admin/src/main/java/com.marcro.mall/MallAdminApplication

特别新的手会问为啥知道这个是入口,没看spring boot的基础学习的时候,我也想过。类上面有@SpringBootApplication注解的是启动类,还有个需要注意,spring boot遵循约定大于配置,所以不是所以东西都有配置,如果要找的话,要一层层往源码上找。所以看spring boot的项目需要做到不要去想这里为什么要这样写,约定就是这样。

  1. @SpringBootApplication 指定这个类是个spring boot启动类,需要完成SpringApplication.run
  2. @MapperScan 是myBatis的注解,设置扫描目录,避免单个文件去加@Mapper
  3. @EnableTransactionManagement 开启数据库事务,然后在使用访问数据的service方法上加@Transactional即可

一个spring boot即配置完成,是不是感觉比想象中的简单很多!当然学习这个代码的前提是你要对spring boot的目录结构,注解和maven的pom文件需要有基本的了解。

控制器

进入controller目录,找个控制器看看是什么样子,就拿刚才运行的swagger文档的第一个吧
CmsPrefrenceAreaController,上面的import先不管

  1. @Controller 声明这个是个控制器,一般php都是通过路由转发直接指定,控制器一般都继承了父类,这个声明就相当于注册到路由说我这里是个控制器,然后继承了一堆spring contrller的一堆注解下来
  2. @Api,这个是用于swagger自动生成api文档的注释
  3. @RequestMapping 是设置路由目录
  4. @Autowired 自动装配变量,有这个注释的会自动增加get和set方法,并且根据类型,自动注入相应的实例,比如这里的 prefrenceAreaService 就自动注入为CmsPrefrenceAreaService,下面方法里面prefrenceAreaService 即可以直接用相应的方法,这个php开发的比较难理解,类属性不经过初始化,自动就设置了。需要理解他的ioc和di容器
  5. 方法上的@ApiOperation是swagger生成文档的api的名称
  6. 方法上的@RequestMapping是具体路径,和类的连起来访问 /prefrenceArea/listAll
  7. 方法上的@ResponseBody是 spring 控制器返回的注释,将方法的返回值以特定的格式返回到response的body区域,给访问者返回
  8. 方法体里面就调用之前@Autowired 注入进来的service里的listAll方法查询数据,然后返回

至此一个控制器完成,写起来是不是也很简单

service

既然上面控制器用到了service读取数据,那就再接着看看CmsPrefrenceArea到底完成了什么工作
要看懂这个service如何运行的,需要先记住下面这张图

QQ截图20190322163745.jpg

理解了这个图,就很好理解他怎么读数据了,CmsPrefrenceAreaService -> listAll,这个只是个接口,而实现是下面的impl

打开CmsPrefrenceAreaServiceImpl,找到listAll方法,注意上面的注解 @Service,并且这个类是实现的那个接口,也就是说通过注解,spring boot会自动把这个实现类注入到@Autowired 声明的CmsPrefrenceAreaService变量里面。

需要仔细理解这个流程。 那么控制器里面的prefrenceAreaService.listAll()实际就是调用的这个实现类的方法。 是不是很绕? 知道原理后直接暴力认为就是实现类里面的方法就行了。

这个实现类干了些啥?当然是实现接口的listAll方法。 同上面一样 @Autowired 注入了CmsPrefrenceAreaMapper,这个mapper同样只是接口,他对应的是CmsPrefrenceAreaMapper.xml,在mall-mbg,src/main/resources/com/macro/mall/mapper/CmsPrefrenceAreaMapper.xml文件,接口的方法对应相应的id。
那么就是说, listAll =>apper.selectByExample =>xml 里面的<select id="selectByExample" , 最终执行的是这个sql。

或许你会疑惑,他怎么知道去找哪个文件,回头看看MallAdminApplication这个文件,上面记得有个@MapperScan注解么?里面就扫描了目录,自动去生成了映射文件。

至于怎么生成,怎么关联,怎么自动找到service,serviceImpl,mapper,xml,最终sql的执行和一些mock数据的返回等等,有兴趣的可以去看源码,而这也是高手升级的必经途径,以后等我读完源码也会更新一些文章。

至此,一个完整的service流程解读完毕,虽然里面还有很多黑盒子等待我们去打开。但是至少我们知道他是怎么回事了。
再补张myBatis的运行流程图,加深记忆
4.jpg

这里有个多模块开发和一些model生成的问题需要注意下
模型类CmsPrefrenceArea,定义了一些字段,但是仔细看看哦,这个文件是在mall-mbg下,为啥呢,因为mall-admin的pom文件依赖里面声明了需要依赖这个模块。

那就来看看mall-mbg。
同样按照套路,pom.xml读起,可看到里面依赖了mybatis的一些库,其中有个org.mybatis.generator。搜索以下,原来这个就是用来自动生成这些model,dao和mapper文件

至此项目大致流程和文件解读完毕。接下来需要学习他的一些组件应用,比如jwt,mybatis,swagger等,后面一个个学习和写文章。

路漫漫其修远兮,吾将上下而求索,诸君共勉

友情链接: 陶士涵的菜地