介绍: 这是我以前在学校的学框架的笔记希望能帮助到大家 谢谢
Mybatis
MybatisMybatis简介
什么是mybatis?
Mybatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动话的ORM实现。其封装性要低于Hibernate,性能优越,并且小巧,应用也越来越广泛。
Mybatis是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。Mybatis作为持久层框架。其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。这样做能将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL。
Strut2框架:以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的基于MVC设计模式实现的Web应用程序框架
Hibernate框架:是一个优秀的持久化框架,负责简化将对象数据保存到数据库中,或从数据库中读取数据并封装到对象中的工作。Hibernate通过简单的配置和编码即可替代JDBC繁琐的程序代码。Hibernate已经成为当前主流的数据库持久化框架,被广泛实际。
什么是数据持久化?
数据持久化是将内存中的数据转换成存储模型,以及将存储模型转换成内存中的数据模型的统称。Eg:文件的存储、数据的读出等都是数据持久化操作。
什么是ORM?
ORM:(object/Relational mapping)
对象/关系映射是一种持久化技术。它在对对象模型和关系模型数据库之间建立起来对象关系,并且提供了一种机制,通过javaBean对象去操作数据库表中的数据。
ORM在对象模型和关系数据库之间建立了一座桥梁,有了它,程序员就不需要再使用SQL语句操作数据中的表,使用API直接操作javaBean对象就可以实现数据的存储、查询、更改和删除等操作。
Mybatis主要思想
Mybatis作为持久层框架,,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。…
框架技术优势
1.不用再考虑公共问题,框架已经帮我们做好了
2.专心于业务逻辑,保证核心业务逻辑的开发量
3.结构统一,便于学习和维护
4.结构中集成了前人的经验,可以帮助新手写出稳定的、性能优良而且结构优美的高质量程序
Mybatis框架技术
1.是一个应用程序的半成品
2.提供了重用的公共结构
3.按一定规则组织的一组组件
4.DAO层,动态SQL
Mybatis优点
1.与JDBC相比,减少了50%以上的代码量
2.最简单的持久化框架、小巧并简单易学
3.SQL代码从程序代码中彻底分离、可重用
4.提供xml标签,支持编写动态sql
5.提供映射标签,支持对象与数据库的ORM字段关系映射
Mybatis缺点:
1.SQL语句编写工作量大,对开发人员有一定要求
2.SQL语句依赖于数据库,导致数据库移植性差,不能随便更换数据库
Mybatis使用场合:
Mybatis专注于SQL语句,是一个足够灵活的dao层解决方案。对性能要求很高的项目,或者需求变化较多的项目,如互联网,mybatis将是不错的选择。
搭建mybatis环境
1.下载jar包
2.部署jar包…
3.编写mybatis核心配置文件
4.创建实体类(常做持久化对象)
5.创建到dao结构
6.创建sql映射文件
7.编写测试类…
Mybatis操作步骤
书写程序:
1.创建manve工程a,自动生成a的manve文件
在a中写入导入4个jar包org.mybatis、mysql、log4j、junit
2.创建pojo.写实体类,用于数据接收与传递
3.在main的resource中导入Database、log4j
在main的resource中书写核心配置文件mybatis-config.xml
4.书写util类,单例模式,读写核心文件mybatis-config.xml
5.书写dao类,方法类和映射xml(方法类对应的sql语句)
6.测试类:test
7.
8.完结!
SQLSessionFactory
三个基本要素
Mybatis的核心接口和类
SQLSessionFactoryBuilder
1.作用:创建SQLSessionFactory实例
2.最佳作用域:用过即丢,存在方法体内,也就是局部变量
3.获取:根据xml配置文件厚泽configuration类的实例构建该对象
SQLSessionFactory(核心对象)
1.SqlSessionFactory是每个mybatis应用的核心
2.作用:生产SQLSession实例
3.获取:通过SQLSessionFactoryBuilder的build方法获取
4.最佳作用域:Application,即随着应用程序的声明周期一同存在
单例
存在于整个应用程序运行时,并且通过只存在一个对象实例。
解决:通过静态代码块,包装SQLSessionFactory只创建一次。
SQLSession:实例对象
1.作用:用于执行持久化操作的对象,类似于JDBC中的connection。提供了面向数据库执行SQL命令所需的所有方法,可以通过SQLSession实例直接运行已映射的SQL语句。
2.获取:SQLSessionFactory实例对象通过openSession方法获取
3.最佳作用域:request作用域或者方法体作用域
4.注意:每个线程都有知己的SQLSession实例,SQLSession不能被共享,也不是线程安全的。
SqlSession session=Factory.openSession(boolean autoCommit)
系统核心配置文件
Eg:Mybatis-config.xml
Configuration:配置文件的根元素节点。
Properties:通过resource属性从外部指定properties属性文件(database.propertis)
Settings:设置mybatis运行中的一些行为,比如此处设置mybatis的log日志实现log4j, 即使用log4j实现日志功能
Environments:表示配置mybatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但是必须指定其中一个为默认运行环境(通过default设置)
Mappers:作用是告诉mybatis去哪里找sql映射文件的路径(该文件内容是开发者定义的映射SQL语句),整个项目中可以有一个或者多个sql映射文件
Mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resource属性的值标书了SQL映射文件的路径(类资源路径)…
注意: mapper映射文件操作不同的文件,一定需要修改、添加
配置文件中的有顺序,千万不能书写错误
Settings属性:主要是mybatis的一些全部配置属性的设置
NONE:禁止自动匹配
PARTIAL(默认):自动匹配所有属性,有内部嵌套(association,collection)除外
FULL:自动匹配所有属性
Mappers属性:映射器
mapper.xml SQL映射文件
Id:命名空间中唯一的标识符
接口中的方法与映射文件中的sql语句id一一对应
ParameterType
传入SQL语句中的参数类型的完全限定名或者别名
resultType
SQL语句返回值类型的完整类名或别名
注意:支持基础数据类型和复杂数据类型,大小写不明感
参数传递:#{参数名}
Mybatis入参:
单参数入参:java基础数据类型
多参数入参:java实体类或者封装成map形式
注意:数据库字段名与javaBean的属性名一致
重点:方法中的参数名,必须与mapper映射中的#{参数吗}一致
如果数据库的列名和实体类属性名不一样如何解决相对于关系??
在实体类中,定义属性。然后通过映射使用
resultMap:
应用场景: 1.数据库字段信息与对象属性不一致
2.复杂的联合查询,自由控制映射结果
3.ResultType与resultMap区别:两者不能同时存在,本质上都是Map数据结构。
描述如何将结果集映射到java对象中;
定义:一个外部的resultMap的id表示返回结果映射到哪一个resultMap中
使用resultMap如何实现自由灵活的控制映射结果,从而达到只有对关系的属性进行赋值填充?
resultMap自动映射配置前提:字段名和属性名一致。
resultMap的自动映射级别(autoMappingBehavior)
PARTIAL(默认):自动匹配所有属性
以上方法是设置不自动匹配;none禁止自动匹配。Full则为自动映射
…
增删改
Id:定义方法名;parameterType:传入数据类型
insert,delete、update都没有resultType类型
注解:@param
意义:相当于重命名
取值:#{注解名称}。。
总结:
使用resultMap实现高级结果映射
resultMap:为了自由灵活地控制映射结果,达到只对关心的属性进行赋值填充。
Association
复杂的类型关联,一对一
内部嵌套javaBean属性
属性:
Property:映射数据库列的实体对象的属性。注意当数据为不同类型多参,则可以不用写参数。
JavaType:完整java类名或者别名,类型
resultMap:引用外部resultMap,eg:增删改等resultType=“resultMap值”
增加了resultMap的复用
子元素:
Id:一般是数据库的主键,可以提升mybatis性能
Result:property:映射数据库的实体对象的属性名
Column:数据库列名后者别名
分析:如果查询涉及到多表查询,便在associate中设置column数据库属性名,实体类名
注意:可以实现自我调用,只是自己调用同类型resultMap…
Collection
复杂类型集合,一对多
内部嵌套
映射一个嵌套结果集到一个列表
属性
Property:映射数据库列的实体对象的属性
ofType:完整java类名或者别名(集合所包含的类型)
resultMap:引起外部resultMap 注
子元素
Id
Result:property 映射数据库列的实体对象的属性
Column 数据库列名或者别名
主要实现是一对多。Eg:老师类,学生类。查老师对应的学生
Mybatis缓存
一级缓存:基于hashmap本地缓存,作用范围session作用域里,当close都会被清空
二级缓存:
二级缓存的配置:配置全局cache
单独设置缓存
…
动态SQL
基于OGNL表达式
使用动态sql完成多条件查询等逻辑实现
用于实现动态sql的元素主要有
If:简单条件判断
Trim:去除多余的关键字等
Where:用来简化sql语句的where条件
Set:设置解释更新语句
Foreach:迭代集合
choose(when、otherwise)
以上条件都不满足执行Sql语句:如果后面都是使用可以调用
…
理解核心类和接口的作用域和生命周期
掌握SQLSession的两种使用方式…
上课疑问
1.association,collection用法 完成
2.Set,list 完成
主要是为了当查找的时候存在两个条相同对象时
3.Equals方法重写 完成
显示重复查询时,通过重写equals修改判断
4.管理mapper.xml文件一些resultmap都是表示什么含义? 完成
5.Trim具体用法 完成
主要用来删除多余的关键字
Prefix:前缀起始点 prefixOverride:判断删除语句
Spring
背景
企业级应用是指为商业组织大型企业创建并分布部署的解决方案及应用。这些大型企业级应用的结构复杂涉及外部资源众多,事务密集数据规模大,用户数量多,需要较强的安全性考虑和较高的性能要求。
企业级应用绝不可能是一个个的独立系统。在企业中,必办都会部署多个交互的应用,同时这些应用有可能与其他企业的相关应用连接,从而构成一个结构复杂的、跨越internet的分布式企业应用集群。此外,作为企业级应用,不但要有强大的功能,还要能够满足未来业务需求的发展变化,易于扩展和维护。
传统的JavaEE技术
传统的JavaEE技术在解决企业级应用问题时的“重量级”架构体系,使他的开发效率、开发难度和实际性能都令人失望。有人便对传统的JavaEE技术的日益臃肿和低效提出了疑问。当人们苦苦寻找解决办法的时候,SPring以一个“救世主”的形象出现在广大的java程序员面前。
Spring
两个目标:(1)让现有的技术更易使用,(2)养成良好的变成习惯(或则称最佳实践)
一个原则:不重新发明轮子。已经有较好解决方案的领域,Spring绝不做重复性的实现。
Spring框架大约20个功能模块。模块划成6个部分分别为
core container、Data Access/Integration、web、APO、Instrumentation、Test
Spring core是框架的最基础部分,提供了ioc特性。
Spring Context为企业级开发提供了便利的集成工具。
Spring AOP 是基于spring core的符合规范的面向切面编程的实现。
Spring JDBC提供了JDBC的抽象层,简化了JDBC编码,同时使代码更健壮。
Spring ORM对市面上流行的ORM框架提供了支持。
Spring web为spring在web应用程序 中的使用提供了支持。
IOC/DI
背景
目前几乎所有的应用都由两个类或更多的类通过合作来实现完整的功能。类与类之间的依赖关系增加了程序开发的复杂程度,我们在开发一个类的时候,还要考虑对正在使用该类的其他类的影响。程序将不具备优良的可扩展性和可维护性,甚至在开发中难以测试。Eg:常见的业务层调用数据访问层以实现持久化操作。
IOC/DI
控制反转(Inversion of Control)也称为依赖注入(Dependency Injection),是面向对象编程的一种设计理念,用来降低程序代码之间的耦合度。
通俗说法:相对于“控制反转”,“依赖注入”的说法也许更容易理解,即由容器(Spring)负责把组件所“依赖”的具体对象“注入”(赋值)给组件,从而避免组件之间以硬编码的方式耦合在一起。
idea:配置文件
Myeclipse:配合
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
需要的包:
Junit:测试包生成Test
Springframework:为Context包,关于解析配置文件等。…
赋值
使用IOC属性赋值
构造方式注入:
p标签
注解赋值
项目b3具体实现
使用注解赋值
通过bean组件步骤:
1.注解定义bean组件
即:(eg:对实体类属性进行赋值)(dao实现层)
@Component
@Value(“10”)
private Integer id;
//需要加上spring-4.3.18,才能调用到component
@Component(“DaoImpl”)
//此处定义了一个DaoImpl的bean
//作用与xml配置文件编写的等效
2.注解装配bean组件
(使之与测试、调用类发生联系)(service实现层)
方法一
@Autowired
private UUser user;
//通过service标注了一个业务bean
@Service
//使用@Autowired对dao属性注入所依赖的对象,spring将直接对dao属性进行赋值,此类会省略属性相关的setter方法
//Autowired采用按类型匹配的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型想匹配的bean组件,并自动为属性注入
//作用与xml配置文件编写的
<proterty name=”dao” ref=”DaoImpl”
等效,但是此方法ServiceImpl需要写setter方法给dao赋值。
如果存在多个bean组件,可以指定通过此方法。@Qualifier(“DaoImpl”)
@Autowired
@Qualifier(“DaoImpl”)
private DaoImpl dao;
注意:如果使用@Autowired注解进行装配是,如果找不到想匹配的bean组件,Spring容器会抛出异常,此时如果依赖不是必须的,为了避免抛出异常,可以将 required设置为false。即:@Autowired(required=false)
方法二
//@Resource有一个name属性,默认情况下,spring将这个属性的值解释为要注入的bean名称。
@Resource(name = “user”)
private User user1;
//如果没有显示地指定bean名称,@Resource注解将根据字段名或者setter方法名产生默认的名称:如果注解应用于字段
//,将使用字段名作为bean的名称;如果注解应用于setter方法,bean的名称就是通过setter方法得到的属性名
@Resource
private DaoImpl dao1;
@Resource
public void setDao(DaoImpl daoimpl){
this.dao=daoimpl;
}
注意:如果没有显示指定bean的名称,且无法找到与默认bean名称相匹配的bean组件,@Resource注解会由按名称查找的方式自动变为按类型匹配的方式进行装配。
3.加载注解定义的bean组件
在配置文件中添加对Context命名空间的声明,然后用Context命名空间下的component-scan标签扫描注解标注的类。base-package属性指定了需要扫描的基准包(多个包可以用逗号隔开)。Spring会扫描这些包中多有的类,获取bean的定义信息。
作用:扫描包中注解标注的类
<context:component-scan base-package=“com.pojo1”/>
4.通过测试类测试。
方法一:
//测试类中首先第一步读取配置文件,通过getbean方法来获取spring容器中已经定义好的bean组件。即可
ApplicationContext context=new ClassPathXmlApplicationContext(“applicationContext.xml”);
User bean = context.getBean(User.class);
方法二:
以上为具体测试类代码。
使用@resource实现步骤
1.定义bean组件。
2.装配bean组件。
3.加载注解bean组件。
4.测试类。
…
AOP
疑问
1.spring通过集成aspect实现了以注解的方式定义切面???什么含义
背景加粗样式
目前典型的业务处理的方法中,日志、异常处理、事务控制等都是一个健壮的业务逻辑系统所需要的。但为了保证系统健壮可用,就要在众多的业务方法中反复编写类似的代码,使得原来的就变的很复杂的业务处理变得更加复杂。业务功能的开发者还要关注这些“额外”的代码是否正确,是否有遗漏。如果需更改日志信息格式是或者安全验证的规则或则再增加新的辅助功能都是导致业务代码频繁而大量的修改。
AOP是什么及作用?
Spring AOP面向切面编程是软件编程思想发展到一定阶段的产物,是面向对象编程的有益补充。此形式下,在编程人员的感觉就是在原有代码乃至原业务流程都不改变的情况下,直接在业务流程中切入代码,增加新功能,例如日志、异常处理、事务控制等。
ASpect
Aspect是一个面向切面的框架,它扩展了java语言、定义了AOP语法,能够在编译期间提供代码的织入,它提供了一个专门的编译器用来生成遵守字节编码规范的Class文件。…
AOP:插拔式组件体系结构,主要是解决各组件同一个的各模块之间的共性问题。
AOP涉及参数
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象:代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段.
步骤:
1.配置文件,考入文件头。
2.配置文件夹中包扫描。
3.编写advice(增强处理)通知。
4.编写配置文件关于通知的织入。
5…
包扫描
定义bean组件(component)
配置文件中,书写aop:config
…
实现思路
(1)准备工作:导入相关的jar包。
(2)书写一个业务实现。Dao、service、pojo
(3)书写增强处理的类–Advice。
(4)配置文件
①包扫描,定义bean组件
②织入通知,对应的应用,定义切入点,定义通知
方法二
(1)准备工作:导入相关的jar包。
(2)书写一个业务实现。Dao、service、pojo
(3)书写增强处理的类–Advice。
(4)配置文件
包扫描。<context:component-scan base-package=“pack”/>
开启aop注解支持。aop:aspectj-autoproxy/
(5)返回到advice通知中
加入这两步即可。.
区分joinPoint
JoinPoint与proceedingJoinPoint
JoinPoint:获取切入点传入参数的值,可以理解为业务层的user对象。
业务层:
Advice层:
ProcessJoinPoint:获取业务层的返回值,可以理解为拦截。
注:point.proceed()方法是拦截方法,一定要写,不然advice不会改变原来的返回值。
注意只有around才能改变其返回值。因为数据类型是int型,需要返回值,而before,after是void没有返回值。…
Spring与mybatis整合
主要工作就是把mybatis框架使用中涉及的核心组件配置到spring容器中,交给spring来创建和管理。发挥spring框架bean容器的作用,接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系解耦和管理。
分两步:
整合前工作:
1.在项目中加入spring、mybatis及整体相关的jar文件。
2.建立开发目录结构,创建实体类。Pojo
3.创建数据访问接口。Dao
4.配置sql映射文件。Mapper
5.配置mybatis配置文件。Mybatis-config.xml
实现工作:,
1.配置Database数据源。
2.配置SQLSessionFactoryBean。
3.SQLSessionTemplate进行持久化操作。
步骤
1.包扫描,扫描bean组件
2.连接数据库
3.实例化创建SQLSession
4.映射扫描包
5.开启事务管理
注意:事务比较特殊,因为需要DataSource的原因,所以仍然需要在spring的配置文件applicationcontext.xml中定义bean组件+开启事务。
1.方法一
2.方法二
6.Aop设置事务织入通知
aop:config
<aop:pointcut id=”aaaa” expression=”execution()”/>
<aop:advisor advice-ref=”txAdvice” pointcut=”aaa”>
</aop:config>
7.测试
不需要想mybatis框架那样使用getbean方法,获取定义好的bean组件。
…
springMVC
SpringMVC是spring框架中用于web应用开发的一个模型,是spring提供的一个基于MVC设计模型的优秀web开发框架,他本质上相当于servlet。
SpringMVC基础
1、下载所需要jar包
Spring-web-3.2.13.RELEASE.jar:在web应用开发是使用spring框架所需的核心类
Spring-webmvc-3.2.13.RELEASE.jar:springmvc框架的所有类,包含框架的servlets,webmvc框架,以及对控制器和视图的支持。
2、在web.xml中配置servlet
SpringMVC是基于servlet的框架,DispatcherServlet是整个springMVC框架的核心,它负责截获请求并将分配给相应的处理器处理。
DispatcherServlet需要截获并处理该项目的所有URL请求。
3、创建springMVC的配置文件(springMVC.xml)
4、创建control、传参
方式一:继承AbstractController类,重写方法
方式二:自定义
说明:return返回值是拼接了前缀和后缀一起组成的页面。
URL:/WEB-INF/JSP/dologin.jsp
传参: @RequestParam(value=“”,required=true/false)
页面获取model传过来的数据:${名称}
5、创建view、乱码
创建在WEB-INF/jsp的文件夹下
如果是出现乱码,在web.xml中配置
6、部署运行
Tomcat,jdk1.8版本。
访问是通过。Controller中的类RequestMapping的URL地址+类方法的URL地址组合来访问。
Eg:http://localhost:8080/SMVC2_war_exploded/control2/login.html
关闭端口:
netstat -aon|findstr 1099
taskkill -f -pid 查询结果号…
SpringMVC核心
拦截器
Control:正常流程代码实现、
Control:非正常流程代码
拦截器java文件:继承了HandlerInterceptorAdapter接口
Springmvc-servlet.xml配置文件编写
上面可以书写多个拦截器。
注意:path中书写的是自己在网页中写入的网址,当地址为control1/no开头的都需要通过拦截器,而非自己在服务器端将jsp页面归类而创的文件夹。
跳转、重定向
图中:
Return “dologin”:转发,服务器跳转
传输数据用request方式:HttpServletRequest request
Return “redirect:/user/login.html”:重定向,客户端跳转
传输数据用session方式:HttpSession session
注意:两个controller之间的跳转,用重定向才能。
异常处理
局部异常处理
在control中抛出异常:
写一方法处理异常:@ExceptionHandler(value = RuntimeException.class)
全局异常
在control中抛出异常:
在springmvc-servletxml中写入:
…
静态资源文件
在webapp下创建一个专门存放静态资源的包
在springMVC-servlet.xml中编写
访问路径
55
JSON处理
步骤:
1.导入相关jar包。3个
com.fasterxml.jackson.core
jackson-core
2.9.0
com.fasterxml.jackson.core
jackson-databind
2.9.4
com.fasterxml.jackson.core
jackson-annotations
2.9.0
2.书写实体类,继承Converter接口,实体类
实体类中:
@JsonFormat(pattern = “yyyy-MM-dd”)
private Date birth;
3.Springmvc配置文件
<mvc:annotation-driven conversion-service=“myConvert”>
mvc:message-converters
</mvc:message-converters>
</mvc:annotation-driven>
分页显示
思路:
1.导入相关jar包
com.github.pagehelper
pagehelper
5.1.4
2.在mybatis-config.xml中配置
3.Service接口中书写方法
public PageInfo PI(int currentPage,int pageSize) {
//传入当前页、页面容量
PageHelper.startPage(currentPage,pageSize);
//将list保存到PageInfo中
List list=dao.findAll();
PageInfo pg=new PageInfo(list);
return pg;
}
4.控制层(controller)中接收
PageInfo pi = service.PI(currentPage, 3);
List list = pi.getList();
文件上传