路线: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:
复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86使用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框架)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151IOC: 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内容请搜索靠谱客的其他文章。
发表评论 取消回复