Spring Boot+Mybatis项目总结

IDEA创建maven项目

使用IDEA创建maven项目,勾选从模板原型构建,这里选择maven-archetype-quickstart类型,这种类型的maven项目以jar包的方式提供对外统一的输出,这是最快速的一个构建Spring Boot研发项目的模板。在没有Spring Boot的开发框架时,更多的选择maven-archetype-webapp,这种方式创建的是以war包方式部署在Tomcat或JBoss这种J2EE的容器。

创建成功后,需要给目录指定其为什么目录,选定项目文件夹,右键选择Mark Directory as,然后选择目录类型。还要在main目录下创建resources目录并指定类型。main目录下的java目录下放置java源代码,resources目录下放置spring、spring boot等的资源配置文件。

从零集成项目

查看Build with Maven目录下pom.xml文件,从其中复制spring-boot-starter-parent依赖到项目中的pom.xml文件中,这样当前的项目就是Spring Boot项目。并在项目pom文件标签内引入spring-boot-starter-parent下的spring-boot-starter-web和spring-boot-starter-test项目。

在APP class上加@EnableAutoConfiguration注解将APP的启动类当成可以支持自动化配置的bean,并且能够开启整个工程类基于springboot的自动化的配置,然后用下面这行代码启动Spring Boot。

SpringApplication.run(App.class,args);

要实现Spring MVC的***controller***功能,则引入注解@RestController或@Controller

Spring Boot 对应的配置化操作,只需要在resources目录下创建默认配置文件——application.yml或application.properties,在其中进行配置。

集成Mybatis

进入pom文件,确定使用的数据库,使用mysql,则引入mysql-connector-java包;确定使用什么连接池来管理mysql的链接,这里使用阿里巴巴的druid连接池。然后将spring boot对mybatis的支持引入,这里使用mybatis-spring-boot-starter包;在配置文件类导入mybatis需要的一些配置,用来启动一个带mybatis数据库访问的一个spring boot工程,例:

mybatis:  mapper-locations:classpath:mapping/*.xmlspring:  datasource:    name:miaohsa    url:jdbc:mysql://localhost:3306/miaosha?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC    username:root    password:123456#使用druid数据源    type:com.alibaba.druid.pool.DruidDataSource    driver-class-name:com.mysql.jdbc.Driver

mybatis的自动生成工具

然后使用mybatis的自动生成工具,用来生成对应数据库文件的映射。

在pom中引入mybatis自动生成的插件,例:

org.mybatis.generatormybatis-generator-maven-plugin1.3.5org.mybatis.generatormybatis-generator-core1.3.5mysqlmysql-connector-java5.1.47mybatis generatorpackagegenerate<!--允许移动生成的文件-->true<!--不允许自动覆盖文件-->falsesrc/main/resources/mybatis-generator.xml复制代码

其中mybatis-generator.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"><!--数据库链接地址账号密码--><!--生成dataobject类的存放位置--><!--生成映射文件存放位置--><!--生成Dao类的存放位置--><!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件的代码

              type="ANNOTATIONDMAPPER",生成Java Model和基于注解的Mapper 对象

              type="MIXEDMAPPER",生成基于注解的Java Model和相应的Mapper对象

              type="XMLMAPPER",生成SQLMap XML 文件和独立的Mapper接口

        --><!--生成对应表和类名-->

在Run/Debug Configuration下新建一个Maven的配置,例:

将@EnableAutoConfiguration注解改为@SpringBootApplication,其等价于以默认属性使用@Configuration , @EnableAutoConfiguration 和@ComponentScan 。最终启动类注解例:

@SpringBootApplication(scanBasePackages = {"com.miaosha"})@RestController@MapperScan("com.miaosha.dao")

SpringMVC方式进行开发

使用SpringMVC方式进行开发,项目结构

其中dao层dataobject层由mybatis自动生成工具生成,dataobject层(负责数据存储到service层的传输)下的类对应数据库对象模型,其中的字段与数据库一一映射,dao层下的类定义对数据库进行交互的方法,在resources的mapping目录下有自动生成dao层对应的配置文件,一起实现对数据库的操作。

service层下model目录下创建对象模型(不可以把数据库的映射简单透传返回给想要service的服务,这个model对应Spring MVC中业务逻辑交互的模型),然后在数据库中创建对应的表,在service层下创建对应对象的service接口,接口中定义需要的方法(方法的返回类型大部分为model对象),在service层下impl目录下去实现。添加方法:在mapping目录下对应配置文件中添加相应的SQL语句,在dao目录下的对应接口中建立映射(添加方法)。

:若数据库表中设有自增id,需在mapping目录下配置文件中的insert标签中添加属性useGeneratedKeys="true" 和keyProperty="id",指定自增id

在serviceImpl中定义数据库对象dataobject与模型对象model相互转换的方法,在controller中定义模型对象model与视图对象viewobject相互转换的方法,这里使用到了org.springframework.beans.BeanUtils方法(作用为将一个Bean对象中的数据封装到另一个属性结构相似的Bean对象中,有些属性可能由于类型原因无法封装,需要手动添加)。

serviceImpl类与controller类中分别需要添加**@Service注解和@Controller注解**

response层定义了统一返回类型,有一个通用对象,最终返回前端的对象为该通用对象

error层有一个common error接口,一个Enum枚举类实现该接口,该枚举类通过构造方法构造一个实现common error接口的enum类型的子类,一个继承Exception且实现common error方法的类,其内强关联一个对应的common error(即enum类),且实现其对应构造函数以方便使用。该方式对应设计模式——包装器业务异常类实现

controller层下viewobject目录下创建可供UI使用的对象,其中的字段为可以给用户查看的字段。在controller层下创建对应对象的controller类,在其中调用其service接口中的方法来实现相应逻辑。

controller层下还有一个基类BaseController,其定义了controller类下接口上的@RequestMapping注解中的属性consumes(指定处理请求的提交内容类型)的默认值(GET请求不需要);并通过定义exceptionhandler解决未被controller层吸收的exception(为业务逻辑处理上的问题或业务逻辑错误而并非服务端不能处理的错误),例:

@ExceptionHandler(Exception.class)//需要指明收到什么样的exception之后才会进入它的处理环节,此处定义为根类@ResponseStatus(HttpStatus.OK)//捕获到controller抛出的exception,并返回HttpStatus.OK,即status=200@ResponseBody//handler exception使用这种方式(Object会寻找本地页面文件)仅仅只能返回页面路径,无法处理viewobject类对应的@ResponseBody形式,加上@ResponseBody注解即可解决publicObjecthandlerException(HttpServletRequest request, Exception ex){//获取异常并处理}

其他所有controller类都要继承基类BaseController

在UserController中,用户登录接口中将登陆凭证加入到用户登录成功的session

@AutowiredprivateHttpServletRequest httpServletRequest;//通过bean的方式注入进来,代表这个HttpServletRequest是单例模式//单例模式怎么可以支持一个request支持多个用户的并发访问?//bean包装的HttpServletRequest,本质是一个proxy,它内部拥有ThreadLocal方式的map,去让用户在每个线程当中去处理它自己对应的request,//并且有ThreadLocal清除机制,可以放心使用,且这个HttpServletRequest对应当前用户的http请求

//将登陆凭证加入到用户登录成功的session中,分布式中用tokenthis.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userVO);

登录密码加密

因为jdk自带的MD5实现的方式只支持16位MD5,更改加密方法,例:

//将密码加密publicStringEncodeByMd5(String str)throwsNoSuchAlgorithmException, UnsupportedEncodingException{//确定计算方法MessageDigest md5 = MessageDigest.getInstance("MD5");    BASE64Encoder base64Encoder =newBASE64Encoder();//加密字符串String newstr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));returnnewstr;}

validator层下为格式化校验规则,在pom文件中引入Apache Commons Lang包,使用了其StringUtils工具类;还引入了hibernate-validator包来进行校验。其下建立一个校验结果对象,对象中还创建一个获取错误信息的方法以便使用;并创建一个实现InitializingBean类的一个校验实现类,将hibernate validator 通过工厂校验的方式使其实例化,然后实现校验方法并返回校验结果对象。另外对字段有什么限制可在model层下对象模型的字段上添加注解如@NotBlank、@NotNull、@Max、@Min等。

跨域解决

在controller类上加上如下注解:

@CrossOrigin(allowCredentials ="true",allowedHeaders ="*")//实现跨域

DEFAULT_ALLOW_CREDENTIALS = true:

需配合前端设置xhrFields授信后,

使得跨域session共享

前端ajax请求添加设置:xhrFields:{withCredentials:true}

DEFAULT_ALLOWED_HEADERS = *:

允许跨域传输所有的header参数,将用于使用token放入header域做session共享的跨域请求

在此我向大家推荐一个架构学习交流群。交流学习群号:938837867 暗号:555 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容