mybatis
介绍:
mybatis是一个优秀的持久层框架,是一个实现了JPA的用来连接数据库并对其进行增删改查操作的开源框架,他对JDBC操作数据库的过程进行封装,使开发者只用关注sql本身,不用去关注实现过程。mybatis虽然实现的JPA但是它并不是一个完完全全的ORM组件,而是一个基于sql开发的半自动化的ORM组件。而Hibernate是一个完完全全的ORM的组件,它是完全基于对象来操作数据库中的数据记录。
工作原理:
mybatis应用程序根据xml配置文件创建sqlsessionfactory,sqlsessionfactory在根据配置,配置来源于两个地方,一处是配置文件,一处是java代码中的注解,获取一个sqlsession。sqlsession包含了执行sql所需要的所有方法,可以通过sqlsession实例直接运行映射的sql语句,完成对数据的增删改查和事务的提交等,用完之后关闭sqlsession。
工作流程:
1:通过Reader对象进行读取src目录下的mybatis.xml配置文件
2:通过sqlsessionfactoryBuilder对象创建sqlSessionFactory对象
3:从当前线程获取sqlSession对象
4:事务开始,在mybatis中默认
5:通过sqlSession对象读取xxx.xml映射文件中的操作id,从而读取对应的sql语句
6:事务提交
7:关闭sqlSession,并分开当前下称与sqlSession对象,让GC尽早回收
mybatis的两个概念 JPA,ORM:
ORM:对象关系映射,它是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应的关系,并提供一种机制,通过javabean对象去操作数据库中的数据。
JPA:它是java持久化接口的意思,它是javaee关于ORM思想的一套标准接口,它仅仅时一套接口,不是具体的实现。
mybatis环境搭建:
1:下载jar包并部署,或在pom.xml文件中添加相应的jar包依赖
2:编写配置文件
3:创建实体类
4:创建dao接口
5:创建映射文件
6:在业务逻辑层调用
mybatis的核心api:
sqlsessionfactoryBuilder构建了sqlsessionfacoty
sqlsessionfacoty该对象可以完成配置文件的读取:facory=new sqlsessionfactorybuilder().builder(s);
sqlsession该对象的作用时调用mapper文件进行数据操作:session=factory.opensession;
mybatis核心配置文件,配置信息:
properties:引入database.properties文件
setting:引入log4j日志配置
typeAlises:配置类别名
envirionments:配置运行环境:
1.transactionManager:配置事务管理。
2.datasource:配置数据源
mappers:引入映射文件,告诉mybatis去哪找sql映射文件
sql映射文件:
mapper标签:是映射文件的根元素,只有一个属性namespace,用于区分不同的mapper,时全局唯一的
select标签:id属性:唯一标识符。resulttype:sql语句返回值类型。
resulttype与resultmap:本质相同,都是map数据结构,但不能同时存在
resulttype:直接表示返回类型,包括基本数据类型和复杂数据类型
resultmap:应用场景一般是数据库字段信息与对象属性不一致或者需要做复杂的联合查询,以便自由控制映射结构
association:多对一:员工对应部门
property:属性值 javatype:属性类型
collection:一对多 :部门对应员工
property:属性值 oftype:属性类型
mybatis缓存:
一级缓存:mybatis自带的本地缓存,作用范围为session区域,当session flush 或 close 之后,该session中所有的cache就会被清空。
二级缓存:时全局缓存,它超出了session范围,可以被所有的sqlsession共享,开启它需要在munatis的核心配置文件中的settings中设置即可。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
默认未开启二级缓存,需要手动开启。另外,它的作用域是针对mapper的namespace而言的,即只有在此namespace的查询才能共享cache。
<mapper namespace="com.xx.xxx.xxx.mapper">
<!---cache配置-->
<cache eviction="fifo" flushInterval="60000" size="512" readOnly="true"/>
</mapper>
在Mapper文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache
<select id="getUser" resulttype="User" userCache="true">
mybatis参数传递:
@param注解 四个以上参数,最好封装成对象入参,或使用map
insert,delete,update操作注意:
1:接口方法的返回值均为int类型,表示收影响的行数。
2:均没有resulttype和resultmap属性。
3:insert,update,delete执行成功返回主键id:在xxxMapper.xml的语句标签中设置3个属性
keyProperty:把主键赋值给bean的那一个属性
keycolumn:使用那一列的值来进行赋值
useGeneratedKeys=“true” :使用自增的方式来生成主键值
mybatis中事务处理:
factory.openSession(false)手动提交事务
session.commit();提交事务
session.rollback();回滚事务
mybatis中的动态sql:
if:简单的条件选择
choose(when otherwise):相当于java中的switch,常与when和otherwise搭配使用
where:sql语句中的where条件判断
set:insert操纵中动态更新语句
trim:灵活的去除多余的关键字
foreach:用于迭代集合或数组
批量删除:
delete from user where in (
<foreach collection="userList" item="id" separator="," index="index" open="(" close=")">
#{id}
</foreach>
)
批量添加:
insert into user(id,name) values
<foreach collection="userList" item="user" separator="," open="(" close=")" index="index">
#{id},#{name}
</foreach>
collection:迭代集合或数组的名称
item:迭代条目的标识
separator:迭代时指定符号分割
open:表示语句以什么开始
close:表示语句以什么结束
index:表示每次迭代的位置
mybatis的优缺点和使用场合:
优点:
与jdbc相比,减少了50%以上的代码量
mybatis相当灵活,不会对程序或数据库设计产生影响,sql写在xml里,从程序代码中彻底分离,降低耦合度,方便统一管理,可重用性高
提供的xml标签,所以支持编写动态sql语句
提供了映射标签,所以支持对象与数据库表的orm字段映射关系
缺点:
sql语句的编写工作量大,对开发人员编写sqlyu语句有一定的要求
sql语句依赖于数据库,导致数据库的移植性差,不能随意更换数据库
使用场景:
mybatis专注于sql本身,是一个非常灵活的解决方案
对性能要求很高的项目,或者需求变换频繁的项目,如一些大型的互联网项目,mybatis将是一个不错的选择
spring
介绍
spring是一个轻量级的开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许你选择使用那一个组件,同时为j2ee应用程序开发提供集成的框架。被称为javaee的春天,spring框架的初衷是使的现有的更加实用,spring不是创造轮子,而是使现有的轮子更好的运转,spring本身就是一个大杂烩,整合了现有的框架技术。spring是一个轻量级,非侵入式,一站式,模块化的解决方案。其主要核心是控制反转ioc和面向切面aop。