- 什么是Hash碰撞?
- 由不同数据产生相同的Hash结果,叫做hash碰撞,根本原因在于Hash的长度位数过小,而数据过多,出现了重复的现象.
- Maven是跨平台项目管理工具,它最大的核心就是管理Jar包:下载,保存,编译,更新;省去我们自己下载管理jar包
- 仓库:
- 远程仓库/中央仓库: 本质山就是一个国外的网址
- 镜像仓库: 就是一个国内的网址,已经帮你下载好了jar包(华为云,阿里云)
- 本地仓库: 就是一个你自己创建的文件夹,存放下载好的jar包的
- 坐标: 存放jar包的路径(在本地仓库中进行标识,项目打包后有一个具体位置)
- 依赖: Ajar包可能会依赖着好多jar包,maven都会管理所有jar包
-
解压maven压缩包,找到settings.xml文件,需要改两处(本地仓库+镜像仓库)
-
用记事本打开settings.xml,找到
标签 -
配置本地仓库路径
D:Javamavenresp -
配置完成后,向下翻,找到
标签 -
配置远程仓库地址
ali ali Maven * https://maven.aliyun.com/repository/public/
- 找到Maven: 点击File–> Settings–> Build,execution…–> Build Tools–> Maven – 配置最后三行
- 找到Maven home directory 配置maven的解压文件的路径
- 找到User settings file 配置settings.xml文件的路径
- 在dependencies添加jar包,jdbc的坐标,groupId是组id,artifactId是项目id,version是jar包的版本
- 默认条件下 jar包
- web项目可以打成 war包
- 如果该项目是父级项目,需要被其他项目依赖时, 则写 pom
-
通过
pom 标识,表示是一个父级 -
标签,表示排除一些指定的配置. -
如果项目中依赖第三方jar报错,根据第三方的坐标,查找到本地仓库的位置,之后删除重新下载
-
思想:“开箱即用”!!!(Springboot的设计核心 简化!):只需要引入jar包,简单的配置即可以使用该功能
-
Maven项目中的jar包是有依赖传递性的
-
什么是启动项?
SpringBoot为整合第三方框架,写了启动项的jar包文件,其中官方已经将所有的配置信息/需要依赖的jar包文件提前测试并且定义
-
maven依赖传递性实现原理:
步骤:
- 当maven开始解析项目的POM.xml文件时,根据依赖的坐标,找到指定的jar包文件.之后添加该依赖.
- 之后扫描当前文件中的 xxx.pom文件.
- 扫描pom.xml文件中的依赖信息dependency
- 根据dependency的坐标 重复执行上述的操作.直到所有的依赖都添加完成.
二.SpringBoot (一).概述4.0.0 com.jt springboot_demo01 0.0.1-SNAPSHOT springboot_demo01 Demo project for Spring Boot 1.8 UTF-8 UTF-8 2.4.1 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8 UTF-8 org.springframework.boot spring-boot-maven-plugin 2.4.1 com.jt.SpringbootDemo01Application repackage repackage
- Spring Boot是用来简化新Spring应用的初始搭建以及开发过程,它可以跟各种技术集成。
- 简化了Maven的操作(用啥jar包就添加一个jar包的坐标)
- 内嵌了Tomcat服务器,可以访问服务器里的程序
(二).特点
- 创建独立的Spring应用程序
- 嵌入的Tomcat,无需部署WAR文件
- 简化Maven配置
- 自动配置Spring
- 提供生产就绪型功能,如指标,健康检查和外部配置
-
@SpringBootApplication注解: 表示自己是一个启动类,用来启动服务器
-
@Value注解: 从yml文件读取配置,给属性赋值
- @Value("${mysql.username}") String username;
- ${key} Spring提供的springel表达式 简称为:spel表达式
- 语法: 从spring容器内部获取key,动态为属性赋值.
-
pro文件说明
# 1.pro文件语法 # 数据结构类型: key=value 特别注意不要有空格. # 字符集编码: 程序读取文件时,默认采用ISO-8859-1编码 # 弊端: 所有的key都必须写完整,不能缩进
-
YML文件说明
# YML文件的语法 # 1.数据结构 key-value结构 # 2.写法: key:(空格)value # 3.层级代码结构,注意缩进 # 4.字符集 文件读取时,默认采用UTF-8编码 可以写中文 server: port: 8080
-
采用—的方式实现环境分割
#指定环境的默认配置 spring: profiles: active: dev --- #为环境定义名称 server: port: 8080 spring: config: activate: on-profile: dev # 采用---的方式实现环境分割 --- server: port: 9000 spring: config: activate: on-profile: prod
- 实体对象要求:
- 类名一般与表名关联
- 属性名称一般与字段关联
- pojo中的属性类型必须为引用类型(包装类型)
- 实体对象必须有get/set方法
- 一般实体对象需要实现序列化接口(规定)
原因:数据可能跨平台(跨服务器)传输,必须序列化
- lombok可以为POJO实体对象,动态的生成get/set/toString/hashcode/equals等方法.无需程序员手动编辑.
- SpringMVC是Spring框架的明星产品,利用MVC设计套路实现的一种框架产品,用来 接受浏览器发来的请求并返回数据,他主要解决了VC之间的交互问题.(接收请求处理响应)
- 遵循MVC思想: 主要是想要松耦合,实现代码间的高内聚, 提高代码的可维护性
- M 是Model, 模型层, 用来封装数据
- V 是View, 视图层, 用来展示数据
- C 是Controller, 控制层 作用就是用来 接受请求和给出响应
- MVC思想:把不同的代码,放在不同的业务逻辑中,进行分层的结构,让代码实现松耦合,如果某一个模块发生变化,应该尽量做到不影响其他两个模块。提高代码的可读性,实现程序间的松耦合、提高代码复用性。
-
SpringMVC核心执行流程图:用户在浏览器发起请求,首先DispatcherServlet前端控制器接收请求,而后将请求交给HandlerMapping(处理器映射器),处理器映射器拿到请求后进行解析用户想要访问的是哪一个类或方法,得到类名方法名,而后将类名方法名交给HandlerAdaptor(处理器适配器),找到对应的Controller来执行, Controller执行我们写的Model具体的业务,返回ModelAndView处理结果,然后这个处理结果通过DispatcherServlet前端控制器找到具体的ViewResolver视图解析器,而后对视图进行处理,再把视图结果生成的html发给用户,用户就看到请求结果了.
-
SpringMVC流程图
-
五个核心的组件
- 前端控制器DispatcherServlet: 接受请求并分发请求
- 处理器映射器HandlerMapping: 根据请求,找到具体能处理请求的类名,方法名(用于配置请求路径与Controller组件的对应关系)
- 处理器适配器HandlerAdapter: 正式开始调用方法处理请求,并返回结果
- 视图解析器ViewResolver: 把页面找到,把数据进行解析(可根据视图名称确定需要使用的视图组件)
- 视图渲染View: 具体展示数据并返回给浏览器
- @RestController注解: 表示可以被浏览器访问,只能在类上使用(
- @Controller将该类交给Spring容器管理
- SpringMVC负责调用该对象接收用户的请求.
- 将业务处理之后的结果,为页面返回JSON数据
- @ResponseBody作用: 将数据转化为JSON串)
- @Controller注解: 标注的类为控制层类,可被浏览器访问(表示将该类交给Spring容器管理)(这个注解是Spring提供的)
- @ResponseBody注解: 业务返回值时,将数据转化为JSON (响应一个body实体,将响应的实体转化为JSON串)
- @RequestMapping注解: 规定了浏览器访问的方式(可以在类上,方法上使用)
- @GetMapping注解: 详细规定了只获取get请求的参数
- @PostMapping注解: 接收post请求,获取参数
- @PathVariable注解: 使用restful方式请求参数时,利用该注解获取参数
- @RequestBody注解 : 将JSON串转换成对象(使用Post请求时在参数上添加)
- 数据提交方式总共有8种(常用的有Get,Post,RestFul)
- get方式
- 把数据用?拼接在地址栏中,多数据之间用& 连接 :http://localhost:8080/car/add?id=10
- 参数类型必须和请求的参数类型一致
- 参数名称必须和请求的参数名称一致
- 参数类型推荐使用引用类型,可以规避异常的发生
- SpringMVC可以接受请求,并解析请求参数
只要在方法的参数列表中声明就可以:public void add(int id,String name) - 参数列表可以提供一个对象,框架可以解析参数,并且可以把参数直接给对象的属性赋值
public void save2(Car c) - 方法里的参数列表就是用来解析url参数的
- pojo类里只有属性和set() get()
- 在日期属性上使用@DateTimeFormat(pattern=“yyyy-MM-dd”)注解
- 数据库里没有数组类型,获取数组类型的数据传输到数据库时要使用Arrays.toString()转为String类型
- 简单参数传值: 利用MVC可以直接将参数写到方法中,可以直接获取.
- 对象接收数据: 如果用户传递的数据有多个, 则可以使用对象接收.如果使用对象的方式进行接收,则必须有Setxx方法.
- 对象的引用赋值: 如果前端出现了同名提交的参数问题.则直接影响后台数据接收.所以前端参数要求不能出现重名属性.
解决方案: 利用对象的引用赋值.
- 网页中报500错误: 表示后端业务抛出异常
- 网页中报404错误: 表示找不到访问的地址
- 网页中报400错误: 表示访问时参数类型不匹配
- 网页中报504错误: 表示访问请求超时
- 网页中报405错误: 表示请求类型错误
-
用户url编辑
- 参数与参数之间使用/分割.
- restFul结构顺序一旦确定,不能随意更改
- 如果使用restFul结构,请求路径中不能出现动词.隐藏目的.
-
用户规范:由于restFul结构请求路径都是名词,所以不能区分业务逻辑.所以采用请求类型,严格区分业务需求.
- GET 查询操作
- POST 新增操作/form表单提交
- PUT 修改操作
- DELETe 删除操作
-
参数接收
- 参数与参数之间使用/分割.
- 参数必须使用{xxx}包裹
- 使用特定的注解@PathVariable(“name”) String name 接收参数
- 如果接收参数的名称与对象中的属性名称一致,则可以使用对象接收
-
Spring框架概述: Spring是一个分层的,开源的,轻量级的Java 开发框架,它的核心是(IOC)控制反转,DI : 依赖注入,以及支持(AOP)面向切面编程,Spring类似一个粘合剂可以整合多种技术形成一个强大的企业级的应用框架
-
Spring框架核心功能IOC/DI主要解决了创建对象和管理对象的问题,它的优点在于可以实现解耦,降低组件之间的耦合度
-
IOC : 底层是Map结构,Map
,)是指把创建对象的权利交给spring -
DI : 依赖注入, 是指把有依赖关系的对象也同时new出来
-
Spring中对象作用域分为:
- 单例(默认为单例) : 单例对象可以节省内存和时间
- 原型(prototype) : 多例对象
-
Spring的核心模块
模块 说明 核心容器Spring Core 核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring上下文Spring Context Spring上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。Spring AOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 Spring ORM Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 Spring Web Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以Spring 框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC框架 MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
-
IOC概念 : IOC底层是Map结构,Map
,)是指将对象创建的权利交给Spring容器管理,由Spring容器管理对象的生命周期 -
控制反转的概念:
- 主动控制:光头强直接使用电锯砍树
- 控制反转:举个例子: 动画片熊大熊二中,李老板把(控制)电锯交给光头强,让光头强砍树.
-
IOC的xml方式
- 创建xml文件,在文件中的
标签里创建 , - 在测试类中创建new ClassPathXmlApplicationContext( “配置文件的路径(例如:spring-config.xml)”),表示读取配置文件
- 通过getBean(“bean的id”)获取创建好的对象
- Spring是通过反射创建对象的:Class.forName(“类的全路径”).newInstance()
- 创建xml文件,在文件中的
-
IOC的注解方式
- 在需要创建对象的类上使用@Controller注解
- 在xml文件中添加包扫描
- 在测试类中创建new ClassPathXmlApplicationContext( “配置文件的路径(例如:spring-config.xml)”),表示读取配置文件
- 通过getBean(“bean的id”)获取创建好的对象
- DI概念 :
- 依赖注入,创建对象时,如果该对象中有需要依赖的属性,Spring负责为属性赋值. (是指把有依赖关系的对象也同时new出来)
- 什么是依赖注入 : (我们需要用的叫依赖,别人给我们的叫注入)
- 比如 : 汽车需要汽油才能跑起来,汽车依赖汽油,汽油注入汽车,汽车才能运行.
- 又比如 : 光头强需要用电锯去砍树,光头强依赖于电锯,电锯是李老板给的,也可以说李老板将电锯注入给光头强,光头强去砍树.
- 创建两个类A和B,将A类当做B类的属性.维护两个对象间的依赖关系
- 本质上是将两个对象创建好,然后进行set,绑定了两个对象间的关系
- 使用@Autowired注解完成DI
- 依赖注入的都是接口,而不是接口实现类:为了面向接口编程,为了体现接口的通用性灵活性扩展性,
-
AOP概念
-
AOP的好处:让程序员更加关注业务本身,把通用的代码形成切面
-
核心AOP概念
- 连接点join point:程序执行过程中的一个点,例如方法的调用或抛出异常
- 切入点point cut:选择一个或多个连接点的表达式
- Advice:在选择的每个连接点执行的代码(5种方式前,后,返回值,异常,前或后)
- 切面aspect: 一个囊括了切入点和Advice的模块. 切面其实就是一个类, 要用@Aspect注解
- 编织:将切面与主要代码进行结合的技术
-
通知(Advice)
- 前置Advice:
- 使用@Before注解,在调用目标方法前执行前置通知,如果Advice抛出异常,则目标不会被调用,这是前置Advice的有效用法
- 使用场景:权限判断,查看是否有缓存,增删改之前开启事务,记录日志
- 返回之后Advice
- 使用@AfterReturning 在目标方法返回 返回值的时候执行
- 使用场景:关闭事物,关流释放资源,记录日志
- 抛出异常之后Advice
- 使用@AfterThrowing 抛出正确类型的异常时才会调用
- 使用场景: 开关事物,性能的测试(比如统计一个方法的耗时)
- 环绕Advice
使用@Around Around能阻止异常传播 - 后置Advice
使用@After
- 前置Advice:
-
切点表达式:execution(<方法模式>)
- 方法模式: [修饰符] 返回值类型 [类的类型(包,类)]方法名称(参数列表) [throws 异常类型]
- 例如 : execution(* cn.tedu.*.*(…))
-
创建切面测试
package cn.tedu.service; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect //切面:通知 + 切点 public class Timer { //2,切点表达式,通过execution属性声明 / @Test public void demo1() throws IOException { String resource="mybatis\mybaits-config.xml"; //通过IO流 加载指定的配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //动态生成SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession 类比 数据库链接 SqlSession sqlSession=sqlSessionFactory.openSession(); //获取Mapper接口 DemoUserMapper demoUserMapper=sqlSession.getMapper(DemoUserMapper.class); //获取数据 ListuserList=demoUserMapper.findAll(); System.out.println(userList); //关闭链接 sqlSession.close(); } }
(八).Mybatis参数相关说明
-
如果参数采用对象封装,则可以使用#{属性}取值.
-
如果参数有多个,可以封装为map实现参数的传递. 可以利用#{key}获取数据
-
也可以使用@Param将多个参数封装为map, 利用#{key}的方式获取数据
-
如果不能使用对象封装,则一般使用Map集合
-
如果遇到相同的多个数据,则一般采用集合的方式封装数据.封装方式:(array,list,map
- )
-
形参/实参 参数传递的是值,和名称无关.
-
resultMap的简化 当开启驼峰映射规则时,可以自动映射,则使用
resultType即可. -
如果mybatis传递的参数只有一个,则mybatis是利用下标取值.
所以名称任意 #{xxxx},但是一般需要注意开发规范 -
关于模糊查询:使用%号需要使用" "号包裹
-
mybatis的xml文件的配置是有顺序的
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
-
mybatis中的sql 最好小写,因为不同的系统对大小写的区分不同.(Ctrl+Shift+u 大小写转换快捷键)
-
mybatis中的"更新"操作,默认事物都是开启的,如果进行更新操作,必须提交事务
-
mybatis中执行"更新"操作时,自动返回影响的行数,所以xml映射文件中不需要写resultType属性
-
代码参考:
@Test public void testFindBySA(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); //编程习惯: 面向对象 DemoUser user = new DemoUser(); user.setAge(18).setSex("女"); Listlist = demoUserMapper.findBySA(user); System.out.println(list); sqlSession.close(); } @Test public void testFindBySA2(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); String sex = "女"; int age = 18; List list = demoUserMapper.findBySA2(sex,age); System.out.println(list); sqlSession.close(); } @Test public void testFindBySA3(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); Map map = new HashMap<>(); map.put("sex","女"); map.put("age",18); List list = demoUserMapper.findBySA3(map); System.out.println(list); sqlSession.close(); } @Test public void testSelect01(){ //sqlSessionFactory.openSession(true);//自动提交事务 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); HashMap - 使用#{} 获取数据时,默认有预编译的效果.防止sql注入攻击.
- mybatis使用#{}获取数据时,默认为数据添加一对""号.
- 当以字段名称为参数时,一般使用${},但是这样的sql慎用. 可能出现sql注入攻击问题.
- 一般条件下能用#{}号,不用${}
- xml文件中的转义字符.
> > 大于
< < 小于
& & 号
说明:如果sql中有大量的转义字符 建议使用转义标签体
语法: - 实现别名配置
- 简化Sql标签
- 简化Sql标签的优缺点
- 优势:
- 使用Sql标签可以节省xml的文件大小.
- 代码的结构相对简单.
- 弊端:
- Sql只能抽取公共的Sql语句,局限性稍大.
- 如果大量的使用Sql标签,则代码的可读性差
- 优势:
- 动态Sql中的 if 标签和 where 标签(用户任意选择条件查询)
- 动态Sql中的Set标签(用户更新操作传参时)
- 动态Sql中的 choose ,when , otherwise标签(根据条件实现数据的查询. 如果存在name则按照name查询,否则按照sex查询.)
- resultType说明:
当结果集中的字段名称,如果与属性的名称一致时,才会实现自动的数据封装 - resultMap说明:
当结果集中的字段名称,与对象中的属性不一致时,可以使用resultMap实现自定义的封装 -
规则: 如果对一 则使用对象封装.
如果对多 则使用List集合封装 -
Mybatis中使用resultMap的注意事项
-
如果映射的字段与对象的属性一致,则可以省略不写.
-
最好保留主键的字段信息.
-
如果需要封装单个对象则使用association标签
- property 代表封装对象的属性
- javaType 指定属性的类型 注意路径
-
如果遇到关联封装,必须全部配置映射关系. 如果属性与字段名称一致则可以使用autoMapping="true"实现自动映射
-
-
关联查询: 通过大量的sql语句 实现数据的关联查询. 其中Sql语句相对复杂. 但是数据封装简单.
-
子查询: 可以通过子查询的方式实现复杂的数据封装. 其中Sql几乎都是单表查询,Sql简单, 但是数据封装复杂.
-
子查询的说明
- column=“子查询的字段信息”
- select= “sql的ID” 作用:根据column中的数据 实现子查询!!!
-
关联封装代码(一对一)
- 关联封装代码(一对多)
- 在mybatis映射数据时,经常出现字段名称与属性名称不一致的现象. 但是其中一部分可以采用驼峰规则的方式完成自动映射. 所以有如下的配置.
-
什么是缓存机制:引入缓存可以有效降低用户访问物理设备的频次.提高用户响应速度.
- mybatis自身缓存 一级缓存/二级缓存
- Redis缓存 读取10万次/秒, 写 8.6万次/秒
-
一级缓存:Mybatis默认开启一级缓存, 一级缓存可以在同一个SqlSession对象中查询相同的数据,可以实现数据的共享(缓存操作).
-
二级缓存:二级缓存mybatis中默认也是开启的.但是需要手动标识(在xml文件中添加
标签). 二级缓存可以在同一个SqlSessionFactory内部有效. -
使用二级缓存时为什么要先将一级缓存关闭?
sqlSession查询数据之后,会将缓存信息保存到一级缓存中.但是不会立即将缓存交给二级缓存保管.如果需要使用二级缓存,则必须将sqlSession业务逻辑执行成功之后关闭.
-
Mybatis的xml核心配置文件汇总代码
-
JDK动态代理
特点:
1.要求被代理者必须实现(有)接口.
2.JDK代理是jdk默认提供的.CGLIB动态代理
特点:
1.不管被代理者是否有接口,都可以为其创建代理对象. 代理对象是目标对象的子类.
2.cglib需要手动导入jar包
3.spring为了创建代理对象方便,自身自动添加cglib依赖项. -
Mapper接口说明
- @PropertySource注解: 指定配置文件交给Spring容器管理(语法:遇到Source就写classpath:/文件名)
- @Data注解: 动态生成get/set/toString/equals等方法(这个注解是由lambook提供的)
- @Accessors(chain = true)注解: 开启链式加载 重写set方法(这个注解是由lambook提供的)
- @NoArgsConstructor注解: 无参构造(这个注解是由lambook提供的)
- @AllArgsConstructor注解: 有参构造(这个注解是由lambook提供的)
- @BeforeEach注解: 测试API中的注解,在执行@Test注解方法时,会提前执行(先执行被@BeforeEach注解的方法,再执行@Test注解的方法).
- @Param注解: 多值传参时可以利用@Param注解将参数封装为Map
- @Alias()注解: 给标注的类起个别名
- 创建项目
- 选择springBoot版本
- 编辑pom.xml文件
- 编辑User的POJO
- 编辑Mapper接口
- 编辑xml映射文件
- 编辑UserService接口
- 编辑ServiceImpl实现类
- 编辑Controller
- 编辑核心配置-application.yml
- @Mapper注解 : 将该注解标注的接口交给Spring容器管理
- @MapperScan注解 : 将该注解标注在启动类上,根据包扫描路径 扫描全部的mapper接口文件
- 编译时异常和运行时异常
- ClassCastException : 类类型转换异常
- NoSuchBeanDefinitionException : 没有对应的bean定义异常
- SQLNonTransientConnectionException : 数据库连接异常
- 检查数据源链接地址
- 检查数据库用户名和密码
- BindingException : 异常
- 检查namespace命名是否与接口一致
- 检查xml映射文件中的ID是否与接口方法一致.
- 检查mybatis核心文件加载mapper映射文件的路径是否正确.
- 问题可能是xml映射文件中的resultType的类型异常.
- ClassNotFoundException : 找不到类异常
delete from demo_user where id in (
#{id}
)
(十二).Mybatis中xml配置别名包
select id,name,age,sex from demo_user
update demo_user
name = #{name},
age = #{age},
sex = #{sex}
where
id = #{id}
(十三).Mybatis中ResultType与ResultMap
(十四).Mybatis中关联关系
SELECT d.dept_id,d.dept_name,e.id,e.name,e.age FROM dept d LEFT JOIN emp e ON d.dept_id = e.dept_id
(十五).Mybatis中的缓存机制
(十六).代理对象说明
@Test
public void testFindDeptById(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
System.out.println(deptMapper.getClass());
int id = 100;
Dept dept = deptMapper.findDeptById(id);
System.out.println(dept);
sqlSession.close();
}
(十七).Mybatis常用的注解
#语法: 1.key:(空格)value结构
server:
port: 8090
#整合数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#SpringBoot整合mybatis
mybatis:
#指定别名包
type-aliases-package: com.jt.pojo
#加载指定的xml映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
(五).SSM项目整合常用注解



