-
maven(项目构建工具)
1.概述
1.1是什么
Maven是跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,主要服务于基于java平台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。
maven核心:下载jar包 + 存放jar包 + 编译jar包
1.2为什么
改变手动将jar文件复制到lib目录中,并且buildpath的维护方式,设计出一套自动维护jar的体系,已经广泛在软件项目中使用,是软件开发人员必须掌握的技术。
全新的设计体系:创先河的发明pom模型,引入了“仓库”、“依赖”、“坐标”和“命令”。
1.3 pom模型:
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个生命周期:clean、default、site,每个生命周期包含多个阶段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中可直接创建
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开发时,可以选择使用Spring的SpringMVC框架或集成其他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 数据在服务器接受
@RestController:MVC提供的注解,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 的方式,如下图所示:
组成 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:依赖注入的步骤:
- 在注入类中声明一个被注入类的引用对象作为属性。
- 使用@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:切面中遇到调用通知功能的点叫切点。
使用步骤:
- 添加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中小于号小于号成了尖括号:
所以需要使用>代替>号
<代替<号
&代替&号
或者使用转义标签< ! [ 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()。
使用:
- 在对应的mapper映射文件中添加cache标签<mapper> <cache></cache></mapper >
- 关闭一级缓存,既sqlSession.close()。
- 要使用一级/二级缓存,则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 使用
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. 项目结构及变化:
- 创建项目时最好同时点选mybatis(或者mybatis-plus)、springboot、mysql、springMVC
- 不再创建mybatis的mybatis-config.xml配置文件,内容已经被整合进了Springboot 的application.properties或application.yml配置文件。
- 接口上加@Mapper 交给Springboot管理,会根据Class类型动态创建代理对象和数据库链接的步骤,我们只用使用映射就行
- 启动类上加@MapperScan("接口路径")按指定路径扫描mapper接口对象,创造实现类
- 使用@Autowired 注入Springboot管理的接口的实现类
2.扩展内容(Springboot创建的代理对象):
2.1 JDK动态代理:
- 被代理者必须有接口
- 默认条件下,如果有接口,就使用JDK代理
2.2 CGLIB动态代理:
- 无论被代理者是否有接口,都可以为其创建代理对象
- 代理对象是目标对象的子类。
- spring5以后自身接口对象创建代理对象时使用CGLIB动态代理
- CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。
- CGLib 的底层是Java字节码操作框架 —— ASM。
- SSM框架案例
用户需求:
用户访问URL: http://localhost:8080/findAll
返回数据要求:Lise<user> json串
思路:
sevice(业务层)注入到Controller(前端控制器),使用对象用于接收前端数据
mapper(映射层)注入到sevice(业务层)的实现类,使用mapper接口实现类对象用于接收传递给数据库的参数,mapper接口
获得数据库数据后原路返回。
步骤:
- 创建pojo :实体类,主要是用于实现持久层的数据存储。
- 搭建mapper层:持久层,也叫DAO层,数据库进行数据持久化操作。
- 搭建services层:业务层,创建service接口,创建接口的实现类,实现业务逻辑
- 搭建Controller层:控制层,用于接收前端发来的请求,和向前端返回响应
- 搭建config层:配置异常、指定数据库类型、配置自动填充类等
- 搭建VO层:主要用于逻辑层和表示层之间数据处理封装,封装前端需要的数据。
- 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形式成功