各种的框架

  • maven(项目构建工具)

1.概述

1.1是什么

Maven是跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,主要服务于基于java平台的项目构建依赖管理项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。

maven核心:下载jar包 + 存放jar包 + 编译jar包

1.2为什么

改变手动将jar文件复制到lib目录中,并且buildpath的维护方式,设计出一套自动维护jar的体系,已经广泛在软件项目中使用,是软件开发人员必须掌握的技术。

全新的设计体系:创先河的发明pom模型,引入了“仓库”、“依赖”、“坐标”和“命令”。

1.3 pom模型:

https://i-blog.csdnimg.cn/blog_migrate/c3a1262339943d0ded0aac92e2dfff6e.png

2.使用

2.1 四大特征

2.1.1仓库

中央仓库:又称全球仓库

镜像仓库:全球各地做镜像仓库

本地仓库:下载一次后,不会再次下载的,除非你删除了。

当用户需要某个jar包时,先到本地仓库寻找,没有再去镜像仓库,没有再去中央仓库。中央仓库找到后,先保存一份到镜像仓库,镜像仓库返回本地仓库,本地仓库也保存一份,然后返回给调用者。

2.1.2 依赖

     每个核心jar包形成一个依赖,maven底层进行它相关的jar的自动导入。

<dependency>

         <groupId>mysql</groupId>  //组标签

         <artifactId>mysql-connector-java</artifactId>  //项目标签

         <version>5.1.32</version>  //版本标签

</dependency>

2.1.3 坐标

     唯一标识,统一规范,就可以把查找工作交给机器,默认查找jar包。

全球不同厂商的jar包都可以保存在maven仓库中,而不会冲突,各自在各自的目录中。同一个厂家因为版本号的不同,也会放在不同的目录中,不会引起冲突。

2.1.4 命令

Maven定义了一套生命周期。共有3个生命周期:cleandefaultsite,每个生命周期包含多个阶段phase

每个周期中运行一个命令时,在这个周期里的其他在该命令之前的phase步骤都会执行。如:执行install会自动执行compile(编译java变成了class),test(运行所有单元测试类),package(把整个项目零碎的class文件打包为jar包),最终把成品jar发布到本地仓库中。但执行install并不会自动执行clean

2.2安装和配置

1.免安装版下载解压到自己指定的目录。

2.配置文件:打开apache-maven-3.6.3\conf\settings.xml 全局配置文件

            设置镜像仓库:配置阿里私服镜像仓库,可以写在mirrors标签中间:

            设置本地仓库:默认是 C:\Users\lpx.m2,建议改变默认仓库位置的配置,否则重装操作系统时,可能会把仓库误删除。

3. eclipse 集成了 maven

4.IDEA 集成了 maven:

IDEA 新建项目配置 maven:

file>>>new projects setup>>>setting for new projects>>>build,execuition>>>build tools>>maven

maven home path:设置maven安装路径

user settings file: 用户设置文件

local repository: 本地仓库文件

如果不进行配置,idea将自行使用默认配置,自行创建设置和仓库。

 IDEA 本项目配置 maven:

setting>>> build,execuition>>>build tools>>maven其他同上述

  • Springboot框架

1.定义

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。成为SpringBoot全家桶。

2. springboot 项目结构

        

3.使用

3.1创建springboot工程:

无需安装,idea和eclipse中可直接创建

https://i-blog.csdnimg.cn/blog_migrate/91c2d3445393d6fdd4ef7cff2f0f9135.png

https://i-blog.csdnimg.cn/blog_migrate/cf3e54a3d11d92987b3a252792d86a7d.png

https://i-blog.csdnimg.cn/blog_migrate/cecf4f89bf73aa7862b6fa20f5f0b3ae.png

3.2.改配置

JAR包下载网站springboot server url : 默认是官网镜像文件https://start.spring.io,

可以改成https://start.ailiyun.com

修改端口号:在src/main/resources下添加application.yml文件,: server: port: 8090。

3.3 springboot特殊文件解释

target: springboot项目运行后生成的文件

SNAPSHOT.jar以此结尾的jar包使本项目可作为其他项目jar包而导入。

...Application: main>>>java下的以此结尾的文件为主文件,既启动文件。

4. 特点

创建独立的Spring应用程序

嵌入的Tomcat,无需部署WAR文件

简化Maven配置:无需手动下载jar包,springboot在创建项目时会自动下载最新版jar包

                如需手动添加Jar包,同maven一样在<dependencies>内添加<dependency>。

自动配置Spring

提供生产就绪型功能,如指标,健康检查和外部配置 

 

  • Springmvc框架

1.概述

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用SpringSpringMVC框架或集成其他MVC开发框架,如Struts1(现在一 般不用)Struts2(一般老项目使用)等。

SpringMVC就是基于MVC设计模式来实现的。

我们的POJO就是Model层,我们的JSP就是视图层,我们的Controller就是控制层。

现在主流基于SSM三大框架开发都是在MVC上继续演化,又分为持久层DAO,业务层Service,控制层Controller。持久层用来和数据库读写ORM,业务层用来处理复杂的业务逻辑,控制层用来处理MVC的控制。

2.MVC模型

用来进行分层的结构,这样代码分离结构清晰,各层代码,各司其职,易于开发大型项目。

MVC(Model模型、View视图、Control控制层),将软件进行分层达到松耦合的效果。

通用的软件编程思想, MVC设计模式中认为, 任何软件都可以分三层:控制层(Controller)、数据处理模型(Model)、负责展示数据的视图(View)。

MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。如果某一个模块发生变化,应该尽量做到不影响其他两个模块。提高代码的可读性,实现程序间的松耦合、提高代码复用性。

 

3.工作原理:

 

3.1组件:

前端控制器DispatcherServlet:接受请求,并且调度,通过端口号过滤请求。

处理器映射器HandlerMapping:根据地址栏的写法,找到能处理本次请求的类的方法。

处理器适配器HandlerAdapter:真正开始找到方法,执行方法体处理业务,并返回结果。

视图解析器ViewReslover:找到能展示数据的页面。

视图渲染Views:把数据展示在页面上。

MVC的@RestController>>@RequestMapping() 注解下是处理器映射器,获取类名,方法名

3.2数据从浏览器发送

错误类型:404:链接错误,找不到,HandlMapping对比端口,对不上报404

          405:请求类型不匹配。

          400:参数值错误,未传参或参数类型错误,HandlerMapping对比请求方式

          500:参数名错误,具体需要看后台报错信息

浏览器发送数据给服务器form请求有11种,常用4种,get、post、delete、put

get的数据,在地址栏展示,用?拼接数据

浏览器发送的变量名和服务器处理器映射器需要的变量名必须一致

get方法:

网页地址栏直接输入:

<a href="http://localhost:8080/order/save/10/100/phone">练习3</a>

表单<form  method=”get” > :

<form  action =”目标程序ip地址+端口号+ Mapping()中的规则>

  post方法

3.3 数据在服务器接受

@RestControllerMVC提供的注解,springmvc框架核心:接受请求,它所声明的控制器在返回响应时,就如同使用了@ResponseBody 注解一样。是@controller和@ResponseBody结合体, @controller 当前类交给Spring容器和@responsebody前后端交互时,将后端服务器返回的对象转化为JSON结合体

/它会告诉Spring将返回类型序列化为合适的格式,默认情况下为JSON 格式。

/通过用@RestController注释控制器类,您不再需要向所有请求映射方法添加@ResponseBody。

@RequestMapping()MVC提供的注解,规定浏览器用get请求方式和规定关键字访问资源

@PostMapping()接收post请求方式

@GetMapping()接收get请求方式

@RequestParam后端使用map<k,v>接收参数时,形参必须使用@RequestParam注解描述

参数名和请求参数名称不同时使用,可以设置默认值。

@PathVariable(restful风格):http://localhost:8080/Car/save2/1/

               @RequestMapping("save2/{id}/{name}")

                public String save2(@PathVariable Integer id,@PathVariable Integer name){return                                                            id+name;}参数名和注解中要求的名必须一致,位置一致

如果编译后变量名(id、name)不保留,需要的参数名与此不同,需要在注解中加入编译后的参数名@PathVariable("编译后名"),@RequestParam注解亦是

@DateTimeFormat(pattern = "yyyy-MM-dd")

 前端传来的日期数据是字符串类型,这个注解作用是把传入的字符串类型日期转成日期类型

          @DateTimeFormat(pattern = "yyyy-MM-dd")

          private Date 变量名;

@ResponseBody 返回对象利用jackson工具类转换为json字符串,有@RestController则不用加

参数:浏览器发送的变量名和服务器处理器映射器需要的变量名必须一致,可使用自己创建的对象接受参数,可使用map集合接收参数。

@service:声明是业务层 交给spring管理

@mapper:声明是数据库持久层

3.4数据处理模型(Model)我们的POJO类就是Model

3.4.1 什么是pojo:

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans. 其中有一些属性及其getter setter方法的类,没有业务逻辑.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

3.4.1 pojo类写法(怎么写):

1.必须有get/set方法

2.必须实现序列化接口 数据流传输/socket通讯

3.4.2 pojo类写法简便写法:

1. pojo类上加@Data注解,既自动生成get/set/toString/equals/hashcode方法

2. pojo类上加@Accessors(chain = true),将SET方法重写为具有User返回值的方法,调用时可实现链式加载。

3. pojo类上加@AllArgsConstructor注解

4. pojo类上加@NoArgsConstructor注解

  • Spring框架

1.概念

1.1 Spring 框架是一个分层架构:

由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图所示:

https://i-blog.csdnimg.cn/blog_migrate/c3f3838b217b608364b92ef018c33f1d.png

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

 

Spring 的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。

1.2核心概念

 

1.3 IOC控制反转:

就是指将对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)权利交给了spring容器。在Spring框架下如何创建对象

1.3.1第一种XML文件配置bean

1在resources文件中new一个Springconfig配置文件。

 

2. spring认为万物都可bean,只要你的类,交给spring框架,spring就能IOC(既控制反转),指spring框架帮你创建对象

    id属性是bean标签的唯一标识,class属性是用来指定类的全路径

IOC底层数据结构是MAP的键值对{类,类对象}

举例:创建了一个hello和hello的对象

<bean id="hello" class="cn.tedu.spring.Hello">

一般情况下都是单例模式创建对象。

以下方法可以设置bean对象是单例的还是多例的,默认是singleton是单例的

{"hello",Class.forName("cn.tedu.spring.Hello").newInstance()}

       配置 scope="prototype"

1.3.2 第二种通过Spring注解IOC控制反转创建对象

    1. 在要创建对象的类上加@service@contrller@Repository@component,并注入spring容器中,key是类名小写,value是类的对象。

2.此时如果再在<bean>配置文件中加入<context:component-scan base-package="包名" />

可以在扫描这个包只要使用@component ,IOC注解的都会创建对象,不是这个包下的即使使用@ component 注解Spring的bean也不会创建对象,如果加了@RestController则包含了包扫描。

手动获取对象:

1.创建好bean对象后读取配置文件:

ClassPathXmlApplicationContext spring = new ClassPathXmlApplicationContext("

resources文件中配置bean的带xml后缀的文件名");

2. 获取对象:

    Object o = spring.getBean("hello");//通过配置文件中配置过的bean标签中id获取类

     System.out.println(o);//此时o为Object类型,只能调用Object类中的功能,需要向下强转型,hello h=(hello) o才能使用子类hello的功能

3.getBean( “”) 内的类名如何改:@component时在@component(“新的自定义名”),使用getBean( “”)即可使用新的自定义名。

1.4 DI依赖注入:

 1.4.1:@Autowired使用方式:

两个对象的依赖关系:在其中一个类中使用@Autowired

     @component

  pubulic void class1{

@Autowired

Class2 class2 // Class2也要ioc:@component

}

完成这一步之后,创建class1时也可使用class2的功能,把class2当成class1的成员变量

1.4.2:依赖注入的步骤:

  1. 在注入类中声明一个被注入类的引用对象作为属性。
  2. 使用@Autowired注解描述该对象。

1.4.3:@Autowired使用规则:

1.注入类和注入类的对象都必须交给Spring管理

    2.既可以实现类的注入,也可以实现接口的依赖注入

    3. @Autowired对类实现依赖注入时,首先会根据注入类的类型到SpringIOC里改类的对象:如果有一个,则使用该对象完成依赖注入,如果没有则报出NoSuchBeanException

        有多个时,@Autowired根据引用变量名,查找是否存在同名的对象,如果有,使用该同名对象完成依赖注入,如果没有,则会报出不唯一Bean异常

4. @Autowired对接口实现依赖注入:

      首先会根据该接口查找SpringIOC里实现类的对象,如果有且只有一个,使用该实现类对象完成依赖注入,如果没有会报NoSuchBeanExcption异常,如果有且不止一个时,则会根据引用变量的名,去SpringIOC里查找同名的实现类对象,如果有则使用该对象完成依赖注入,如果没有同名对象,则报不唯一Bean异常

1.4.4:@qualifier注解:

目的:解决不唯一Bean异常

使用:该注解需要一个参数,参数值时SpringIOC容器中多个相同类的对象名。也就是@Autowired会拿该注解value参数值代表的对象名去SpringIOC容器查找同名对象,完成依赖注入。

1.5 AOP 面向切面

三要素一:Aspect定义切面

通过通知(Advice)来指定具体做什么事情。如方法执行前做什么,方法执行后做什么,抛出异常做什么,从而实现对象行为(方法)的增强;

具体通过切点(PointCut)配置切点表达式(expression)来指定在哪些类的哪些方法上织入(ware)横切逻辑;被切的地方叫连接点(JoinPoint);

通知Advice

Spring框架实现了AOP面向切面,其引入了第三方AspectJ框架来具体实现。AspectJ提供了五种切入方式,术语称为通知advice。

具体五种为:

前置通知before:调用业务方法前会被执行的功能

后置通知after:调用业务方法后会被执行的功能

环绕通知around:调用业务方法前后会被执行的功能

返回后通知afterReturning:调用业务方法并返回了结果后会被执行的功能

异常通知afterThrowing。,调用业务方法并抛出异常后会被执行的功能

切面Aspect就是一个类

切点PointCut切面中遇到调用通知功能的点叫切点。

使用步骤:

  1. 添加JAR包的坐标:

常用场景:缓存,异常,同步,事务

SpringMVC项目修改端口号

在resources文件中创建或使用application.yml(同application.properties)中修改端口号:server:port:新端口号(端口号控制在1025-65535,4000以下也最好不要使用),使用application.yml需要在新端口号前有个空格这个文件是核心配置文件,配置所有第三方框架。

  • mybatis框架

1.概述

1.1框架介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

1.2 Mybatis官网介绍

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

总结: MyBatis 是一款优秀的持久层框架,利用ORM思想实现了数据库持久化操作.

补充说明: 也有人把mybatis称之为半自动化的ORM映射框架.

2.1 ORM思想

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。

关系映射:

1. 对象映射-------映射表

2. 对象中有属性-------表中有字段

总结: 以对象的方式操作数据库.

2.2和JDBC对比说明:

1. JDBC 方式完成入库和查询操作

insert into xxxx(字段名称) values (字段的值…)

select * from xxxxx 结果集需要自己手动封装为对象 (繁琐)

2. ORM方式实现入库

userDao.insert(对象)

3. ORM方式的查询

List userList = userDao.selectList(对象);

3. Mybatis 入门

3.1创建新项目准备好lombok,mysql,jdbc包

3.2 Mybatis常规开发步骤

 

执行SQL语句有1.SQLSesson的 API(.getmapper(接口映射))的方式

              *2.以接口开发的方式执行SQL

3.3:案例:

1.编辑mybatis-config.xml配置文件

         mybatis配置文件路径

 

2.创建用户信息类User。

 

3.创建接口:接口中创建查询user表中所有的数据(User类型)的方法

接口中的方法不能重名,否则会造成映射中的ID重名,不符合规则。

 

4.创建Mapper映射文件:映射接口文件的用户信息类User,给予sql执行语句

 

5.通过配置文件和获取的链接获取数据

4. Mybatis CURD操作

4.1 按照ID查询数据

查询id=1的数据:

SQL:select* from demo_user where id=1;

1、输出:

 

2、映射的配置文件的查询语句:

 

查询语句需要有 namespace: 接口全路径

               id:几口中的方法名

               resultType:找到接口中的返回类型,只能用于单表查询。

               select:标签中的执行语句

增删改语句需要有 namespace: 接口全路径

                 id:几口中的方法名

                不需要  resultType

                标签中的执行语句

4.2更新操作:(增删改)

1、输出:

 

2、映射的配置文件的增删改:

 

3、特别注意:

  执行语句中有多个参数或全部参数时,最好使数据类型对象创建全参构造。

4.3 map集合封装数据

需求: 查询age>100并且age<1000的用户

如果有重名属性,一般使用Map集合封装数据

1、输出:

 

2、映射的配置文件的查询语句:

 

3、特别注意:

XML中小于号小于号成了尖括号:

所以需要使用&gt;代替>号

&lt;代替<号

&amp;代替&号

          或者使用转义标签< ! [ CDATA [ 需要转义的内容 ] ] > 

4.4 注解@Param封装数据参数

用法:@Param( Key ) value;

1、接口方法定义接受的参数类型:

   底层也是map集合:

 

2、输出:

 

4.5模糊查询like:

    %需要用双引号引住:

select* from demo_user where name like "%"#{name}"%" ;

4.6简化的配置

4.6.1简化映射中查询语句resultType路径名:

   第一种:mybatis-config.xml中配置typeAlias标签将全路径简化为自定义别名

   设置User全路径resultType名为User

      <typeAlias type="com.jt.springboot_demo2.pojo.User" alias="User"/>

     使用效果: <select id="findUser" resultType="User">

第二种:包名设置,

<package name="com.jt.springboot_demo2.pojo"/>

<!--包名归拢设置, User会自动索引包-->

使用效果: <select id="findUser" resultType="User">

   

4.6.2简化sql语句:

原语句:

<select id="findUser" resultType="User">/

    select id,name,age,sex,id,name,age,sex,id,name,age,sex from demo_user;

 </select>

添加sql小标签:

  <sql id="user_cloumn">   id,name,age,sex   </sql>

简化后sql语句:

 <select id="findUser" resultType="User">/

  select <include refid="user_cloumn"/>from demo_user;

  </select>

5.mybatis高级用法

5.1集合操作:

案例1:查询id号1、2、4、5、7

      sql语句:select*from demo_user where id in (1、2、4、5、7)

 

案例2:查询id号1、2、4、5、7

      将数组转化成集合

int[] ids={1,2,4,5,7}; 数组封装到集合中,

基本类型没有get/set方法,需要用包装类型Integer

 

案例3:查询id号1、2、4、5、7且 sex等于男的

 设置参数类型:

 

传参:

 

6.mybatis动态sql*

6.1 where,if标签动态判断

where可去除语句中多余的and和or

<!--根据对象中不为null的元素查询数据,where标签可去除语句中多余的and-->

    <select id="findSqlWhere" resultType="User">

        select * from demo_user

            <where>

           <if test="id != null"> id = #{id}  </if>

           <if test="name != null">and name = #{name} </if>

           <if test="age != null">and age = #{age} </if>

           <if test="sex != null">and sex = #{sex} </if>  ;

            </where>

</select>

6.2 set,if标签动态判断

set标签可去除语句中多余的逗号

<!--根据对象中不为null的数据完成修改,set标签可去除语句中多余的逗号-->

    <update id="updateSqlSet" >

        update demo_user

        <set>

            <if test="id != null"> id = #{id}  </if>

            <if test="name != null">, name = #{name} </if>

            <if test="age != null">,age = #{age} </if>

            <if test="sex != null">, sex = #{sex} </if>  ;

        </set>

    </update>

7.分支结构用法

7.1 <choose><when test=“1”></when >  <when test=“2” ></when > <otherwise> </choose>

<!--使用分支结构,根据属性查询数据,如果name有值就用name查,否则按年龄查询,如果都没值就按sex查询-->

    <select id="findChoose" resultType="User">

        select * from demo_user

       <where>

           <choose>

               <when test="name != null" > name = #{name}  </when>

               <when test="age != null" > age = #{age} </when>

               <otherwise> sex = #{sex} </otherwise>

           </choose>

       </where>

</select>

8.resultMap结构说明

8.1是什么:

   是用来映射业务属性类的

8.2为什么

因为服务器中属性名与数据库中的字段名不一致。

8.3怎么用

select标签使用resultMap映射返回的数据

   再使用resultMap标签对映射进行配置(撮合服务器属性名和数据库列名一一对应

<select id="findAll" resultMap="dogRM">

    select *from dog

</select>

    <resultMap id="dogRM" type="Dog">

        <!--使用id标签标识主键-->

        <id column="dog_id" property="dogId"></id>

        <!--使用result标签标识其他列-->

        <result column="dog_name" property="dogName"></result>

</resultMap>

8.4 resultType与resultMap区别

服务器中属性名和数据库中列名相同时使用resultType,只能用于单表查询

服务器中属性名和数据库中列名不相同时使用resultMap,用于多表查询

9.mybatis注解开发

9.1注解使用规则:

1.注解标识接口方法. 接口方法调用,注解内的内容.

      2.注解将查询的结果集,根据方法的返回值类型动态映射.

      3.注解开发只适用于单表操作,不可用于多表操作

      4.注解开发不可用于带foreach/where/set等标签操作。

9.2步骤

1、编辑测试方法

2、创建接口文件

    public interface UserAnnoMapper {

    //查询user表的数据记录

    @Select("select * from demo_user")

    //新增 @Insert("sql")

    //修改 @Update("sql")

    //删除 @Delete("sql")

    List<User> findAll();

}

3、Mybatis管理接口

<!--使用注解时mybatis需要管理mapper接口-->

<mappers>

<mapper class="接口全路径"/>

</mappers>

mybatis和springboot整合后文件类型:

 

10 mybatis规则

1、结果集不允许出现重名字段

/*出现重名字段情况去除*/

select emp_id ,emp_name,e.dept_id id1, d.dept_id id2,dept_name from emp e  inner join dept d  on  e.dept_id =d.dept_id;

11.使用mybatis对数据库进行关联查询

11.1一对一查询(一个主键值对应一个结果):

返回的表二对象用对象接收,POJO类有对象属性

    <select id="findAll" resultMap="empRM">

        select e.emp_id,e.emp_name,d.dept_id,d.dept_name

        from emp e,dept d

        where e.dept_id =d.dept_id;

    </select>

    <resultMap id="empRM" type="Emp">

        <!--主键字段property=属性名,column=结果集的字段名-->

        <id property="empId" column="emp_id"></id>

        <!--映射其他属性字段-->

        <result property="empName" column="emp_name"></result>

        <!--association是封装对象的关键API:意思为联系,可封装单个对象

        相当于接收嵌套的另一个返回结果集

        将结果集封装为单独的对象,存到封装的对象属性

        property="dept"   dept为对象属性名

        javaType="Dept"   Dept为对象类型-->

        <association property="dept" javaType="Dept">

            <id property="deptId" column="dept_id"></id>

            <result property="deptName" column="dept_name"></result>

        </association>

    </resultMap>

11.2一对多查询(一个主键值对应多个结果):

返回的表二对象用集合接收,POJO类有集合属性

<select id="findAll" resultMap="deptRM">

      select d.dept_id,d.dept_name, e.emp_id,e.emp_name

      from dept d, emp e

      where e.dept_id =d.dept_id;

   </select>

<resultMap id="deptRM" type="Dept">

   <id property="deptId" column="dept_id"></id>

   <result property="deptName" column="dept_name"></result>

   <!--collection是封装集合的关键API:意思为集合,可封装多个对象

       相当于接收嵌套的另一个返回结果集

       将结果集封装为一个集合对象

       property="emps"   emps为集合属性名

       javaType="Emp"   Emp为封装的类型为集合-->

   <collection property="emps" ofType="Emp">

      <id column="emp_id" property="empId"></id>

      <result column="emp_name" property="empName"></result>

   </collection>

</resultMap>

11.3子查询 (很麻烦,用处不多)

原因矛盾点:简化SQL语句,映射文件复杂

            简化映射文件,SQL语句复杂

            <select id="findAllSelect" resultMap="empRM2">

        select * from emp

    </select>

    <resultMap id="empRM2" type="Emp">

        <id column="emp_id" property="empId"></id>

        <result column="emp_name" property="empName"></result>

        <association property="dept" javaType="Dept" select="selectDept"

column="dept_id"></association>  //查询出第一个表的数据后通过给定的表二条件再查询

    </resultMap>

    <!--子查询内容,id与第一步的select属性相同,查询id为第一步查出来的部门ID-->

    <select id="selectDept" resultMap="deptRM">

        select * from dept where dept_id=#{dept_id}

    </select>

    <resultMap id="deptRM" type="Dept">//可开启驼峰映射省略这一步

        <id column="dept_id" property="deptId"></id>

        <result column="dept_name" property="deptName"></result>

    </resultMap>

12.驼峰映射规则:

12.1需求原因:

      当服务器属性名无下划线和数据库字段名带下划线时,服务器映射编写SQL语句时需要对名进行转化,步骤繁琐。

12.2驼峰映射规则出处:

mybatis自身提供的,规则默认关闭,需要手动开启。

12.3 如何开启

      在mybatis-config.xml配置文件中configuration标签下最优标签,

<configuration>

     <settings>

        <setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>

<environments>

</environments>

</configuration>

12.4 变化

  1.单表查询时,当服务器属性名无下划线和数据库字段名带下划线时,查询语句中不用再使用resultmap,使用resultType即可,但是如果为多表查询则依然要使用resultmap。

2.如果开启了驼峰规则,则resultmap中需要自动映射的属性可省略不设,但最好设主键

  3.如果需要映射封装对象,默认条件下,驼峰规则失效,但如果封装对象也要开启驼峰规则,则在resultmap中设置automapping=true,封装对象的标签中也要加automapping=true。

13.mybatis中缓存机制

13.1 缓存机制初衷:

   

13.2缓存机制使用:

要使用一级/二级缓存,则POJO对象必须实现序列化接口

  13.2.1一级缓存

        同一个sqlSession内部执行多次查询,缓存有效,向数据库获取一次数据多次使用,减少数据库压力,而且一级缓存默认开启。

SqlSession  sqlSession = sessionFactory.openSession();

DogMapper2 dogMapper2 = sqlSession.getMapper(DogMapper2.class);

        DogMapper2 dogMapper3 = sqlSession.getMapper(DogMapper2.class);

获取一次无限使用。

13.2.1二级缓存

        同一个sessionFactory,缓存有效,同一个工厂可以创建不同sqlSession,二级缓存默认开启,但调用的前提是一级缓存关闭,既sqlSession.close()。

       使用:

  1. 在对应的mapper映射文件中添加cache标签<mapper> <cache></cache></mapper >
  2. 关闭一级缓存,既sqlSession.close()。
  3. 要使用一级/二级缓存,则POJO对象必须实现序列化接口

获取一次无限使用。

  • Mybatis-plus

1.概述:

1.1框架介绍

是mybatis的增强工具,只做增强不做改变,为简化开发,提高效率而生。

导入mybatis-plus后要删除原有mybatis,因为mybatis-plus内有完整的mybatis,也许会跟mybatis原有的版本起冲突。

1.2框架特性

1.2.1无侵入:只做增强不做改变,引入它不会对现有工程产生影响.

1.2.2损耗小:启动即会自动注入基本 CURD,性能基本无损耗,面向对象操作

1.2.3强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

1.2.4支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

1.2.5支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

1.2.6支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

1.2.7支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

1.2.8内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

1.2.9内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

1.2.10分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

1.2.11内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

1.2.12内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.2.13 ORM方面提高

核心概念: 对象关系映射,以对象的方式操作数据库.

mybatis回顾: Mybatis是半自动化的ORM映射框架.

半自动: Sql是自己手写的,但是结果集映射是自动的.

MybatisPlus: 全自动的ORM映射框架,对Mybatis的扩展.

2.配置

 2.1修改核心配置文件YML的配置信息

mybatis 改成mybatis-plus就行

3.使用

3.1 pojo类

3.1.1  类上要添加@TableName("表名")

//对象的名与表名一一对应,如果对象名与表名一致则可以省略表名参数

3.1.2主键自增的属性上添加@TableId(type = IdType.AUTO)

//主键自增

  3.1.3 其他属性上添加@TableField(value = "id")

   //属性名和表中的value对应,如果属性名等于字段名可省略这个注解

 3.2 mapper接口类

 3.2.1 接口要继承BaseMapper<T>:泛型不可少,根据泛型查找其中的的表名、属性、注解

 3.3 业务执行类

 3.3.1 创建pojo类对象,并填入要进行操作的字段的属性值。

 3.3.2 使用注入的mybatis-plus管理的mapper接口对象,调取其内置的进行数据库操作的方法,将创建的pojo类对象作为参数提供给他操作。

 3.3.3 MP根据不为null的属性进行业务操作

3.4 条件构造器queryWrapper、updateWrapper

3.4.1 使用方法:   作为参数加入sql方法中即可

3.4.2可以自动拼接where

   queryWrapper:字段名=value    直接使用queryWrapper(值)

                 字段名>value    .gt(字段,值)

                 字段名<value    .lt(字段,值)

                 字段名>=value   .ge(字段,值)

                 字段名<=value   .le(字段,值)

                 字段名in (v1,v2,v3 )  .in(字段,包含值的数组) .in等同于selectBatchIds

3.4.3还可以默认使用and   :

     queryWrapper<user>: 使用泛型可使用其中的链式加载

          queryWrapper.gt(age,值).like(name,乔) //查找大于age and name like %乔%

3.4.4 动态查询,内容是true或false

        queryWrapper(true,值) //true就查询

        queryWrapper(false,值) //false就不查询

      boolean nameFlag = StringUtils.hasLength(name);//判断串是否空串或是否存在    

3.4.5 只查询主键

      List  list1 = userMapper.selectObjs(判断条件);// list1为只包含主键的集合

3.4.6 updater更新操作

     根据ID更新 ,方法中只用传入带ID的对象就可

     根据其他字段,则使用update(user1, updateWrapper).//updateWrapper为构造器

3.5 @TableField注解

 3.5.1 使用

     https://i-blog.csdnimg.cn/blog_migrate/34408b0374cfeee58a6dac03c916d062.png

3.6@RestControllerAdvice

本注解统一管理异常:

实现Spring的IOC(把这这个类的对象交给Spring管理),通知Springboot框架,该类是全局异常处理类。

     @RestControllerAdvice

public class SystemException {

     /*如果后端服务器报错,发生运行时异常,则对报错内容返回一个SysResult.fail对象给抛出异常的Controller*/

    @ExceptionHandler(value = RuntimeException.class)

    public SysResult fail(Exception e){

        e.printStackTrace();

        return SysResult.fail();

    }

}

3.7通过配置类指定数据库类型

@Configuration

public class MybatisConfig {

    @Bean

    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();

        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MARIADB));

        return  interceptor;

}  }

3.8配置自动填充类

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

//metaObject: 指定默认的规则

//加入@Component注解后MP根据实现类,自动注入,自动调用

    @Override

    public void insertFill(MetaObject metaObject) {

        Date date=new Date();

//在这两个属性上添加@TableField()注解时,自动填充时间, metaObject为注解内时机或规则

        this.setFieldValByName("created", date,metaObject);

        this.setFieldValByName("updated", date,metaObject);

    }

    @Override

public void updateFill(MetaObject metaObject) {

//在这个属性上添加@TableField()注解时,自动填充时间, metaObject为注解内时机或规则

        this.setFieldValByName("updated", new Date(),metaObject);

    }

}

3.9商品图片上传

后端服务器获取前端信息步骤:

3.9.1.获取文件名

    String filename = file.getOriginalFilename();

3.9.2.准备磁盘地址

    String dirPath = "E:/third/pictures/";

3.9.3.创建路径对象

    File dirFile = new File(dirPath);

3.9.4.判断这个路径对象是否存在

    if(!dirFile.exists()){

3.9.5.如果不存在就创建这个路径对象

        dirFile.mkdirs();

    }

3.9.6.拼接包含文件名的全路径名

    String allPath = filename+dirPath;

3.9.7.封装全路径对象

    File allFile = new File(allPath);

3.9.8.实现文件上传 将IO流按照指定对象格式进行输出,MultipartFile提供了方法

file.transferTo(allFile);

3.10商品图片上传案例

3. 10.1 使用正则表达式校验图片:

正则表达式:一种特殊格式的字符串,校验文本信息

匹配不确定出现次数:/、^、$、*、?、+

匹配固定出现次数:{n}、{n,}、{n,m}、.

匹配取值区间:[abc]  abc三选一

3. 10.2校验是否为恶意程序:(判断是否具有宽高)

    获取height、width值,看是否存在

            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());

            int height= bufferedImage.getHeight();

            int width = bufferedImage.getWidth();

3.10.3 按时间生成目录

Date date = new Date();

       String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(date);

       // 创建文件按时间分的图片目录路径

       String   dateDirPath =localPath+dateDir;

//目录对象化,如果不存在就创建一个

        File dirFile = new File(dateDirPath);

if(!dirFile.exists()){

        dirFile.mkdirs();

}

3.10.4 生成uuid做图片名

String uuid = UUID.randomUUID().toString().replace("-","");

3.10.5 获取文件类型

//根据最后一个点的位置开始截取字符串(.jpg)

 String fileTpe = filename.substring(filename.lastIndexOf("."));

 3.10.6拼接成新的完整文件名

  String newFileName=uuid+fileTpe;

  //拼接生成完成路径

 String path=dateDirPath+newFileName;

  //将文件上传

            file.transferTo(new File(path));

3.11 属性动态赋值

3.11.1  先在properties配置文件中配置URL地址

3.11.2  在使用类上添加@PropertySource(“配置文件路径”

3.11.3 在使用的属性上添加@Value("${配置文件中的属性名}")

考题:mybatis-plus

   内置的BaseMapper提供的insert新增方法一个,update修改方法两个

SpringBoot开箱即用原理(面试问题)

linux命令: service NetworkManager stop : 网卡关闭

         chkconfig NetworManager off:  网卡永久关闭

       

  • 项目整合ssm

1. 项目结构及变化:

  1. 创建项目时最好同时点选mybatis(或者mybatis-plus)、springboot、mysql、springMVC
  2. 不再创建mybatis的mybatis-config.xml配置文件,内容已经被整合进了Springboot 的application.properties或application.yml配置文件。
  3. 接口上加@Mapper 交给Springboot管理,会根据Class类型动态创建代理对象和数据库链接的步骤,我们只用使用映射就行
  4. 启动类上加@MapperScan("接口路径")按指定路径扫描mapper接口对象,创造实现类
  5. 使用@Autowired 注入Springboot管理的接口的实现类

2.扩展内容(Springboot创建的代理对象):

2.1 JDK动态代理:

  1. 被代理者必须有接口
  2. 默认条件下,如果有接口,就使用JDK代理

2.2 CGLIB动态代理:

  1. 无论被代理者是否有接口,都可以为其创建代理对象
  2. 代理对象是目标对象的子类。
  3. spring5以后自身接口对象创建代理对象时使用CGLIB动态代理
  4. CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。
  5. CGLib 的底层是Java字节码操作框架 —— ASM。
  1. SSM框架案例

用户需求:

用户访问URL: http://localhost:8080/findAll

返回数据要求:Lise<user> json串

思路:

sevice(业务层)注入到Controller(前端控制器),使用对象用于接收前端数据

mapper(映射层)注入到sevice(业务层)的实现类,使用mapper接口实现类对象用于接收传递给数据库的参数,mapper接口

获得数据库数据后原路返回。

步骤:

  1. 创建pojo :实体类,主要是用于实现持久层的数据存储
  2. 搭建mapper层:持久层,也叫DAO层,数据库进行数据持久化操作
  3. 搭建services层:业务层,创建service接口,创建接口的实现类,实现业务逻辑
  4. 搭建Controller层:控制层,用于接收前端发来的请求,和向前端返回响应
  5. 搭建config层:配置异常、指定数据库类型、配置自动填充类等
  6. 搭建VO层:主要用于逻辑层和表示层之间数据处理封装,封装前端需要的数据
  1. restFul参数传递

业务需求:修改id=1的数据 name=“黑熊精”  age=3000  sex=男

作业:模糊查询:http://localhost:8080//findUserByLike?name =乔 返回list集合

                如果sql语句使用注解开发,需要转义符号:\”%\”乔\”%\”

      批量查询:http://localhost:8080//findUserByIds?ids=1,3,5,7返回list集合

                传入的是String串,所以要char[] charArray = ids.toCharArray(); 转成数组。

      实现用户新增:http://localhost:8080//saveUser/悟空/8000/男/ 返回成功的提示

               使用restFul形式成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值