我是靠谱客的博主 拉长冰淇淋,最近开发中收集的这篇文章主要介绍MyBatis -- Spring -- SpringMVC整理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

路线:MyBatis – Spring – SpringMVC

原笔记地址:http://dwz.date/ac27

博客:狂神说 文章 - KuangStudy-代码笔记

what:

MyBatis:主要针对DAO层使用
Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
GitHub : https://github.com/mybatis/mybatis-3
what:
MyBatis 是一款优秀的持久层框架(面向mysql)
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github .
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射

why:

MyBatis的作用就是帮助管理在数据库中存取数据的。
优点:灵活,可维护性更高(解耦),支持动态SQL开发,快捷,快发效率高

持久化:指将程序数据在持久状态和瞬时状态转换的机制
例子:内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。猪肉冷藏

  • why:因为内存一断电,数据就会丢失,且内存相比磁盘等较贵。

持久层:完成持久化工作的代码块——》DAO层

  • 持久化的实现过程则大多通过各种关系数据库来完成。(了解)

how:

1.导入jar包:mybatis和mysql-connector-java
2.编写核心配置文件:mybatis-Config.xml
3.编写MyBatis工具类:MybatisUtils
4.编写实体类
5.编写Mapper接口和对应的Mapper.xml
6.在mybatis核心配置文件中注册Mapper(Mapper接口或Mapper.xml)
7.测试。。。。

主要知识点:
、、、标签:
参数:
id:对应着要执行的方法名
parameterType:参数类型
resultType:结果类型
使用万能的Map传参:在接口方法中,参数直接传递Map;
模糊查询:select * from user where name like #{value}(在java代码中添加通配符——%value%)
常用的标签;configuration(配置)、settings(设置)、typeAliases(类型别名)、environments(环境配置)、environment(环境变量)、transactionManager(事 务管理器)、dataSource(数据源)、mappers(映射器)————》注意元素节点的顺序!顺序不对会报错
注册Mapper的常用方式:

  • how:

     		使用class="接口地址"    使用name="Mapper接口和xml文件包名"    使用resource="Mapper.xml文件地址" 
     		注意:前两种限制:Mapper接口Mapper.xml文件同名同包
     properties优化:数据库这些属性可以由外部文件引入。
     typeAliases优化:给实体类起别名,减少类完全限定名的冗余
     setting:配置日志(标准日志和log4j日志)、开启驼峰命名(解决字段和属性名不同问题)、开启二级缓存
     ResultMap和分页:
     	1.解决属性名和字段名不一致问题:①在sql语句中给字段名起别名②使用结果集映射ResultMap(推荐)
     	2.ResultMap针对查询结果映射处理——》ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
     	3.日志:
     		标准日志:
     		Log4j日志:
     			what::通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件....
     			why:过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。可以选择生成了一个日志的文件
     			how:1.导入log4j扎包   2.编写log4j.properties配置文件    3.在核心配置文件setting标签开启log4j    4.测试
     	4.分页:
     		1.使用limit实现分页:select * from user limit startIndex,PageSize  (起始位置 =  (当前页面 - 1 ) * 页面大小)
     		2.使用PageHelper插件(一款实现偷懒的分页工具)https://pagehelper.github.io/
     	5.使用注解开发:四个注解对应四种sql语句,使用注解可以不用编写Mapper.xml@select ()@update ()@Insert ()@delete ()
     		注解原理:jvm的动态代理
     		
     		mybatis执行具体流程:
     		
     		@Param:方法形参注解,作用可以给参数起别名(建议使用)。
     		#{}与${}的使用:
     			#{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
     			${} 的作用是直接进行字符串替换
     	6.一对多和多对一:(多练,方法选其一)
     		多对一:1、关联-association
     			实例:多个学生关联一个老师。需求:查询出学生对应的老师
     			实例连接:狂神说MyBatis05:一对多和多对一处理 (qq.com)
     		一对多:2、集合-collection
     			实例:一个老师包含多个学生。需求:查询出老师下的学生
     			实例连接:狂神说MyBatis05:一对多和多对一处理 (qq.com)
     		3、所以association是用于一对一和多对一,而collection是用于一对多的关系
     		4、JavaType和ofType都是用来指定对象类型的
     			JavaType是用来指定pojo中属性的类型
     			ofType指定的是映射到list集合属性中pojo的类型。
     		**注意:**
     			1、保证SQL的可读性,尽量通俗易懂
     			2、根据实际要求,尽量编写性能更高的SQL语句
     			3、注意属性名和字段不一致的问题
     			4、注意一对多和多对一 中:字段和属性对应的问题
     			5、尽量使用Log4j,通过日志来查看自己的错误
     	7.动态SQL(多练)
     		**what:**
     			什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句.
     			 - if
     			 - choose (when, otherwise)
     			- trim (where, set)
     			- foreach
     			-sql:实现sql代码的复用
     		**why:**
     			如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。
     		**how:**
     			常用标签使用:狂神说MyBatis06:动态SQL (qq.com)
     		other:小结:其实动态 sql 语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 mybatis 动态sql 							对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。
     	8.缓存:
     		**what:**
     			缓存:存在内存中的临时数据
     			使用对象:经常查询并且不经常改变的数据。
     			MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
     				默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
     					一级缓存特点:
     						1.作用域为一次sqlSession开始到关闭
     						2.每个sqlSession中的缓存相互独立
     						3.期间执行了增删改,sqlSession缓存的数据会自动清除
     						4.也可以手动清除sqlSession中的缓存:session.clearCache();//手动清除缓存
     						5.一级缓存就是一个map
     				二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
     					二级缓存的特点:
     						1.作用域:是整个namespace(接口)下的所有方法
     						2.当前会话关闭后,一级缓存的数据转移到二级缓存中保存
     						3.每个mapper中的二级缓存相互独立
     				为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
     					Ehcache是一种广泛使用的java分布式缓存,用于通用缓存;(了解)
     		**why:**
     			将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效						率,解决了高并发系统的性能问题。减少和数据库的交互次数,减少系统开销,提高系统效率。
     		**how:**
     			1.开启全局缓存:<setting name="cacheEnabled" value="true"/>
     			2.在想实现二级缓存的mapper.xml中设置:<cache/>
     		**other:**
     			只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
     			查出的数据都会被默认先放在一级缓存中
     			只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中
     			二级缓存原理图:
    

other:

  • 1.注意Maven静态资源过滤问题。
    2.Mapper.xml中namespace对应着Mapper接口名
    3.所有的增删改操作都需要提交事务! 可以设置自动提交:在MyBatisUtils中设置
    4.接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
    5.有时候根据业务的需求,可以考虑使用map传递参数!
    6.mybatis执行流程 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 SqlSessionFactory 的最佳作用域是应用作用域。 所以 SqlSession 的最佳的作用域是请求或方法作用域。

    7.关于接口的理解 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。 接口的本身反映了系统设计人员对系统的抽象理解。 接口应有两类: 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract
    class); 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
    一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
    8.三个面向区别 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 . 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .
    接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构
    9.使用注解和配置文件协同开发,才是MyBatis的最佳实践!

---------------------------------------------------------------------

Spring主要内容是IOC和AOP

官网 : http://spring.io/
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
what:
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
轻量级:在系统初始化的时候不必加载所有的服务,开启什么服务就用什么服务,为系统节约了资源。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。(核心容器、Spring 上下文(SpringContext)、Spring AOP、Spring DAO、Spring ORM、SpringWeb模块、 SpringMVC框架)

IOC:
	what:
		IOC是一种编程思想,由主动的编程变成被动的接收
		控制反转是一种通过描述(注解或XML)并通过第三方去生产和获取特定对象的方式。实现方式是依赖注入(DI)。
		DI:
			what:
				依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .
				注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .
			
			why:

			how:
				1.创建一个pojo,属性有set()方法
				2.在XML中创建bean,属性注入: <property name="name" value="小明"/>
				3.测试。。。。。
			other:
				注入方式:常量注入(上面就是)
					   bean注入:即bean中注入bean(<property name="address" ref="addr"/>)
					   数组注入、List、Set、Map、NUll、Properties注入
		IOC就是对象由Spring 来创建 , 管理 , 装配 !
		控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
		反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
		依赖注入:通过set()方法注入的.
		Bean的作用域:scope=
				    singleton、prototype、request、session
		
		四个注解@Component、@Service、@Repository、@Controller

	why:

	how:
		1.通过XML文件实现IOC:
			通过无参构造器来创建对象:
				1.首先创建一个java类(有无参构造器,属性的set()方法)
				2.在XML问价种配置该类的bean,并属性注入(bean就是java对象,由Spring创建和管理)<property name="name" value="kuangshen"/>
				3.测试:解析XML配置文件,生成管理相应的bean对象:ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
				  	  调用getBean(beanId)方法,获取指定的java对象。
					  通过对象调用方法。
			通过有参构造器来创建对象:
				1.首先创建一个java类(有参构造器,不需要属性的set()方法)
				2.在XML问价种配置该类的bean,并属性注入(bean就是java对象,由Spring创建和管理) <constructor-arg name="name" value="kuangshen2"/>
				3.测试:解析XML配置文件,生成管理相应的bean对象:ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
				  	  调用getBean(beanId)方法,获取指定的java对象。
					  通过对象调用方法。
		2.通过注解实现IOC:
			1.引入context约束,引入aop的包
			2.使用注解扫描包<context:component-scan base-package="com.kuang.pojo"/>
			3.在指定的包下编写类,增加注解@Component("user")/@Controller/@Service/@Repository
				3.1属性注入:
						如果有set()方法,在set()上加@Value("值")
						如果没有set()方法,在属性上加@Value("值")
				3.2作用域:在类名上加@Scope("prototype")/@Scope("Singleton")
			4.测试。。。。
			other:@Configuration  //代表这是一个配置类
			了解自动装配:
			自动装配Bean:(两种:需要XML配置的和完全注解方式)
				作用:不再手动的在一个bean里引入其他的bean,也避免了在引入时写错
				1.组件扫描
				2.自动装配:
						autowire="byType"//按类型自动装配
						autowire="byName"//按名称自动装配
			完全注解方式自动装配:
				jdk1.5开始支持注解,spring2.5开始全面支持注解。
				1、在spring配置文件中引入context文件头
				2.开启属性注解支持:<context:annotation-config/>,
				3.在属性上使用@Autowired(默认根据类型自动装配)
				

			
	other:在配置文件加载的时候。其中管理的对象都已经初始化了.
AOP:
	what:
		AOP的底层机制就是动态代理。
		代理:静态代理、动态代理
			抽象角色 : 一般使用接口或者抽象类来实现
			真实角色 : 被代理的角色
			代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作 .
			客户  :  使用代理角色来进行一些操作 .
		静态代理:
			优点:公共的业务由代理来完成     缺点:类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 .
		动态代理:
			我们在不改变原来的代码的情况下,实现了对原有功能的增强,这是AOP中最核心的思想
			优点:一个动态代理 , 一般代理某一类业务 , 一个动态代理可以代理多个类,代理的是接口!
			动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理

			基于接口的动态代理----JDK动态代理(核心 : InvocationHandler     和     Proxy两个类)

			基于类的动态代理--cglib

			现在用的比较多的是 javasist 来生成动态代理 . 百度一下javasist

			我们这里使用JDK的原生代码来实现,其余的道理都是一样的!、
		横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 ....

		切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
		通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
		切入点(PointCut):切面通知 执行的 “地点”的定义。
		
	why:
		利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
		Spring中支持5种类型的Advice:前置通知、后置通知、环绕通知、异常抛出通知引介通知
		Spring的Aop就是将公共的业务 (日志 , 安全等) 和领域业务结合起来 , 当执行领域业务时 , 将会把公共业务加进来 . 实现公共业务的重复利用 . 
		
	how:
		使用注解实现
		1.引入:org.aspectj包
		2.编写我们的业务接口和实现类
		3.编写一个注解实现的增强类(@Aspect、@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")、)
		4.在Spring配置文件中,注册bean,并增加支持注解的配置
			<!--第三种方式:注解实现-->
			<bean id="annotationPointcut" class="com.kuang.config.AnnotationPointcut"/>
			<aop:aspectj-autoproxy/>

		以下两种了解:
		自定义类来实现Aop
		1.引入:org.aspectj包
		2.编写我们的业务接口和实现类
		3.写我们的增强类
		4.去spring的配置文件中注册 , 并实现aop切入实现 , 注意导入约束 .
				<!--注册bean-->
				<bean id="userService" class="com.kuang.service.UserServiceImpl"/>
				 <bean id="log" class="com.kuang.log.Log"/>
				 <bean id="afterLog" class="com.kuang.log.AfterLog"/>
				<!--aop的配置-->
				 <aop:config>
  						 <!--切入点 expression:表达式匹配要执行的方法-->
						   <aop:pointcut id="pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
					    <!--执行环绕; advice-ref执行方法 . pointcut-ref切入点-->
 						  <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
						   <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
				  </aop:config>
		5.测试
		自定义类来实现Aop:
		1.引入:org.aspectj包
		2.编写我们的业务接口和实现类
		3.写我们的增强类
		4.去spring的配置文件中注册 , 并实现aop切入实现 , 注意导入约束 .	
			<!--注册bean-->
			<bean id="diy" class="com.kuang.config.DiyPointcut"/>

			<!--aop的配置-->
			<aop:config>
			<!--第二种方式:使用AOP的标签实现-->
			<aop:aspect ref="diy">
   				<aop:pointcut id="diyPonitcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
  				 <aop:before pointcut-ref="diyPonitcut" method="before"/>
 				  <aop:after pointcut-ref="diyPonitcut" method="after"/>
			  </aop:aspect>
			</aop:config>
		5.测试。。。

why:定义bean,创建bean

**how:

  • 1.导入spring框架**
    2.在mvc配置文件扫描包,注册相应的bean
    3.创建对应的bean类 other: Spring Boot与Spring Cloud

    Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务;

    Spring Cloud是基于Spring Boot实现的;

    Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;

    Spring Boot使用了约束优于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置 , Spring
    Cloud很大的一部分是基于Spring Boot来实现,Spring Boot可以离开Spring
    Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。

    SpringBoot在SpringClound中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。

---------------------------------------------------------------------

SpringMVC主要内容:

官网 : http://spring.io/
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
what:

  • 核心:DispatcherServlet [ 调度Servlet ] 设计。:将请求转发到不同的控制器
    使用springMVC配置的三大件:映射器、适配器、视图解析器
    @RequestMapping:映射请求路径(映射url到控制器或处理方法) RestFul代码风格: what: 一种代码风格
    why: 设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
    可以通过不同的请求方式来实现不同的效果!(不同的请求方式:GET、POST、DELETE、PUT) how:
    @RequestMapping("/commit/{p1}/{p2}") @PathVariable
    注解,让方法的形参绑定到url模板变量上 上面两个注解联合使用,可以达到url不用输入参数名,只需要输入参数值即可。
    @RequestMapping(value = “/hello”,method =
    {RequestMethod.POST})(meth属性约束请求类型)
    方法级组合注解:@GetMapping(最多)、@PostMapping、@PutMapping、@DeleteMapping、PathMapping
    跳转处理:3种 ModelAndView ServletAPI:
    req.getRequestDisPatcher().forward(req,resp)请求转发
    resp.sendRedirect():从定向 SpringMVC: 无视图解析器 forward:(请求转发)
    sendRedirect:(重定向) 有视图解析器 return
    ”hello“;//相当于localhost:8080/WEB-INF/file/hello.jsp 数据显示到前端:
    ModelAndView方式 ModelMap方式(继承LinkedMap) Model方式 乱码问题解决:
    SpringMVC自带的乱码过滤器 终极解决方案:使用大神自定义乱码解决类

why:

  • 1.轻量级,简单易学
    2.高效 , 基于请求响应的MVC框架
    3.与Spring兼容性好,无缝结合
    4.约定优于配置
    5.功能强大:RESTful、数据验证、格式化、本地化、主题等
    6.简洁灵活

how:

  • 注解方式:
    1.建mavenweb项目
    2.导jar包(基础的5个:junit5,SpringFramework,servlet,jsp,jstl)
    3.注册servlet(注册DispatcherServlet,拦截器(拦截所有请求))
    4.配置mvc配置文件(扫描包、注解驱动、默认不加载静态配置文件、视图解析器)
    5.编写Controller类(实现接口或注解两种)
    6.注意:需要手动将jar包导入到lib文件夹下 接口方式:
    1.建mavenweb项目
    2.导jar包(基础的5个:junit5,SpringFramework,servlet,jsp,jstl)
    3.注册servlet(注册DispatcherServlet,拦截器(拦截所有请求))
    4.配置mvc配置文件(添加映射器、适配器、注册(Controllerbean)、视图解析器)
    5.编写实现Controller接口的实现类(实现handleRequest( … request,… response)方法)
    6.注意:需要手动将jar包导入到lib文件夹下 other: 所有的地址栏请求默认都会是 HTTP GET 类型的。

最后

以上就是拉长冰淇淋为你收集整理的MyBatis -- Spring -- SpringMVC整理的全部内容,希望文章能够帮你解决MyBatis -- Spring -- SpringMVC整理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部