概述
路线: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 CloudSpring 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整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复